به فصل جدید خوش آمده اید. در فصل قبل با عملیات CRUD و متدهای آن آشنا شدیم و حالا که پایه بحث را درک کرده اید باید با مسائلی مانند ساختار دادن به پایگاه های داده، برقراری رابطه بین داده ها، اعتبارسنجی رابطه ها و غیره روبرو شویم.
قبل از شروع بحث دوست دارم در مورد مسئله ای توضیح بدهم. ما در هر فصل از این سری آموزشی با یک پایگاه داده صفر شروع می کنیم. اگر شما هم دوست دارید مانند من پیش بیایید، می توانید با اجرای دستور dropDatabase آن را کاملا حذف کنید. به طور مثال اگر بخواهیم پایگاه داده flights را از بین ببریم اول می گوییم:
use flights
با این کار وارد این پایگاه داده می شویم. سپس می گوییم:
db.dropDatabase()
با این کار کل پایگاه داده (به همراه تمام collection ها و document ها) حذف می شود. در ضمن حالا که بحث حذف کردن پیش آمده است، باید بگویم دستور ()drop برای حذف collection ها است. مثلا:
db.flightData.drop()
schema به معنی طرح و ساختار است اما مگر نگفتیم که MongoDB یک پایگاه داده schema-ess (بدون schema) می باشد؟ بله MongoDB برخلاف MySQL هیچکس را مجبور به تعریف ساختار اولیه نمی کند و شما می توانید در collection های خود انواع و اقسام داده ها و ساختار ها را داشته باشید. بگذارید به شما نشان دهم.
همانطور که گفتم من پایگاه داده قبلی را حذف کرده ام، بنابراین دستور زیر را اجرا می کنم تا پایگاه داده جدیدی به نام shop ایجاد بشود:
use shop
سپس یک داده ساده در collection ای به نام products وارد می کنم. قبلا هم گفتیم که این collection با اجرای دستور زیر به صورت اتوماتیک ساخته می شود:
db.products.insertOne({name: "A book", price: 12.99})
منظور من از نداشتن schema این است که می توانیم دستور زیر را اجرا کنیم و خطایی نمی گیریم:
db.products.insertOne({title: "T-Shirt", seller: {name: "Amir", age: 24}})
همانطور که می بینید این document کاملا با document قبلی متفاوت است. ما در پایگاه های داده MySQL اجازه نداریم چنین کاری انجام بدهیم. شما می توانید با دستور زیر تمام products را مشاهده کنید:
db.products.find().pretty()
خروجی:
"_id" : ObjectId("5e84e019a0cee07be12589af"), "name" : "A book", "price" : 12.99 } "_id" : ObjectId("5e84e0cca0cee07be12589b0"), "title" : "T-Shirt", "seller" : { "name" : "Amir", "age" : 24 } }
همانطور که مشاهده می کنید، این دو document با آنکه در یک collection هستند اما زمین تا آسمان با هم تفاوت دارند. به همین دلیل می گوییم پایگاه داده MongoDB هیچ schema یا ساختار مشخصی ندارد. با این حساب چرا از ساختن schema صحبت کرده ایم؟
همانطور که گفتم schema در لغت به معنی «طرح» بوده و با Structure (ساختار) هم معنی است. در اکثر برنامه های واقعی (وب سایت ها و غیره) باید شکلی حداقلی از داده ها داشته باشیم تا داده ها به طور منظم ثبت شده و بتوانیم با آن ها تعامل کنیم. مثلا اگر یک فروشگاه اینترنتی داریم، حتما کالا های ما قیمت دارند، حتما نام و مشخصات دارند، بنابراین فیلد قیمت، نام، مشخصات و غیره در تمام document های محصولات موجود است. این به خودی خود یک ساختار ثابت محسوب می شود. بنابراین چه بخواهید چه نخواهید، بالاخره نوعی ساختار به صورت خودکار برایتان به وجود می آید.
در واقع فاصله بین دنیای MySQL و دنیای MongoDB یک طیف است نه «آری یا خیر». در تصویر بالا مشاهده می کنید که نحوه ذخیره سازی داده ها می تواند از chaos (هرج و مرج) به MySQL برود! Chaos یعنی حالتی که داده ها هیچ منطق و ساختار منسجمی ندارند و دنیای MySQL هم دنیایی است که هیچ داده ای نمی تواند دست از پا خطا کند، تمام ساختار ها از قبل تعریف شده اند و انعطاف پذیری در قبول کردن نوع داده اصلا معنی ندارد. در همین تصویر انواع کد ها را مشاهده می کنید:
در دنیای واقعی شما یا حالت میانه را می بینید یا در دنیای MySQL هستید چرا که در کار های بزرگ و پروژه های واقعی در تمام اجزاء سیستم نیاز به نظم داریم و هیچکس یا هیچ شرکتی نمی تواند در هرج و مرج کامل به صورت بهینه فعالیت کرده و موفق شود. حالت میانه و استفاده از پایگاه های داده ای مانند MongoDB در سال های اخیر به شدت پیشرفت داشته و محبوب شده است چرا که هم انعطاف حالت میانه را به شما می دهد و هم انسجام و نظم دنیای MySQL را در داده هایتان خواهید داشت.
البته در مورد تصویر بالا باید توضیحی بدهم. اگر با MySQL کار کرده باشید می دانید که می توانیم در یک ردیف (معادل collection) داده های اضافی نسبت به ردیف های دیگر داشته باشیم. مسئله اینجاست که در MongoDB هر فیلدی که داده نداشته باشد را کلا حذف می کنیم اما در MySQL باید این مسئله را پیش بینی کنید. مثلا اگر فکر می کنید فیلد «نام خانوادگی» در وب سایت شما اختیاری است، باید ستون آن در MySQL را طوری تعریف کنید که مقدار Null بگیرد. بنابراین در MongoDB نیازی به پیش بینی نیست و داده های بی استفاده کاملا حذف می شوند اما در MySQL جای آن ها خالی می ماند.
در قسمت بعدی برای اسناد خود یک ساختار معین را تعریف می کنیم.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.