【发布时间】:2017-10-04 01:33:32
【问题描述】:
我正在尝试设计一个数据库。在我看来,我的设计似乎已标准化为 Fourth Normal Form - 但我仍然认为它已损坏,我终生无法解决如何修复它。
背景:我们有四种类型的测试,每种类型都有几十种测试。我们分批运行测试,每批只包含一种类型的测试。所以一个测试结果属于一个批次,也属于一个测试。这给出了一个类似这样的数据库计划:
问题是这种设计允许一个用于 A 类测试的结果,但该结果在 B 类的批次中。
我不能做的一件事是将 Test 和 Batch 表合并到一个表中。每周都有一个新批次,而测试持续数月或数年。并且一个 Batch 可以包含许多 Tests(尽管始终属于同一 Type),并且一个 Test 通常在许多 Batch 中执行多次。
我可以在 Test 和 Batch 之间插入多对多连接,但我无法立即看出这有什么帮助。
有没有一种干净的方法来重新组织它,以便我们没有循环连接路径?这是必要的吗?还是可取的?
或者我应该只用我所拥有的,不再担心它吗? :-)
[编辑 1] 请注意,测试包含有关其运行方式、修复发现的问题等的详细信息,这些详细信息在多个批次中保持不变,因此测试必须独立于它可能(或可能不)运行的任何批次存在.
[编辑 2] 有人指出最好有一个 TestBatch 表,它为我们提供了这样的结构:
我同意这是个好主意,但实际上并不能解决问题。它只是将问题从 Result 转移到 TestBatch。我们现在可以有一个用于 A 类测试的 TestBatch,但 TestBatch 在 B 类的 Batch 中。
[编辑 3] 感谢@philip-kelley 的出色建议,我相信我们已经有了答案。首先,我们将 TestBatch 直接链接回 Type,因此:
这并不能立即解决问题。事实上,它使情况变得更糟——现在可能有一个用于测试的类型,一个用于批处理的不同类型,以及直接从 TestBatch 加入的第三种类型。
但第二步是将外键从 TestBatch 更改为 Test,使其包含 Type 以及 TestID。并将外键更改为 Batch 以包含 Type 以及 BatchID。
这样,我们可以确定 TestBatch 与 Test 和 Batch 具有相同的 Type。
【问题讨论】:
-
等等,我错过了一些东西。如果
each batch contains tests of only one type和a test result belongs to a batch,那么Result that is for a Test of Type A怎么可能是in a Batch for Type B? -
在现实世界中 - 它不能。每个结果都是针对特定测试和特定批次的,并且该测试和该批次必须属于同一类型。在我的数据库设计中 - 很容易得到 A 类测试的结果,但结果是 B 类批次。这就是我认为我的设计被破坏的原因。
标签: database-design relational-database database-normalization