数据库表分析混乱

时间:2013-01-21 13:57:48

标签: sql database

我正在使用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(描述表)中

2 个答案:

答案 0 :(得分:1)

如果不描述您要完成的任务,就不能要求“最佳”解决方案。嗯,我想你可以问,但这使得这个问题无法回答。

如果您正在尝试最小化空间(内存和磁盘空间),那么将表拆分为两个 - 如选项(b)所暗示的那样 - 将是最小空间解决方案。但是,您选择此选项的可能性非常小。空间效率的提高是最小的,将实体分成两个表通常不是最好的解决方案。

对于每个NULL,第一个解决方案会导致每行的开销略微超过 - 这是一个非常微不足道的空间。在许多情况下,这似乎是一个很好的解决方案无需额外加入即可获得数据。

第三种解决方案也没问题。它需要额外的连接来获取数据。但是,如果引用表很小或者您在密钥上构建索引,那么性能开销应该可以忽略不计。

还有另一种解决方案,我将其称之为(d)。这是为了让另一个表具有与第一个表相同的主键以及其他列。当有多个不同的列形成自然分组时,这可能很有用。

简而言之,作为一般规则,我会选择(c)。它维护数据库的关系完整性,同时最小化性能。在某些情况下,我会选择(a)或(d),但这取决于问题以及被认为是“最佳”的。

答案 1 :(得分:0)

查看Scott Ambler关于将对象映射到关系数据库主题的类论文,特别是关于比较策略的部分

http://www.agiledata.org/essays/mappingObjects.html#ComparingTheStrategies