به نام دانای بر حق
مقدمه
فک کنم در حدود سه سال پیش بود در مورد مدل کاردینالیتی در دیتبایس های sql base صحبت کردیم در این مبحث که بازخورد خوبی داشت ، اما به قول صادق دیتابیس های اسکیوالی توسط ریاضی دانان طراحی شده و دیتابیس های nosql توسط برنامه نویسان، به شخصه از موقعی که با no-sql آشنا شدم حالم از دیتابیس های کلاسیک بهم میخوره و ولی به موقع دقیق تر و قشنگ تر در مورد no-sql ها من یا سایر x های 4xmen صحبت میکنیم و اما یکی از بحث هایی که در پایگاه داده ها مطرح هستش ارتباط هستش این ارتباط گاهی به صورت پدر و فرزندی یا مادر فرزندی میباشد به عکس زیر نگاه کنین تا بریم در مورد بحث صحبت کنیم:
در این مبحث فرض شده است شما با دیتابیس های کلاسیک و nosql آشنایی لازم و کافی را دارید
مقایسه و توضیحات
این مدل مدلی درختی میباشد در اصطلاح یا tree model در برنامه نویسی شما در تصویر بالا یک head به نام book میبینید و زیر مجموعه programming را داراست در زیر مجموعه آن Databases , Languages می باشد و …
حال اگر این رو میخواستیم در دیتابیس های sql base طراحی کنیم بایستی جدولی به شکل زیر طراحی میکردیم با یک فیلد پرنت که در آن head را با ۰ نشان میدادی و فرزندان رو با id parent در این فیلد مشخص می کردیم به جدول زیر توجه کنین:
ID | title | PranentID |
---|---|---|
۱ | Books | ۰ |
۲ | Programming | ۱ |
۳ | Languages | ۲ |
۴ | Databases | ۲ |
۵ | dbm | ۴ |
۶ | MongoDB | ۴ |
همه چیز کاملا واضح است و حالانمایش در حالت modren:
[ { "_id": "Books", "ancestors": [], "parent": null }, { "_id": "Programming", "ancestors": [ "Books" ], "parent": "Books" }, { "_id": "Languages", "ancestors": [ "Books", "Programming" ], "parent": "Programming" }, { "_id": "Databases", "ancestors": [ "Books", "Programming" ], "parent": "Programming" }, { "_id": "dbm", "ancestors": [ "Books", "Programming", "Databases" ], "parent": "Databases" }, { "_id": "MongoDB", "ancestors": [ "Books", "Programming", "Databases" ], "parent": "Databases" } ]
پیاده سازی این مدل درختی در دیتابیس
nosql خیلی ساده تر و جالب تر است و باز خوانیشون خیلی ساده اس به دستورات زیر توجه کنید برای ورود این اطلاعات:
db.categories.insert( { _id: "MongoDB", children: [] } ) db.categories.insert( { _id: "dbm", children: [] } ) db.categories.insert( { _id: "Databases", children: [ "MongoDB", "dbm" ] } ) db.categories.insert( { _id: "Languages", children: [] } ) db.categories.insert( { _id: "Programming", children: [ "Databases", "Languages" ] } ) db.categories.insert( { _id: "Books", children: [ "Programming" ] } )
خب ما در کلاکشن categories میایم مقادیر رو به شکل بالا وارد میکنیم یعنی id میشود title و در هر ورود ما children های زیر مجموعه رو مشخص میکنیم در اینجا ترتیب به اون صورتی که در دیبتایس کلاسیک هست نمیباشد میتونین با توجه ببنید.
اما در این روش ما برعکس هم داریم قطعه کد زیر نیز میتونه جایگزین کد بالا باشه:
db.categories.insert( { _id: "MongoDB", parent: "Databases" } ) db.categories.insert( { _id: "dbm", parent: "Databases" } ) db.categories.insert( { _id: "Databases", parent: "Programming" } ) db.categories.insert( { _id: "Languages", parent: "Programming" } ) db.categories.insert( { _id: "Programming", parent: "Books" } ) db.categories.insert( { _id: "Books", parent: null } )
اما بازیابی جالب و ساده این مدل:
پیدا کردن فرزندان یک دسته:
db.categories.findOne( { _id: "Databases" } ).children
پیدا کردن والد یا پدر:
db.categories.find( { children: "MongoDB" } ) یا db.categories.findOne( { _id: "MongoDB" } ).parent
خب حالا شما میتونید برای افزایش سرعت شاخص (ایندکس) گذاری هم کنید که به شکل زیر هستش:
db.categories.createIndex( { children: 1 } )
یا index گذاشت برای والد ها:
db.categories.createIndex( { parent: 1 } )
حالا قسمت جالب داستان شما میخواهین تمامی اجداد یک دسته رو پیدا کنین به سادگی زیر میتونین این کار رو انجام بدین:
db.categories.findOne( { _id: "MongoDB" } ).ancestors
پیدا کردن زادگان یا نوادگان یک دسته:
db.categories.find( { ancestors: "Programming" } )
اکنون آیا شما هنوز هم به دیتابیس های کلاسیک علاقه دارید با این اوصاف؟
دیدگاهتان را بنویسید لغو پاسخ