要遵守第一范式,您必须避免的一件事是重复组。如代替:
CustID Name Address Phone1 Phone2 Phone3
102 Jerry 234 East.. 555-2342 555-9854 555-2986
您应该创建第二个电话号码表,然后在加入时您将获得:
CustID Name Address Phone
102 Jerry 234 East.. 555-2342
102 Jerry 234 East.. 555-9854
102 Jerry 234 East.. 555-2986
有时,它有点模棱两可,很难判断一组列标题何时合格。例如,假设您目前在每个硬件上运行两个测试。您的第一个数据库设计产生了最横向的方法:
设计一
SN Test1_Max Test1_Min Test1_Mean Test2_Max Test2_Min Test2_Mean
2093 23 2 15 54 -24 45
显然,这是一个重复组,可以更容易地表示为(在“Parts”和“Tests”之间的连接上):
设计二
SN Test Max Min Mean
2093 1 23 2 15
2093 2 54 -24 45
但是,您可以更加垂直:
设计 3
SN Test Statistic Value
2093 1 Max 23
2093 1 Min 2
2093 1 Mean 15
2093 2 Max 54
2093 2 Min -24
2093 2 Mean 45
设计 3 有必要吗?你如何决定它的垂直度?设计 2 和 3 之间的优缺点是什么?似乎两者都可以使用 SQL 轻松选择或连接,具有设计 3 的优势,因为您可以轻松添加新的统计信息,而无需实际修改表结构。
但在有人说越垂直越好之前,有时它会更加模棱两可。像:
设计 4
SN AverageCurrent (mA) BatteryCapacity (mA)
2093 200 540
可以改为:
设计5
SN mA_Measuremnt Value
2093 AverageCurrent 200
2093 BatteryCapacity 540
虽然这两个属性都属于同一个域 (mA),但它们代表了关于组件的非常不同的事物。在这种情况下,设计 4 是否更好,因为它不是严格意义上的重复组?我想我正在寻找一些标准来知道何时将其分解为更多表格,从而使其更加垂直。
总结一下这个长得可笑的问题,如果重复组是完全相同的域并且具有完全相同的含义,您是否应该只删除和规范化它们?. 如果是这样,那么实际上只有电话示例和设计 1 中的两个测试符合此标准。虽然看起来设计 3 和 5 可能有设计上的好处,尽管设计 3 的统计数据严格来说有不同的含义,AverageCurrent 和 BatteryCapacity 在设计 5 中肯定有不同的含义。