我在用sql-server-2008-R2。我有一个表,其中有三种类型的数据,而类型在另一个表中。
T=表,F=字段,FK =外键,PK =主键
T1: F1(PK), F2(TypeID), F3, F4, F5, F6, F7
T2: F1(TypeID, PK), F2(TypeName)我想添加第四种类型的,但是这种类型有一个附加的属性(例如TypeRate)。
在项目开始的第一周,我的T1表将至少有300万条记录,然后它将把这个记录降低到每月300万条左右。
现在,我想知道,在下面列出的中,哪种方法是最好的:
A.在主表(T1)中添加一个字段:
T1: F1(PK), F2(TypeID), F3, F4, F5, F6, F7, F8(TypeRate)大多数情况下,F8将为null (对于其他类型的记录),但我将只有一个表
B.在T1有(T3)的所有字段中添加另一个表
T3: F1(PK), F2(TypeID), F3, F4, F5, F6, F7, F8因此,T1在大多数情况下不具有空值,但我将有两个表,它们大多是相似的。
C.添加描述表(T4)
T4: F1(PK), F2(FK:T1.PK), F3(TypeRate)因此,我的T1表没有空值,对于第四种类型的记录,附加数据在T4 (描述表)中。
发布于 2013-01-21 14:22:49
如果不描述你想要完成的事情,你就不能要求“最好”的解决方案。好吧,我想你可以问,但这使得这个问题无法回答。
如果您试图最小化空间(内存和磁盘空间),那么将表分割成两个--正如选项(b)所暗示的--将是最小的空间解决方案。然而,你不太可能选择这个选项。空间效率的增益是最小的,将一个实体分割成两个表通常不是最好的解决方案。
对于每个NULL,第一个解决方案的每一行开销大约要高一点--这是一个非常小的空间。在许多情况下,这似乎是一个很好的解决方案。数据在没有附加连接的情况下是可用的。
第三种解决办法也很好。它需要一个额外的连接来获取数据。但是,如果引用表很小,或者在键上构建索引,那么性能开销应该可以忽略不计。
还有另一个解决办法,我称之为(d)。也就是说,具有与第一个表相同的主键的另一个表以及其他列。当有多个构成自然分组的不同列时,这可能很有用。
总之,一般说来,我赞成(c)项。它以最小的性能命中维护数据库的关系完整性。在某些情况下,我可能会选择(a)或(d)项,但这取决于问题和认为“最好”的是什么。
发布于 2013-01-21 14:23:52
查看Scott关于将对象映射到关系数据库的主题的类论文,特别是关于比较策略的部分
http://www.agiledata.org/essays/mappingObjects.html#ComparingTheStrategies
https://stackoverflow.com/questions/14440229
复制相似问题