3

概述 (对不起,它含糊不清 - 我认为如果我更详细地介绍它会使事情变得过于复杂)

我有三个表,表一包含一个ID,表二包含它自己的ID和表一的ID,表三包含它自己的ID和表二的ID。

我花了很多时间思考,我认为表三也包含相关的表ID会更有效。

- 这意味着我不必连接三个表,我可以只查询表三(对于经常使用的查询)

- 这将允许我通过仅锁定表 3 中包含表 1 中特定 id 的行来更轻松地实现预订系统。

对于任何想了解更多关于数据库布局的人来说,这里有更多信息

问题

去规范化有哪些不利条件?我见过一些人完全反对它,而另一些人则认为在正确的情况下它是一个有用的工具。id 永远不会改变,所以我真的没有看到任何缺点,除了必须插入两次相同的数据,因此它会消耗额外的空间(因为它只是 id 肯定可以忽略不计)。

4

6 回答 6

6

我的建议是遵循这个一般规则:默认情况下进行规范化,然后在您确定将解决的性能问题时进行非规范化。

我发现规范化的数据和处理它的代码更容易维护,也更合乎逻辑。我认为使用非规范化来提高性能没有任何问题,但我不会推测性地应用任何会导致可维护性降低的性能优化,直到您确定它们是必要的。

于 2009-11-13T13:30:54.830 回答
1

你真正想要非规范化的唯一时间是它是否需要获得你想要的性能

这已经被问过好几次了。看这里

于 2009-11-13T13:31:04.867 回答
1

如果有充分的理由,每条规则都可能被打破。

在你的情况下,我想知道这三个表包含什么。表三是真的描述了表二还是直接描述了表一?

在这种情况下,在表 3 中有 self id、table-two-id 和 table-one-id 的缺点是,它可能导致不一致 - 如果在表 2 中有 table-one-id 1 和 table-表三中的one-id 15 错误?

这取决于数据和数据的实体关系。对我来说,更重要的是没有前后矛盾并有更多的时间来选择......

编辑:在阅读了您的表格后,我建议在表三(区域)中添加一个 table-one-id,因为 table-one-id 毕竟不会改变,因此它相对节省了不一致。

于 2009-11-13T13:34:12.340 回答
1

由于它是一个(表 1)对多个(表 2),另一个表 2)对多个(表 3)我会保持相同的结构,因为它们似乎是 3 层。

例如

  • 表格1
    • 表 2
      • 表3

此外,很大程度上取决于您在这些表中存储的附加字段。

于 2009-11-13T13:38:24.923 回答
0

规范化与效率通常是一种权衡,虽然规范化通常是一件好事,但它不是灵丹妙药。如果您有明确的理由(看起来您确实如此),那么非规范化是完全可以接受的。

于 2009-11-13T13:31:20.560 回答
0

包含不完全规范化表的模式遭受所谓的“有害冗余”。有害的冗余可能导致在多个地方存储相同的事实,或者没有任何地方存储需要存储的事实。这些问题被称为“插入异常”、“更新异常”或“删除异常”。

长话短说,如果您将一个事实存储在多个地方,那么迟早您将在两个地方存储相互矛盾的事实,您的数据库将开始给出相互矛盾的答案,具体取决于哪个版本查询发现的事实。

如果您被迫“发明一个虚拟记录”以便有一个地方存储所需的事实,那么迟早您会编写一个错误地将虚拟记录视为真实记录的查询。

如果你是一个超级程序员,而且你从不犯错误,那么你就不用担心上面的问题了。我从来没有遇到过这样的程序员,尽管我遇到过很多认为自己从不犯错误的人。

我会避免将“非规范化”作为一种做法。这就像“开车离开芝加哥”。你仍然不知道你要去哪里。然而,正如其他人所指出的那样,有时应该忽略规范化规则。如果您正在设计星型模式(或雪花模式),则必须忽略一些规范化规则才能获得最佳星型(或雪花模式)。

于 2009-11-13T14:28:10.647 回答