Я работал над веб-проектом со слоем базы данных MongoDB.У меня есть определенная сущность, которую я не могу сопоставить с документом db должным образом, подумал, что было бы лучше получить некоторую обратную связь.
Скажем, у меня есть коллекции User и Item.Пользователи могут любить или не любить предметы.В элементах также есть теги, и пользователям также могут нравиться или не нравиться теги.Мне нужно быть в состоянии достаточно быстро отыскивать счетчики симпатий / нелюбов.
Я придумал что-то вроде этого (для предмета):
{
name: "Item Name",
statistics : {
likes: 5,
dislikes: 6
},
tags: [
{ name: "Foo", likes: 10, dislikes: 20 },
{ name: "Bar", likes: 5, dislikes: 1 }
]
}
Это довольно прилично.Но проблема в том, что мне нужно знать, понравился ли пользователь / не понравился тег или элемент.Теперь я пришел к следующему:
{
name: "Item Name",
statistics : {
likes: 5,
dislikes: 6
},
tags: [
{
name: "Foo",
likes: 2,
dislikes: 1,
votes: [
{ user: "user1_id", vote: 1 }, //like
{ user: "user2_id", vote: 1 }, //like
{ user: "user3_id", vote: -1 }, //dislike
]
},
{
name: "Bar",
likes: 0,
dislikes: 0,
votes: []
}
]
}
Это выглядит многообещающе, и самое большое преимущество, которое я вижу здесь, это то, что я могу делать атомарные обновления, если кто-то передумает и не любит то, что ему понравилосьраньше.
Но я ожидаю около 10 тегов в каждом элементе, возможно, по 100 голосов в каждом.Тогда у меня есть около 1000 вложенных объектов голосования для каждого элемента.Я знаю, что mongodb может обрабатывать документы размером 16 Мб, но все же, можно ли хранить столько данных в одном документе?
Стоит ли переходить на нормализованную модель.Может быть, с коллекцией "tagvotes" и коллекцией itemvotes?На самом деле это кажется мне более естественным.
Просто блуждаю, думаю ли я об отношениях или рационально?
Спасибо.