【发布时间】:2014-02-11 11:29:42
【问题描述】:
我目前正在考虑如何设计我的发票实体。 特别是涉及发票金额时。
这些是我想到的选项,你觉得有什么好处和坏处?
- 发票实体本身并不持有金额,而是持有一个虚拟列表,其中包含与发票相关的所有交易,并通过这些交易计算和呈现金额。 InvoiceId 作为外键。
- 发票实体确实持有金额和交易清单(作为我假设的安全保险?),仍然 InvoiceId 作为外键。
- 交易实体不包含外键。而是根据交易计算金额并存储在发票表中。附上相应发票的其他参考。
目前我正在使用选项 1。但是当我考虑未来时,我意识到我的交易表将包含很多交易。在某些时候,我可能想移动它们以提高性能,而不必移动(删除)发票表。所以3号是我的选择。但是,还有其他更受欢迎的选择吗?
【问题讨论】:
-
#1 是我的偏好...在您按(客户?)对发票进行分组的任何内容上添加索引,以便在需要时解决速度问题。作为以后的选择...通常较重的负载是由事后报告引起的。研究创建聚合表和从 Prod 环境加载报告服务器的每晚 ETL 流程。
-
嗯,谢谢。但想象一下。我的交易表中有数百万行。当我生成发票时,对于每个用户,我都会在一定时期内遍历交易,并为每笔交易设置外键。这就是我担心性能方面的问题。每月生成一次发票,每天创建交易。
-
不要使用循环 :) 如果您正在处理数百万条记录,那么您最不想在此处添加循环。 SQL 是基于设置的,1 个脚本一次执行所有行。
-
嗯,好吧,所以您的意思是一个触发器,以便在创建(插入)新发票时,它会继续使用插入的 InvoiceId 更新所有交易?这就是基于集合的意思吗? :)
-
触发器也倾向于一次处理一行......但这将取决于您在生成发票时的要求。将几乎任何其他计算机语言视为第 1 步、第 2 步、第 3 步,对每一行重复所有步骤。将 sql 视为所有行的第 1 步,所有行的第 2 步,所有行的第 3 步,完成。获取特定日期期间的所有交易并在一个脚本中生成所有发票。实际上,我很难理解更新发票 ID 的含义...您在交易表中有 invoiceID,并且在生成 invoiceID 后更新交易?
标签: sql asp.net-mvc entity-framework database-design