یک پایگاه داده کاملاً مدیریت شده و NOSQL که توسط AWS ارائه شده است
🔸 پشتیبانی از دو ساختار:
key - value
wide column
🔸 مقیاس پذیری (Scale) بدون کاهش عملکرد
مهم نیست دیتای شما یک مگابایت باشه، ده گیگابایت یا حتی ده گیگابایت، دیتای شما در چند میلی ثانیه آماده میشه.
🔸 مدل هایی بر پایه http
مثل یک api به این دیتابیس وصل بشید و با دیتابیس و دیتاهاتون کار کنید.
🔸 پنل های قیمتی منعطف
۲۵ گیگ فضای رایگان!
🔸 رهگیری تغییرات با قابلیت Stream
این ویژگی به شما این امکان رو میده که دیتابیس بتونه با شما ارتباط داشته باشه و تغییرات دیتا (Add-Edit-Delete) رو به اطلاع شما برسونه.
🔸 پشتیبانی از IAM
🔸 وقتی کاربر های خیلی خیلی زیاد دارید و نیاز به scale زیادی دارید.
🔸 وقتی میخواید با ابزار هایی مثل AWS AppSync و یا AWS Lambda کار کنید. (سازگاری بالا با این ابزار ها)
🔸 وقتی ساختار دیتابیستون ساده است!
🔸 وقتی نیاز به کش کردن اطلاعات دارید! (نه به خوبیه redis ولی اگه نمیخواین ردیس راه اندازی کنید تا حد زیادی کارتون رو راه میندازه)
🔸 وقتی میخواید اپی با ساختار OLTP بسازید!
معمولا برنامه نویس ها بخاطر تجربه و ذهنیتی که نسبت به دیتابیس های رابطه ای دارن در برابر مهاجرت به DynamoDB مقاومت میکنن ولی دو برتری که DynamoDB در مقایسه با دیتابیس های رابطه ای داره یکی قابلیت اسکیل پذیری عالی اونه و مورد بعد پشتیبانی خیلی خوب از سرویس های ServerLess هست.
🔸 کلید اصلی ساده یا Simple Primary Key
مشابه Key در هش تیبل!
🔸 کلید اضلی ترکیبی یا Composite Primary Key
مشابه Simple Primary Key ولی با دو Key. به Key اول Partition Key و به Key دوم Sort Key گفته میشه.
برای مثال Key ما در مرحله اول اسم بازیگر و در مرحله دوم فیلم های بازیگر هست.
بطور مشخص یک بازیگر میتونه چندین فیلم داشته باشه ولی مجموع همه ابجکت های مربوط به اون بازیگر یک Item Collection هستن.
پ.ن: یکی از کاربرد های Item Collection برای پیاده سازی مفهوم Relation هست.
🔸 تیبل یا Tabel: مشابه Tabel دیتابیس های رابطه ای، یک تیبل شامل یک سری دیتا با محوریت مشخص هست.
🔸 آیتم یا Item: مشابه row در دیتابیس های رابطه ای (با این تفاوت که شامل بخش Key هم هست)
🔸 کلید اصلی یا Primary Key: کلید پیدا کردن یک ابجکت (مشابه Key در هش تیبل)
🔸 ویژگی ها یا Attributes: در واقع همون ستون ها در جداول رابطه ای با این تفاوت که هر Item میتونه Attributes های مختلفی داشته باشه
🔸 قابلیت Streams
همونطور که قبلا گفته شد این ویژگی به شما این امکان رو میده که دیتابیس بتونه با شما ارتباط داشته باشه و تغییرات دیتا ( Add-Edit-Delete) رو به اطلاع شما برسونه.
این قابلیت خیلی در میکروسرویس ها، لاگ گیری و آنالیز کردن دیتا و Aggregations کاربردی هست.
🔸 طول عمر یا TTL (Time To Live)
این ویژگی به شما امکان تنظیم تاریخ انقضا به ابجکت رو میده.
🔸 پارتیشن یا Partition
دیتای شما میتونه در چند فضای مختلف ذخیره سازی بشه که به اون فضا ها Partition گفته میشه.
بزارید با یک یک مثال بهتر کاربردشون رو متوجه بشیم ... وقتی ما سه پارتیشن داریم و یک دیتای جدید قصد داریم ثبت کنیم دیتابیس سعی میکنه با اون Key یک هش بسازه و بفهمه که دیتای ما باید توی کدوم پارتیشن ثبت بشه و دیتارو در اون بخش ثبت میکنه. همونطور که گفتیم اسکیل پذیری جزء ويژگی های اصلی این دیتابیسه و یکی از روش های اسکیل این دیتابیس، افزایش تعداد پارتیشن هاست. هر لحظه که دیتابیس حجم دیتاش زیاد بشه، تعداد پارتیشن ها بیشتر میشن :) به همین راحتی
🔸 ثبات اطلاعات یا Consistency
این دیتابیس از دیتای هر پارتیشن شما دو کپی میگیره تا بتونه دسترسی پذیری و ثبات بیشتری داشته باشه.
بدین صورت که وقتی دیتایی ثبت یا تغییر میدین. اون دیتا بصورت Async به نود بعدی منتقل میشه و اون نود وقتی دیتارو گرفت بصورت Async اون دیتارو به نود بعدی منتقل میکنه و اینطوری ما سه تا نسخه یکسان از یک دیتا داریم.
پ.ن: بطور پیش فرض دیتابیس سعی میکنه در پایان عملیات ها دیتای هر سه نود یکسان باشه یعنی دیتابیس روی حالت (Eventual consistency) هست و این مساله ممکنه باعث بشه در چند میلی ثانیه بعد از درخواست تغییر، دیتایی که خونده میشه، دیتای به روزی نباشه. اگه میخواید قطعا دیتاتون دیتای درستی باشه، باید دیتابیستون رو روی حالت Strong consistency بزارین!
🔸 حداکثر سایز هر آیتم میتونه 400KB باشه!
گفته میشه آمازون سعی داشته روند خوندن رو با این مساله سریعتر بکنه و شمارو ترغیب کنه:
- دیتارو به بخش های کوچیک تر بشکنین
- از آیتم کالکشن استفاده کنین
- از S3 برای ذخیرهسازی فایل ها و عکس هاتون استفاده کنین!!
🔸 حداکثر حجم درخواست های Query و Scan میتونه 1MB باشه!
🔸 توان عملیاتی هر پارتیشن. 3000 خواندن در ثانیه و یا 1000 عملیات ثبت ویا ویرایش در ثانیه
🔸 هر Item Collection میتونه نهایتا 10GB دیتا داشته باشه!
اگه با دیتابیس های رابطه و زبان SQL اشنایی داشته باشید روش خوندن اطلاعات به این صورت هست:
SELECT *
FROM users
WHERE users.username = 'alexdebrie';
شما باید یک کوئری بنویسید و دیتابیس سعی میکنه اون رو بفهمه ولی Dynamodb یک جورایی مثل ORM یا API کار میکنه
به این مثال استفاده از DynamoDB در پایتون نگاه کنید:
import boto3
client = boto3.client('dynamodb')
user = client.get_item(
TableName='AAATabel ',
Key={
'PK': {'S': 'XXXX'},
'SK': {'S': 'YYYY'}
}
)
فکر کنم نیاز به توضیح نداره ولی یک توضیح مختصر میدم
توی خط اول boto3 که یک SDK برای اتصال به آمازون هست رو اینپورت کردیم(در آینده نحوه نصب و استفاده از DynamoDB رو در JS و Python توضیح میدم ولی فعلا مقصود آشنا شدن با مفاهیمه :) )
توی خط بعدی گفتیم از ابزار DynamoDB میخوایم استفاده کنیم.
و در نهایت با متود get_item و دادن اسم جدول و کلیدی که دنبالش هستیم، ابجکتمون رو پیدا کردیم.
- Item-based actions
- Query
- Scan
این نوع API شامل چهار متود آشنا میشه:
۱- GetItem (برای خواندن)
۲- PutItem (برای ثبت)
۳- UpdateItem (برای تغییر)
۴- DeleteItem (برای حذف)
در هر چهار متود مقدار Key یک داده اجباری هست و باید حتما ارسال بشه!
بیاید با همون مثال بازیگر و فیلم پیش بریم پس توی این دیتابیس Actor همون Partition Key هست و Movie هم Sort Key هست.
import boto3
client = boto3.client('dynamodb')
resp = client.put_item(
TableName='MovieRoles',
Item={
'Actor': {'S': 'Tom Hanks'},
'Movie': {'S': 'Toy Story'},
'Role': {'S': 'Woody'},
'Year': {'N': '1995'},
'Genre': {'S': "Children's"},
}
)
resp = client.get_item(
TableName='MovieRoles',
Key={
'Actor': {'S': 'Tom Hanks'},
'Movie': {'S': 'Toy Story'}
},
ConsistentRead=True
)
از این تابع برای خوندن چند آیتم با Partition Key یکسان استفاده میشه.
پ.ن۱: میتونید برای sort key هم شرط بزارید.
پ.ن۲: حتما باید Partition Key رو بدید و Sort Key اختیاریه.
برای مثال توی کد پایین بخش نام بازیگر اجباری و بخش فیلم اختیاری هست:
import boto3
client = boto3.client(' dynamodb')
resp = client.query(
TableName='MovieRoles',
KeyConditionExpression="Actor = 'Tom Hanks' AND Movie BETWEEN 'A' AND 'M'",
)
پ.ن: همونطور که واضحه اگه توی پروژه شما مثلا نیاز بود برای یک فیلم خاص بازیگر هارو لیست کنید، بهتر بود که Movie به عنوان Partition Key انتخاب میشد.
از این تابع برای خوندن همه آیتم های یک جدول استفاده میشه.
سه جا میتونید از Scan استفاده کنید:
۱- جدول شما خیلی کوچیکه و میخواید همه آیتم هارو بخونید.
۲- میخواید از جدولتون برای ETL استفاده کنید.
۳- برای موقعیت های محدودی که در آینده بیشتر توضیح میدم!
به همین راحتی:
import boto3
client = boto3.client('dynamodb')
resp = client.scan(
TableName='MovieRoles',
)
هونطور که قبل تر گفتم پارتیشن یک روش برای تقسیم کردن دیتا های بزرگه و پیدا کردن نود یک پارتیشن O(1) هست.
دسترسی به Sort Key با توجه به اینکه به ترتیب UTF8 مرتب میشه و میتونیم از B-Tree Search استفاده کنیم O(log n) هست.
این محدودیت باعث میشه که پرفورمنس بهتری داشته باشیم :)