gpt4 book ai didi

MongoDB 模式设计(嵌套数组与分离集合)

转载 作者:行者123 更新时间:2023-12-02 02:04:16 25 4
gpt4 key购买 nike

我正在编写客户端管理网络应用程序。我正在尝试找出管理客户付款关系的正确方法。一天一次,应用程序向另一个 API 发送请求,并同步我存储在数据库中的每个客户的付款金额。我经常需要根据客户类型(contract_type、sale_date 等)运行付款(付款金额)报告。我已经有一个 clients 集合。我试图在两种模式之间进行选择:

{
"client_id": "asdf123",
"client_last_name": "BB",
"address": "123 Main St",
"city": "ATLANTA",
"payments_history": [
{
"contract_number": "asdf123",
"payment_date": ISODate("2012-09-02T07:00:00.0Z"),
"amount": 103.33,
"payment_number": NumberInt(1)
},
{
"contract_number": "asdf123",
"payment_date": ISODate("2012-09-30T07:00:00.0Z"),
"amount": 103.33,
"payment_number": NumberInt(2)
},
{
"contract_number": "asdf123",
"payment_date": ISODate("2012-11-04T07:00:00.0Z"),
"amount": 103.33,
"payment_number": NumberInt(3)
}
]
}

相对于创建单独的集合“payments”,其中每个文档都是一个 payment。我觉得最好将这些数据分开,因为它会将每个 client 文档增加到每个查询的大量数据(如果我选择,这仍然会占用大量内存特定领域)。但另一方面,我将无法运行聚合报告(因为它基于来自两个不同集合的数据)。什么是最好的方法?我应该将它们分开并在服务器端 (php) 对两个不同的查询进行聚合吗?

最佳答案

由于听起来您实际上需要查询客户端上下文之外的支付数据(即汇总报告),所以我不想将每个单独的支付项目添加到客户端集合对象中。

我肯定会创建一个支付对象集合,然后为每笔支付引用客户端对象中的支付 key 和支付对象中的客户端 key ,这样您就有了一种确定的方式将一个与另一个在任一方向上关联起来,或者让第三个集合将客户映射到付款。

这里更可取的可能实际上取决于您的访问模式。例如,如果在您需要建立关系的情况下查找总是在一个方向上,那么您甚至可能不需要在两组对象上使用这样的“外键”。

关于MongoDB 模式设计(嵌套数组与分离集合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15844301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com