2

我正在使用具有以下设计的数据库。我读到在数据库设计中使用闭环不是一个好习惯,而且我有不止一个。但我不记得为什么。所以不确定这会如何影响我。任何例子这可能是危险的?

我们数据库的一部分示意图

编辑:浏览了我的电子书,发现我正在阅读的是从新手到专业的开始数据库设计,出版商:APRESS。
他们只是对此提出警告,但给出了一个模糊的理由。不,我们没有使用触发器。有人有更清楚的解释吗?
谢谢 摘录,第 109 页:

一家小公司的员工分别为多个不同的小型项目组之一工作。每个组及其所有员工都被安置在一个特定的房间中,更大的房间容纳多个组。我们可能需要诸如每个员工所在的位置、特定员工的电话号码、在哪里可以找到特定组、每个组中的哪些员工等信息,每个房间里都有谁,等等。一种可能的数据模型如图 5-7 所示。花点时间了解这个特定问题的数据模型及其包含的关于房间中组数等的信息。该模型具有冗余信息。你能看出它是什么吗?

示例图

对于示例 5-3,如果我们经常要查找员工的电话号码,我们可能会认为图 5-7 中 Employee 和 Room 之间的顶部关系将是一条有用的直接路径。然而,同样的信息很容易通过 Group 的替代途径获得。我们可以找到员工的(仅一个)组,然后找到该组的(仅一个)房间。这是一个非常简单的检索(它不涉及在示例 5-2 中困扰小旅馆的所有日期的复杂性)。然而,额外的关系不仅没有必要,而且很危险。对于相同的信息有两条路径,除非数据得到非常仔细的维护,否则我们可能会得到两个不同的答案。每当员工换组或组换房间时,将有两个关系实例要更新。如果没有非常仔细的更新程序,我们最终可能会发现 Jim 属于 A 组,即 12 号房间,而另一条路线可能会让 Jim 直接与 15 号房间相关联。冗余信息容易出现不一致,应始终删除。

4

3 回答 3

4

并非所有数据库都启用了延迟关系检查,并且并非所有数据库都允许在一个语句中将两条记录插入两个不同的表中。

想象一下,你有一个FOREIGN KEYfrom AtoB和 from Bto A

最初,两个表都是空的。

你将如何插入第一条记录?

你不能插入任何东西,A因为它必须引用一个记录B(它是空的),并且你不能以同样的方式插入任何东西到B.

于 2010-01-11T13:24:55.247 回答
1

我不会说“闭环不是​​一个好习惯”。但是,它们确实引起了人们对潜在问题的关注。因此,检查所有闭环是否存在此问题的可能性是一个好习惯。

教科书的例子对我来说似乎很清楚。有两种方法可以确定员工的位置/电话:

  • 员工 -> 组 -> 房间 -> 电话
  • 或员工 -> 房间 -> 电话

这就像为需要保持同步的同一事物存储两个变量。可能会出现问题并且变量最终具有不同的值-然后您必须问:“两者中哪一个是正确的?”

因此,教科书示例突出了您必须注意的问题。但是,问题实际上归结为语义。即关系是什么意思。在教科书示例中,两条路径的Room含义完全相同。然而,如果这Group -> Room只是每个员工的“默认”,因为高级员工可以得到自己的房间,或者员工可以临时被分配到远离他们的团队的其他地方工作,那么额外的关系将是合理的。

进入你的设计,这是你应该做的:

  • 寻找封闭的团体
  • 评估关系的语义/目的/意义
  • 检查您是否刚刚创建了两条通向完全相同信息的路径。

例如,您有:

  • TestSample -> 线圈 -> 板坯
  • 测试样品 -> 板 -> 板

请原谅对您的术语可能荒谬的理解。)这是否意味着您的测试样本可以同时在 2 个不同的板上?或者这是否意味着您的测试样品将由可能(但不一定)来自不同板坯的板和线圈组成?

于 2010-01-22T19:44:07.350 回答
1

过去在表组之间使用“闭环”引用(即关系循环中的至少 3 个)我没有遇到过问题。我能想到的唯一问题是如果您使用触发器,即使那样,如果您在触发器的“循环”中更新其他表,这只会是一个问题。

对于没有闭环的建议,您是否有参考?

如果您将链接复制到新窗口,可以看到评论图像的其他人:http: //imgur.com/ChFL1

于 2010-01-11T13:12:32.153 回答