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中肯定有不同的含义.
设计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等)
| 归档时间: |
|
| 查看次数: |
12065 次 |
| 最近记录: |