Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库表分析混乱_Sql_Database - Fatal编程技术网

Sql 数据库表分析混乱

Sql 数据库表分析混乱,sql,database,Sql,Database,我正在使用sql-server-2008-R2。我有一个表,其中有三种类型的数据,这些类型在另一个表中 T=表格,F=字段,FK=外键,PK=主键 我想添加第四种类型,但该类型有一个附加属性(例如TypeRate)。 在项目开始的第一周,我的T1表将至少有300万条记录,然后它会将其降低到每月大约300万条记录 现在我想知道下面列出的方法中,哪种方法最好: T1: F1(PK), F2(TypeID), F3, F4, F5, F6, F7, F8(TypeRate) A.将字段添加到主表(T

我正在使用
sql-server-2008-R2
。我有一个表,其中有三种类型的数据,这些类型在另一个表中

T=表格,F=字段,FK=外键,PK=主键

我想添加第四种类型,但该类型有一个附加属性(例如TypeRate)。
在项目开始的第一周,我的T1表将至少有300万条记录,然后它会将其降低到每月大约300万条记录

现在我想知道下面列出的方法中,哪种方法最好:

T1: F1(PK), F2(TypeID), F3, F4, F5, F6, F7, F8(TypeRate)
A.将字段添加到主表(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
T4: F1(PK), F2(FK:T1.PK), F3(TypeRate)
T1在大多数情况下都没有空值,但我有两个表,它们基本上是一样的


C.添加说明表(T4)

T3: F1(PK), F2(TypeID), F3, F4, F5, F6, F7, F8
T4: F1(PK), F2(FK:T1.PK), F3(TypeRate)
因此,我的T1表没有空值,对于第四种类型的记录,附加数据位于T4(描述表)

如果不描述您试图实现的目标,您就不能要求“最佳”解决方案。嗯,我想你可以问,但这使问题无法回答

如果您试图最小化空间(内存和磁盘空间),那么将表拆分为两个(如选项(b)所示)将是最小空间解决方案。然而,你不太可能选择这个选项。空间效率的提高是最小的,将一个实体拆分为两个表通常不是最佳解决方案

第一种解决方案为每一个NULL的每一行带来大约一点额外的开销——相当小的空间量。在许多情况下,这似乎是一个很好的解决方案。数据不需要额外的联接即可使用

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

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


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

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


请说明为什么每个解决方案都是好的或坏的,以及优缺点。感谢Gordon花时间回答我的问题。你的回答很方便,祝你好运。