در این قسمت از سری آموزش رایگان MongoDB که از وب سایت پرووید به شما تقدیم می گردد در رابطه با رابطه ها و یا ریلیشن شیپ ها صحبت خواهیم کرد.
در دیتابیس هایی که با سیستم های RDBMS کار می کنند، روابط و یا relationship ها بین جداول به صورت یک به یک، یک به چند و یا چند به چند تعریف می شوند؛ ضمناً کلمات انگلیسی مربوط به این نوع از رابطه ها نیز به ترتیب one-to-one و one-to-many و many-to-many هستند که توصیه میکنیم آنها را نیز در ذهن بسپارید.
در MongoDB، رابطه های one-to-one و one-to-many و many-to-many می توانند به دو صورت پیاده سازی بشوند. یکی از این روش ها استفاده کردن از داکیومنت های تودرتو و یا embedded document ها و روش دیگر استفاده کردن از reference مربوط به داکیومنت ها در یک کالکشن دیگر می باشد.
همان طور که گفتیم یکی از روشهای پیاده سازی رابطه ها در MongoDB استفاده کردن از داکیومنت های تودرتو و یا embedded document می باشد. برای مثال، فرض کنید که می خواهید یک آدرس را به عنوان embedded document در قالب یک رابطه تعریف کنید؛ این موضوع در قسمت زیر نشان داده شده است.
db.employee.insertOne({
_id: ObjectId("32521df3f4948bd2f54218"),
firstName: "John",
lastName: "King",
email: "john.king@abc.com",
salary: "33000",
DoB: new Date('Mar 24, 2011'),
address: {
street:"Upper Street",
house:"No 1",
city:"New York",
country:"USA"
}
})
روشی دیگر برای پیاده سازی رابطه ها استفاده کردن از reference مربوط به فیلد کلید اصلی و یا primary key مربوط به داکیومنت های موجود در یک کالکشن دیگر می باشد.
برای مثال، یک کالکشن به نام address ایجاد کرده و از _id به عنوان یک reference مربوط به یک داکیومنت که در یک کالکشن دیگر به نام employee می باشد، استفاده می کنیم؛ این موضوع در قسمت زیر نشان داده شده است.
db.address.insertOne({
_id: 101,
street:"Upper Street",
house:"No 1",
city:"New York",
country:"USA"
})
db.employee.insertOne({
firstName: "John",
lastName: "King",
email: "john.king@abc.com",
salary: "33000",
DoB: new Date('Mar 24, 2011'),
address: 101
})
در مثال بالا رابطه بین دو کالکشن با نامهای employee و ادرس address با استفاده از آیدی به عنوان یک reference مورد استفاده قرار گرفته است پیاده سازی گردیده است یک داکیومنت در employee شامل فیلد آدرس است که یک مقدار برای _id از قبل موجود در کالکشن address دارد. این موضوع باعث ایجاد شدن یک رابطه از نوع یک به یک و یا one-to-one می شود.
دقت کنید که شما می توانید برای پیاده سازی رابطه ها از reference های هر فیلد خاصی استفاده کنید، اما توصیه ای که اساساً اتفاق می افتد این است که از فیلد کلید اصلی منحصر به فرد و یا unique به منظور جلوگیری کردن از خطاهای مربوط به ایجاد شدن رابطه ها استفاده نمایید.
داده های مرتبط و یا دیتا related data را می توانیم در دو مرحله بازیابی کنیم. برای مثال، کد زیر نحوه بازیابی کردن آدرس مربوط به یک این پلویی را نشان می دهد.
var addrId = db.employee.findOne({firstName:'John'}).address;
db.address.findOne({_id:addrId});
در مثال بالا، فیلد addrId که مربوط به یک employee است به دسترسی قرار گرفته و سپس داکیومنت مربوط به address با استفاده از همین addrId بازیابی شده است. می توان از خط لوله تجمیع و یا aggregation pipeline stage نیز استفاده کرد. این موضوع کمک می کند تا بتوانید related دیتاها و یا داده های مرتبط را از درون کالکشن با استفاده از روش زیر بازیابی کنید.
db.employee.aggregate([{$lookup:{from:'address',localField:'address',foreignField:"_id",as:'addr'}}])
خروجی این کد شبیه به قسمت زیر خواهد بود.
[
{
_id: ObjectId("617a75c013dceca5c350d52f"),
firstName: 'John',
lastName: 'King',
email: 'john.king@abc.com',
salary: '33000',
DoB: ISODate("2011-03-23T18:30:00.000Z"),
address: 101,
addr: [
{
_id: 101,
street: 'Upper Street',
house: 'No 1',
city: 'New York',
country: 'USA'
}
]
}
]
به همین شکل امکان پیاده سازی روابط یک به چند و چند به چند نیز وجود دارد.
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام