Database 数据库设计?

Database 数据库设计?,database,database-design,Database,Database Design,我们有一个与销售相关的项目 现在,我们将产品的库存保存在一个名为stock的单独表格中。在销售、销售退货、采购和采购退货时,将更新库存表。它工作得很好,但是当我们删除或修改一个销售或采购时,维护库存就更困难了 我告诉我的老板,我们不想把库存保存在一个单独的表中,而是编写一个函数,从相关的表中计算库存(sales,purchase,…)。每当用户想要知道股票时,他们都会调用该函数以非常轻松地获取股票。因此,我们不需要考虑库存维护。我认为这是个好主意 但是他告诉我,如果有大量的记录出现,该功能将需要

我们有一个与销售相关的项目

现在,我们将产品的库存保存在一个名为
stock
的单独表格中。在销售、销售退货、采购和采购退货时,将更新库存表。它工作得很好,但是当我们删除或修改一个销售或采购时,维护库存就更困难了

我告诉我的老板,我们不想把库存保存在一个单独的表中,而是编写一个函数,从相关的表中计算库存(
sales
purchase
,…)。每当用户想要知道股票时,他们都会调用该函数以非常轻松地获取股票。因此,我们不需要考虑库存维护。我认为这是个好主意

但是他告诉我,如果有大量的记录出现,该功能将需要更多的时间来执行,这将降低软件的效率。我不知道这是否正确。我知道的一件事是,它反对DB的标准化。我们不需要将计算值保留在表内或表外


我如何设计这个数据库?单独的
库存
表是否更好?

一般来说,最好有一个规范化的数据库。如果您有重复数据,并且有一天软件不能正常工作,那么您可能会得到不一致的数据,这对任何人都没有好处

在大多数情况下,计算的效率足以让您根据您的建议在原始数据上进行计算。若这确实给您的特定项目的可伸缩性带来了问题,那个么最好在中有一个包含计算值的表。这永远不会被视为原始数据,可以在任何时候重新计算。那么你的数据是安全的,你的计算速度也很快


另一种选择,取决于您的DBMS,是考虑一个视图。

您的股票表的内容是什么?你们有不同的存货,同一种产品可以存货吗?如果只有一只股票,我建议不要单独的表格或计算过的股票。计算股票可能非常复杂和耗时,尤其是当您的客户查询股票的频率高于执行更新时。那么,你应该将库存量作为产品表的一部分。

艾伦·布朗(Allen Browne)对这一主题进行了一项出色的研究

一般来说,您需要更多的规范化来维护数据完整性,这也有助于优化数据更新(您不需要在多个位置更新同一条信息)。唯一的例外是,如果您的数据库主要用于报告,并且只是偶尔更新。然后,在几个不同的地方进行更新的成本(因为您是非规范化的)由您在报告时不必从许多不同的地方获取信息这一事实来支付


如果您的数据库必须快速处理事务(更新),并且只是偶尔报告,那么请尽可能规范化。以这种方式保持所有数据的一致性也更容易。但是,如果您只是偶尔更新,并且主要是报告(即读取,或者只是从数据库中提取数据),那么您的上司可能是对的,而且反规范化可能是更好的选择。但是,处理错误条件和保持数据完整性更为复杂(您必须更多地考虑什么是“逻辑事务”,以及在出现问题时何时撤销迄今为止所做的所有更新)。

您是否考虑过使用触发器更新库存表

在一个完美的世界里,所有变化的总和等于当前的库存数量。在现实世界中,变化之和更多地是库存项目数量的统计预测。如果你想把现实世界变成一个完美的世界,你必须考虑到这个数字中所有可能的变化。因此,除了购买和销售,您还需要初始库存、盗窃、自然灾害、捐赠给红十字会等交易类型。如果预测值和实际项目数量因某些不可预见的原因出现偏差,您需要虚拟交易来更正计数。所有这些都会使您的事务表变得混乱

你老板的绩效论证也是有效的。每次你需要库存物品的数量时,你必须对所有交易进行汇总。如果您有许多事务表,这可能会成为性能瓶颈,即使您对事务表进行了适当的索引,以便可以从索引中求和

在库存表上不能完全一致。您目前库存的物品数量与购买或出售的物品数量在概念上并不相同,它们是不同的数字,恰好与您的企业购买和出售它们(而不是制造和捐赠给红十字会)的业务规则有关,如上所述,只有在一个完美的世界里,它们才是完全相关的