何时归一化数据库设计

时间:2010-11-29 05:30:54

标签: sql database-design normalization denormalization

我知道在Stack Overflow上已经广泛讨论了normalis(z)。我读过很多以前的讨论。我有一些额外的问题。

我正在开发一个至少有100个表的遗留系统。数据库具有一些非规范化结构,包含各种不同数据的表以及其他问题。我被赋予了改善它的任务。我不能再重新开始,但需要修改现有架构。

过去我一直试图设计规范化的数据库。现在的问题。一位资深开发人员建议在某些情况下我们无法正常化:

1)使用时态数据。例如,创建了一个链接到产品的发票。如果客户在一年后要求提供此发票的副本,我们必须能够生成原件的精确副本。如果产品价格,名称或描述已更新怎么办?资深人士建议将价格和其他产品信息复制到发票表中。我想也许我们应该有另一个表,例如productPrice,它有一个日期字段,所以我们可以跟踪价格随时间的变化。我想对产品描述和名称需要相同的东西吗?看似复杂。你觉得怎么样?

2)数据库是一个会计系统。我对会计不是很熟悉。目前,一些摘要数据被导出并存储在数据库中。例如,当年的总销售额。我的高级助理表示,会计师喜欢通过将此值与实际根据发票等计算的数据进行比较来检查事情是否正确,以使他们相信应用程序正常工作。他说,目前我们可以判断是否有人错误地从去年删除了发票,因为总数不会相同。他还指出,在飞行中计算这些总数可能会非常缓慢。当然,我说数据不应该重复,应该在需要时进行计算。我建议我们可以使用SQL Reporting Services或其他一些解决方案来隔夜生成这些报告并缓存它们。无论如何,他不相信。对此有何评论?

非常感谢:)
干杯
标记

修改

感谢您的出色回应。遗憾的是我只能将其中一个作为答案,因为这里有很多好的建议。

9 个答案:

答案 0 :(得分:44)

答案 1 :(得分:9)

1)这是一个档案。其中的所有内容都不应该更新。我会考虑老人的建议,让发票表自成一格。也许使用blob作为包含标记语言的发票本身?

2)报告服务,一个触发更新的仓库表,你用脚本构建的东西......我认为这些都可以。确实是理想化的,但并不总是很快。我有一个很好的医疗数据库,我管理的数据库是完全标准化的...然后有一系列非标准化的表格,包括卷起的方程式和通常拉取的字段。几乎所有的东西都是从那个非规范化的集合中运行的 - 加载文件时用触发器附加到这些文件比用每次我想要查看100,000条记录报告时必须从各种表中提取更快。

答案 2 :(得分:7)

答案 3 :(得分:4)

我同意你的大四学生的意见(1)。事务表行必须在事务处理时捕获整个状态。期。您所建议的内容不会记录实际数据,因此不可接受。我也同意(2)。无论企业想要通过交叉检查,您都必须实施。会计基于交叉检查,双重输入,汇总分类账等。您必须这样做。这非常基础,你甚至不应该把它视为非规范化,就像实现业务需求一样。

答案 4 :(得分:3)

1)不要求非规范化。您只需确定所需的每个更改的详细程度,并使用适当的密钥保留该更改。

2)与非规范化无关。存储摘要数据不会使数据库非规范化。将非关键属性派生的结果存储在同一个表中将是非规范化的一个例子,但这似乎不是你在这里谈论的。

答案 5 :(得分:3)

您的高级开发人员提出了非常有效的观点。我通过服务那些不会使历史数据无法正常化的系统来了解这些问题。

从某种意义上说,它并没有真正为数据库增加任何开销。您正在从数据库中的现有数据创建发票表。发票是及时的快照。取消规范生成该发票所需的信息可以使您的报告更容易。当您需要制作新报告并希望快速完成报告时,您会理解非规范化。

就数据库中的总数而言。在我对应用程序进行更改之前,这已经保存了我的屁股,导致数字不能以相同的方式加起来(并不像你想象的那么难)。在实际应用程序中,总计给了我一个明确的地方返回,以纠正差异。我以前写过这篇文章,你可以在这里阅读:http://jlrand.com/?p=95

答案 6 :(得分:1)

#1

应根据销售和付款计算发票。如果您没有详细的销售数据,包括价格/产品/折扣/运费等,请从那里开始。

#2

从头开始将会计系统写入数据库是一个很大的项目。确保您让会计师为您提供业务规则,以便您可以衡量系统的准确性。你想要的最后一件事就是CFO进入DBA会议并宣布数据库对客户过度收费,更糟糕的是你收费不足并使公司破产。

如果您有SQL Server,请查看Adventure Works数据库。如果你讨厌MS,那么看看Adventure Works并不要这样做。

答案 7 :(得分:0)

数据库规范化可以消除重复数据并使数据更新的SQL查询更有效(并提供一些其他改进)。

但是,如果您的大多数查询都用于数据选择,并且选择查询当时连接到多个表,您可以考虑对这些表进行非规范化。它将增加数据所需的磁盘空间量,sql更新查询的执行时间,但会改善选择查询。

答案 8 :(得分:0)

您好像在考虑是否要创建数据仓库。您不应该为了历史报告目的而对数据库进行非规范化。创建存档并将信息存储到数据仓库中将同时执行以下操作:对大多数信息进行非规范化并维护数据历史记录。