【发布时间】:2012-01-05 23:01:03
【问题描述】:
我一直在开发一个带有 MongoDB 数据库层的 Web 项目。我有一个无法正确映射到文档数据库的特定实体,我认为最好获得一些反馈。
说,我有 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 可以处理 16mb 的文档,但仍然可以将这么多数据存储在一个文档中吗?
我应该选择标准化模型吗?也许有一个“tagvotes”集合和一个 itemvotes 集合?实际上对我来说感觉更自然。
如果我在思考关系性的还是理性的,只是在徘徊?
谢谢。
【问题讨论】:
标签: c# mongodb data-modeling database