برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

مدل درختی ( والد فرزندی) در دیتابیس های no-sql مثل mongodb

به نام دانای بر حق

مقدمه

فک کنم در حدود سه سال پیش بود در مورد مدل کاردینالیتی در دیتبایس های 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" } )

 

اکنون آیا شما هنوز هم به دیتابیس های کلاسیک علاقه دارید با این اوصاف؟


انتشار

در

توسط

برچسب‌ها:

نظرات

یک پاسخ به “مدل درختی ( والد فرزندی) در دیتابیس های no-sql مثل mongodb”
  1. ehsan نیم‌رخ
    ehsan

    سلام من طبق مثال فوق عمل میکنم اما مروگر همینطور می مونه منتظر پاسخ و هیچی توی دیتابیس نمیره!

    یه سوالی که برام پیش اومد مگه _id از نوع آبجکت نیست پس چطوریه که ما بهش باید string بدیم؟

    مثلا:

    db.categories.insert( { _id: “Books”, parent: null } )

    جواب رو ایمیل بفرمایید ممنون

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *