我正在使用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万条记录。
现在我想知道哪种方法是下面列出的最好的方法:
:一种。将字段添加到主表(T1):
T1: F1(PK), F2(TypeID), F3, F4, F5, F6, F7, F8(TypeRate)
F8在大部分时间都是空的(对于其他类型的记录),但我只有一个表
B中。添加另一个表格,其中包含T1具有的所有字段(T3):
T3: F1(PK), F2(TypeID), F3, F4, F5, F6, F7, F8
所以T1大部分时间都没有空值,但是我会有两个大致相同的表。
℃。添加说明表(T4):
T4: F1(PK), F2(FK:T1.PK), F3(TypeRate)
这样我的T1表没有空值,而对于第四种类型的记录,附加数据在T4(描述表)中
答案 0 :(得分:1)
如果不描述您要完成的任务,就不能要求“最佳”解决方案。嗯,我想你可以问,但这使得这个问题无法回答。
如果您正在尝试最小化空间(内存和磁盘空间),那么将表拆分为两个 - 如选项(b)所暗示的那样 - 将是最小空间解决方案。但是,您选择此选项的可能性非常小。空间效率的提高是最小的,将实体分成两个表通常不是最好的解决方案。
对于每个NULL,第一个解决方案会导致每行的开销略微超过 - 这是一个非常微不足道的空间。在许多情况下,这似乎是一个很好的解决方案无需额外加入即可获得数据。
第三种解决方案也没问题。它需要额外的连接来获取数据。但是,如果引用表很小或者您在密钥上构建索引,那么性能开销应该可以忽略不计。
还有另一种解决方案,我将其称之为(d)。这是为了让另一个表具有与第一个表相同的主键以及其他列。当有多个不同的列形成自然分组时,这可能很有用。
简而言之,作为一般规则,我会选择(c)。它维护数据库的关系完整性,同时最小化性能。在某些情况下,我会选择(a)或(d),但这取决于问题以及被认为是“最佳”的。
答案 1 :(得分:0)
查看Scott Ambler关于将对象映射到关系数据库主题的类论文,特别是关于比较策略的部分
http://www.agiledata.org/essays/mappingObjects.html#ComparingTheStrategies