数据库设计:第一范式和重复组

Joe*_*ool 14 database-design normalization

要坚持第一范式,你必须避免的一件事是重复组.而不是:

    CustID  Name  Address       Phone1      Phone2       Phone3

     102    Jerry  234 East..   555-2342   555-9854     555-2986
Run Code Online (Sandbox Code Playgroud)

您应该创建第二个电话号码表,然后在连接上创建:

CustID  Name     Address       Phone

102 Jerry    234 East..   555-2342
102 Jerry    234 East..   555-9854
102 Jerry    234 East..   555-2986
Run Code Online (Sandbox Code Playgroud)

有时,它有点模棱两可,而且很难判断一组列标题何时合格.例如,假设您目前在每个硬件上运行两次测试.您的第一个数据库设计产生了最横向的方法:

设计1

SN     Test1_Max   Test1_Min    Test1_Mean  Test2_Max   Test2_Min    Test2_Mean
2093      23          2            15         54          -24           45  
Run Code Online (Sandbox Code Playgroud)

显然,这是一个重复的组,可以更容易地表示为(在"部件"和"测试"之间的连接):

设计2

SN     Test      Max    Min    Mean     
2093    1        23     2      15       
2093    2        54     -24     45      
Run Code Online (Sandbox Code Playgroud)

但是,你可以更加垂直:

设计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  
Run Code Online (Sandbox Code Playgroud)

设计3是否必要?你如何决定它的垂直度?设计2和3之间的优缺点是什么?看起来两者都可以通过SQL轻松选择或加入,具有设计3的优势,因为您可以轻松添加新的Statistic而无需实际修改表结构.

但是在任何人去之前说越垂直越好,有时会更模糊.喜欢:

设计4

SN      AverageCurrent (mA)    BatteryCapacity (mA)  
2093          200                    540  
Run Code Online (Sandbox Code Playgroud)

可能是:

设计5

SN      mA_Measuremnt       Value
2093    AverageCurrent      200 
2093    BatteryCapacity     540 
Run Code Online (Sandbox Code Playgroud)

虽然两个属性属于同一个域(mA),但它们代表了与组件相关的非常不同的东西.在这种情况下,Design 4更好,因为它不是严格意义上的重复组吗?我想我正在寻找的是一些标准,知道何时将其分解为更多的表格,从而使其更加垂直.

总结这个荒谬冗长的问题,如果它们只是相同的域并且具有完全相同的含义,您是否应该仅删除并规范化重复组.如果是这种情况,那么实际上只有电话示例和设计1中的两个测试可能符合此标准.虽然看起来设计3和5可能有设计上的好处,但即使设计3的统计数据严格地说有不同的含义,而且平均电流和电池容量在设计5中肯定有不同的含义.

Mat*_*ish 7

设计2和设计4是最好的方法,只要结果不会总是存在(在Desigin 1中也称为NULL).如果他们总是被采取,那么第一个设计是好的.

我相信SQL中的重复组实际上是如果你有一个填充了add'l值的列,例如Phone_Number包含"123-444-4444,123-333-3334"等.

不管怎么说,后来的设计是次优的-你继续采取到最终水平,有"一个真实的查找表" http://www.dbazine.com/ofinterest/oi-articles/celko22或实体属性值HTTP: //tonyandrews.blogspot.com/2004/10/otlt-and-eav-two-big-design-mistakes.html

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:10678084117056

无论哪种方式,它几乎总是一件坏事.虽然它们可能共享一个共同的数据类型/域,但意义不同 - 因此它们应该保持单独的属性(maxtemp,mintemp等)