Правилно сте забелязали, че документите ще имат различен размер. Така ще спестите поне 15 bytes
на документ (60%
за подобни документи), ако решите да приемете втората схема. Това ще завърши в нещо като 140MB
за вашите 10 million
записи. Това ще ви даде следното предимство:
- Икономии на HDD. Единственият проблем е, че гледайки цените на текущия твърд диск, това е почти безполезно.
- Спестяване на RAM. В сравнение с твърдите дискове, това може да бъде полезно за индексиране. В mongodb работен набор от индекси трябва да се поберат в RAM, за да се постигне добро изпълнение
. Така че, ако ще имате индекси на тези две полета, не само ще спестите
140MB
пространство на HDD, но също и140MB
потенциално RAM пространство (което всъщност се забелязва). - Вход/изход . Много тесни места се случват поради ограничението на системата за вход/изход (скоростта на четене/запис от диска е ограничена). За вашите документи това означава, че със схема 2 можете потенциално да четете/пишете
twice as many documents
за 1 секунда. - мрежа . В много ситуации мрежата е дори по-бавна от IO и ако вашият DB сървър е на различна машина, тогава вашият сървър за приложения данните трябва да се изпращат по кабела. Освен това ще можете да изпращате два пъти повече данни.
След като казах за предимствата, трябва да ви кажа един недостатък за малки клавиши:
- четимост на базата данни. Когато направите
db.coll.findOne()
и вижда{_id: 1, t: 13423, a: 3, b:0.2}
доста е трудно да се разбере какво точно се съхранява тук. - четимост на приложението подобно с базата данни, но поне тук можете да имате решение. С логика на картографиране, която трансформира
currentDate
къмc
иprice
къмp
можете да напишете чист код и да имате кратка схема.