我正在使用MongoDB构建一个简单的数据库,我对有效的文档结构有一些疑问。我基本上有三个不同的部分:用户,事件和成本。请参阅下面的我当前的方法。
{
"first_name": "John",
"last_name": "Doe",
"email": "john@doe.com",
"phone": "123456",
"events": [
{
"_id": "*MongoId reference to event*",
"status": 0,
"owner": 1,
"costs": [
{
"id": 1,
"name": "Test",
"amount": 59.99,
"created": "27/12/16 16:47:34 UTC",
"updated:": "27/12/16 16:47:34 UTC"
}
],
"created": "27/12/16 16:47:34 UTC",
"updated": "27/12/16 16:47:34 UTC"
}
],
"created": "27/12/16 16:47:34 UTC",
"updated": "27/12/16 16:47:34 UTC"
}
多个用户将连接到同一事件,因此是MongoID引用,但成本显然只属于一个用户事件组合。我有一些示例用例:
用例2和3是否在可接受的范围内,这是否符合我的需求?
答案 0 :(得分:1)
恕我直言,就非规范化而言,你的方法是正确的,你想把数据和关系放在一起。
我在这里看到的问题是你在对象数组中使用对象数组(在事件内部的成本)。虽然Mongo查询通常很好,但它们对嵌套数组的效率不高。嵌套对象更容易处理imo。
另外在嵌套数组中放置一个索引会很麻烦,可能无法带来理想的结果。
现在它完全取决于您想要的要求,但如果我不得不考虑它,我的模型将如下所示。
{
"first_name": "John",
"last_name": "Doe",
"email": "john@doe.com",
"phone": "123456",
"events": [
{
"_id": "*MongoId reference to event*",
"status": 0,
"owner": 1,
"created": "27/12/16 16:47:34 UTC",
"updated": "27/12/16 16:47:34 UTC"
}
],
"costs": [
{
"id": 1,
"event_id": "*Appropriate event id*"
"name": "Test",
"amount": 59.99,
"created": "27/12/16 16:47:34 UTC",
"updated:": "27/12/16 16:47:34 UTC"
}
],
"created": "27/12/16 16:47:34 UTC",
"updated": "27/12/16 16:47:34 UTC"
}
此外,出于性能原因,我会在事件和成本上加上索引。
我认为专业人士认为,就性能而言,它适用于所有用例,根据用户和事件ID更新成本数据更容易。
缺点是您可能必须在应用程序级别上执行事件和成本的映射,其次,如果要删除事件,则必须编写更新以删除相应的成本。值得庆幸的是,两者都可以在单个更新中实现,这对于单个文档是原子的。
可能会有进一步的方法,但你必须在某个地方做出决定。