ساختاردهی به پایگاه داده + انواع داده در MongoDB

Database Structuring + Data Types in MongoDB

06 بهمن 1400
درسنامه درس 12 از سری دوره جامع آموزش MongoDB
MongoDB: ساختار دهی به پایگاه داده + انواع داده (قسمت 12)

ساختاردهی به پایگاه داده

در قسمت قبل به شما توضیح دادم که معنی ساختار دادن به پایگاه های داده ای مانند MongoDB چیست. در این قسمت باید به سراغ برخی از مباحث عملی برویم. برای شروع دستور زیر را در Shell اجرای می کنیم:

db.products.deleteMany({})

با این کار داده های قبلی از products حذف می شوند تا یک شروع دوباره داشته باشیم. ما در قسمت قبل سه حالت کلی را برای ذخیره داده در نظر گرفتیم:

  • داده ها بدون ساختار منطقی بوده و کاملا با هم تفاوت دارند (هرج و مرج کامل)
  • داده ها تا حد قابل قبولی دارای ساختار منسجم هستند اما تفاوت های کوچکی نیز با هم دارند؛ به طور مثال برخی از آن ها خصوصیت بیشتری گرفته اند (حالت میانه)
  • داده ها طبق ساختاری دقیق، انعطاف ناپذیر و از پیش تعریف شده دریافت و ذخیره می شوند و هر نوع تغییری در این ساختار باعث خطا خواهد شد (دنیای MySQL)

من می خواهم در این جلسه دو حالت واقعی و کاربردی را بررسی کنم؛ کاملا ساختار یافته (امثال MySQL) و نیمه ساختار یافته (امثال MongoDB). بیایید در عمل نگاهی به این دو ساختار بیندازیم.

db.products.insertOne({name: "A book", price: 12.99})

با اجرای این کد، document آن در products ایجاد می شود. سپس:

db.products.insertOne({name: "A T-Shirt", price: 20.99})

حالا اگر با دستور find.pretty از آن ها خروجی بگیریم، داده هایمان را می بینیم:

        "_id" : ObjectId("5e8553ffa6a97e5e05dd3cfa"),
        "name" : "A book",
        "price" : 12.99
}

        "_id" : ObjectId("5e855476a6a97e5e05dd3cfb"),
        "name" : "A T-Shirt",
        "price" : 20.99
}

این یک مثال خوب از دنیای MySQL است. فیلد ها (چه نام و چه تعدادشان) کاملا ثابت است و تنها مقدار آن ها تغییر می کند. حالا فرض کنید محصول دیگری را نیز داشته باشیم:

db.products.insertOne({name: "A Computer", price: 1299, details: {cpu: "Intel i7 8770"}})

همانطور که می بینید این document فیلدی به نام details (جزئیات) دارد. فرض کنید در فروشگاه ما، فقط برخی از محصولات (مثل کامپیوترها) دارای فیلد details هستند. با اضافه کردن این document به products، وارد دنیای MongoDB می شویم. انجام چنین کاری در MySQL ممکن نیست مگر اینکه فیلد details را برای همه تعریف کنیم و آن هایی که details ندارند، مقدارشان null باشد. یعنی اگر بخواهم دقیقا حالت MySQL را در MongoDB پیاده کنم باید بگویم:

db.products.insertOne({name: "A book", price: 12.99, details: null})

حالا با اجرای find.pretty از آن خروجی می گیریم:

  "_id" : ObjectId("5e855780a6a97e5e05dd3cfd"),
        "name" : "A book",
        "price" : 12.99,
        "details" : null
}

null مقدار خاصی است که می گوید هیچ مقداری وجود ندارد. اگر تمام ردیف های خود را بدین شکل تعریف کنید تا همه فیلد ها یکی باشد از یک ساختار شبیه به ساختار MySQL استفاده کرده اید بنابراین ساختار دهی در پایگاه داده MongoDB دقیقا همین است.

انواع داده (data type ها)

نوع داده یا data type یعنی داده ما چه جنسی دارد. ما می توانیم انواع داده های مختلفی را در MongoDB داشته باشیم که تمام آن ها را در تصویر زیر برایتان آورده ام:

انواع داده در پایگاه داده ی MongoDB
انواع داده در پایگاه داده MongoDB

اولین نوع داده text یا متن است که تا به حال ده ها بار از آن استفاده کرده ایم. این نوع داده با علامت double quotation (همان "") مشخص می شود. نوع داده بعدی Boolean است که یا true یا false هستند. نوع داده بعدی اعداد (numbers) هستند که خودشان به چند دسته تقسیم می شوند:

  • integer (اعداد صحیح) که تا 32 بیت طول دارند. هر مقداری که از 32 بیت طولانی تر شود در دسته دیگری از اعداد قرار می گیرد.
  • NumberLong که تا 64 بیت طول دارند.
  • NumberDecimal که decimal هستند، یعنی Float (اعشاری) با دقت بسیار بالا. قسمت اعشارِ اعداد اعشاری ساده (اعداد اعشاری ساده Float یا double خوانده می شوند)، در محاسبات به بالا یا پایین گِرد می شود بنابراین خیلی دقیق نیستند. توجه داشته باشید که منظور من از گِرد شدن این نیست که 12.9 به 13 تبدیل می شود بلکه مثلا 12.9111111111111111111 به 12.9 تبدیل می شود. البته در اکثر اوقات این مسئله مشکلی ندارد، مثلا برای فروشگاه آنلاین و قیمت ها همین مقدار کافی است اما اگر می خواهید محاسبات علمی انجام بدهید باید حتما با decimal کار کنید چرا که تا 32 عدد اعشار را دقیق محاسبه می کند.

طبیعتا هر چه عدد انتخابی شما بزرگ تر باشد، مقدار حافظه ای که برای نگهداری آن لازم است، بیشتر خواهد شد.

نکته: درون Shell اعداد، float (اعشاری) هستند چرا که shell بر اساس جاوا اسکریپت است و جاوا اسکریپت بین integer و float تفاوتی قائل نیست. بنابراین همه اعداد به صورت 64 بیت در shell ذخیره می شود.

نوع داده دیگر ما ObjectId است که با ها آن را دیده ایم. این نوع داده در واقع یک رشته یکتا می سازد اما تفاوت اینجاست که این رشته های یکتا بر اساس زمان (timestamp) ساخته می شوند بنابراین اگر یک document را بعد از document دیگری بنویسید، رشته طوری تعریف می شود که ترتیب آن ها مشخص باشد. مثلا اولی afslh3095nldvlihds49a و دومی afslh3095nldvlihds49b خواهد بود (حرف b در الفبای انگلیسی بعد از b می آید).

نوع داده بعدی، ISODate است که مخصوص ذخیره تاریخ می باشد. البته نوعی از داده نیز بر اساس این نوع داده ساخته می شود که timestamp است. در نهایت دو نوع داده آخر embedded document ها و array ها (آرایه) هستند. این یک مرور کلی بر انواع داده در MongoDB بود. در قسمت های بعد و همینطور فصل های بعد به صورت تدریجی با این موارد کار خواهیم کرد تا به طور عملی متوجه آن ها و تفاوت هایشان بشوید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری دوره جامع آموزش MongoDB توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مقالات مرتبط
آخرین سوالات کاربران
5451218 در 3 سال قبل پرسیده:
ما را دنبال کنید
اینستاگرام روکسو تلگرام روکسو ایمیل و خبرنامه روکسو