Sql server 冗余数据库表设计

Sql server 冗余数据库表设计,sql-server,database-design,Sql Server,Database Design,(使用SQL Server 2008)我有一个完全规范化的大表(约5000万条记录)。有4个主列,其中一个只有三个可能的条目——A、B和C。问题是,这个列通常有很多冗余。也就是说,可以有许多值为A的记录,然后是许多在所有方面都相同的重复记录,除了值B(和/或C)。这种冗余并不总是发生,但它的频繁程度足以大大增加记录数,我希望将其消除 我的想法是,我考虑过创建名为A、B、C的3位列,而不是A、B、C作为列的选项。然后,在上述这些值的冗余情况下,我不必创建重复记录,而是只创建一条记录,然后根据需要标

(使用SQL Server 2008)我有一个完全规范化的大表(约5000万条记录)。有4个主列,其中一个只有三个可能的条目——A、B和C。问题是,这个列通常有很多冗余。也就是说,可以有许多值为A的记录,然后是许多在所有方面都相同的重复记录,除了值B(和/或C)。这种冗余并不总是发生,但它的频繁程度足以大大增加记录数,我希望将其消除

我的想法是,我考虑过创建名为A、B、C的3位列,而不是A、B、C作为列的选项。然后,在上述这些值的冗余情况下,我不必创建重复记录,而是只创建一条记录,然后根据需要标记A、B和/或C列

这些似乎是非正统的,所以我想看看专家们怎么想。一件事是这个表将有三个不同的唯一性约束,每个约束包括所有其他主键加上三个标志列中的一个


[编辑]为了澄清“许多重复记录”的含义,另一个主键是日期栏。例如,可能有1000条不同日期的记录带有条目A,然后又有1000条相同日期的记录(和其他列相同)带有条目B。因此,即使只有三个选项,仍然会有大量冗余。

我个人不会这样做,我将创建另一个表来存储
A、B或C
和RecordID

创建一个单独的表来存储这些“标志”,将外键返回到原始表怎么样

表1(原始表)
----------------------
PriKey1(表1的主键)
Col1
Col2

表2(新表)
------------------
PriKey2(表2的主键)
PriKey1(FK至表1)
A
B

C

我能想到的唯一一个问题是,如果您想利用这些位列的索引功能,您需要更改现有代码并包含所有3个字段


位字段的性质不是很有选择性。为了获得良好的选择性,您需要在所有3个字段上创建一个覆盖索引,然后将所有3个字段都包含在
WHERE
子句中,以便获得最佳搜索。

在任何情况下,大多数数据库都会为每个字段分配最低限度的最高效处理单元,因此调用它们的位字段只会是元数据的差异。但是,无论如何,把这些信息分解成文字只是开销。您还可以使用可能的int。我很确定Sql Server不会索引位字段-基数为2没有多大帮助

5000万张唱片?大多数人认为这是一个小数目

您是否尝试过量化您试图减少的开销?如果没有其他东西,您将为增加的复杂性添加工作

在增加复杂性之前,我必须考虑很长时间

否则,这真的是一个稳定的设计吗?你有一些额外的时间吗?

除了PK中的第4列采用a、B或C中的一列之外,你不可能有“许多在所有方面都相同的重复记录”。这意味着对我来说,你最多有3行(在其他3列PK上)由a、B或C区分

这意味着您应该有一个唯一的约束

基于这一点,我什么也不做,而且

  • 带a的行与带C的行不同
  • 只有5000万
  • 它很简单(没有额外的表或奇特的位列)
  • 没有规定的性能问题(除非添加额外的表或特殊的位列)
  • 您有一个清晰、规范化的模式
编辑:

你的冗余不在ABC栏中。行乘法是由日期时间引起的


您能将datetime更改为smalldatetime并以这种方式抑制近似重复项吗?例如,解析为最接近的分钟而不是3.33毫秒?或者对于SQL Server 2008,使用datetime2并选择您的解决方案

有时可以取消规范化。除了第4列中的A、B或C之外,您不能有“许多在所有方面都相同的重复记录”。您最多有3个。因此,您应该有一个唯一的约束。你的意思不清楚。5000万也不算太多……我编辑了这个问题,希望能更好地解释“多次重复”的情况。诚然,对于许多任务来说,5000万可能不算太多,但事实上,其中有太多的任务可能会重复,这让我认为我需要尝试优化这种情况。您能否将datetime更改为smalldatetime并以这种方式抑制重复?例如,精确到分钟而不是3.33毫秒?如果50米很小。。。那么这张桌子能长到“不小”多久?除了PK之外,只有几列。是的,我应该马上意识到这一点。一定不能头脑清醒。正如许多人评论说5000万条记录“没有那么多”,我可能首先尝试量化性能消耗,看看这是否值得努力。很抱歉,我不能对其他评论或其他任何东西进行投票,这是我的第一个问题。很抱歉,我认为仍然存在困惑。日期,以及除讨论中的一列之外的每一列,都是完全相同的。Smalledatetime不会改变这一事实。但正如下面提到的,我可能会在继续之前对性能消耗进行基准测试。