MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB Връзка едно към много

Проблемът е, че прекомерно нормализирате данните си. Поръчката се дефинира от клиент, който живее на определено място в дадения момент от време, плаща определена цена, валидна към момента на поръчката (която може силно да се промени през целия живот на приложението и която все пак трябва да документирате и няколко други параметри, които всички са валидни само в определен момент от време . Така че документирайте поръчка (игра на думи), трябва да запазите всички данни за този определен момент от време. Нека ви дам пример:

{ _id: "order123456789",
  date: ISODate("2014-08-01T16:25:00.141Z"),
  customer: ObjectId("53fb38f0040980c9960ee270"),
  items:[ ObjectId("53fb3940040980c9960ee271"),
          ObjectId("53fb3940040980c9960ee272"),
          ObjectId("53fb3940040980c9960ee273")
         ],
 Total:400
 }

Сега, стига нито клиентът, нито детайлите на артикулите да се променят, вие можете да възпроизведете къде е изпратена тази поръчка, какви са били цените на поръчката и други подобни. Но сега какво се случва, ако клиентът промени адреса си? Или ако цената на даден артикул се промени? Ще трябва да следите тези промени в съответните им документи. Би било много по-лесно и достатъчно ефективно за съхраняване на поръчката като:

{
  _id: "order987654321",
  date: ISODate("2014-08-01T16:25:00.141Z"),
  customer: {
               userID: ObjectId("53fb3940040980c9960ee283"),
               recipientName: "Foo Bar"
               address: {
                          street: "742 Evergreen Terrace",
                          city: "Springfield",
                          state: null
                         }
            },
  items: [
    {count:1, productId:ObjectId("53fb3940040980c9960ee300"), price: 42.00 },
    {count:3, productId:ObjectId("53fb3940040980c9960ee301"), price: 0.99},
    {count:5, productId:ObjectId("53fb3940040980c9960ee302"), price: 199.00}
  ]
}

С този модел на данни и използването на тръбопроводи за агрегиране имате няколко предимства:

  1. Не е необходимо самостоятелно да следите цените и адресите или промените в името или покупките на подарък на клиент – това вече е документирано.
  2. С помощта на тръбопроводи за агрегиране можете да създавате ценови тенденции, без да е необходимо самостоятелно да съхранявате данни за цените. Вие просто съхранявате настоящите цена на артикул в документ за поръчка.
  3. Дори сложни агрегирания като ценова еластичност, оборот по щат/град и други подобни могат да бъдат направени с помощта на доста прости агрегати.

Като цяло е безопасно да се каже, че в документно ориентирана база данни, всяко свойство или поле, което подлежи на промяна в бъдеще и тази промяна би създала различно семантично значение, трябва да се съхранява в документа. Всичко, което подлежи на промяна в бъдеще, но не засяга семантичното значение (паролата на потребителите в примера), може да бъде свързано чрез GUID.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Свързване с MongoDB 3.0 с Java Spring

  2. Десериализиране на полиморфни типове с MongoDB C# драйвер

  3. Проверка на връзката с MongoDB

  4. mongoose персонализирано валидиране с помощта на 2 полета

  5. Как да извлечете подробностите от mongo db и да изпратите или съхраните в обект в метода nodejs Fork