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
有时,这有点更加含糊,很难说一群列的头衔是否符合条件.例如,假设你现在有两个测试,每个硬件上运行.而您的第一个DB设计产生了最为横向的方法:
设计1
SN Test1_Max Test1_Min Test1_Mean Test2_Max Test2_Min Test2_Mean 2093 23 2 15 54 -24 45
显然,这是一个重复的组,可以更容易地被表示为(在“零件”和“测试”之间的连接):
设计2
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轻松选择或者加入两者,具有给予Design 3的优势,因为您可以轻松添加新的统计信息,而无需实际修改表结构.
但是在任何人都说,越垂直越好,有时候它更加模糊.喜欢:
设计4
SN AverageCurrent (mA) BatteryCapacity (mA) 2093 200 540
可以是:
设计5
SN mA_Measuremnt Value 2093 AverageCurrent 200 2093 BatteryCapacity 540
虽然这两个属性都是相同的域(毫安),它们代表与组件非常不同的东西.在这种情况下,设计4是否更好,因为它不是严格的重复组?我想我正在寻找的是一些标准,知道什么时候将它分解成更多的表,从而使它更垂直.
总结一下这个荒谬的漫长问题,如果你们重复的域是相同的域,并且具有完全相同的含义,那么你应该只删除和规范重复的组.如果是这样的话,那么真正只有电话的例子,可能是设计1中的两个测试才符合这个标准.虽然设计3和5似乎可能具有设计优势,尽管设计3的统计数字严格来说具有不同的含义,而平均电流和电池容量在设计5中绝对具有不同的含义.
解决方法
我相信在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等)