(使用SQL Server 2008)我有一个完全规范化的大表(~50M记录)。有4个主要列,其中一个只有三个可能的条目 - A,B和C.问题是,此列通常有很多冗余。也就是说,可以有许多具有值A的记录,然后是许多重复记录,除了值B(和/或C)之外,在所有方面都是相同的。这种冗余并不总是发生,但它足够频繁,它大大增加了记录数量,我希望摆脱它。
我的想法是,不是A,B,C是列的选择,我考虑创建标题为A,B,C的3位列。然后,在上述这些值的冗余的情况下,我不要不必创建重复记录,而是只有一条记录,然后根据需要标记A,B和/或C列。
这些看似非正统,所以我想我会看到专家的想法。有一件事是这个表有三个不同的唯一性约束,每个都包括所有其他主键加上三个标志列中的一个。
[编辑]为了澄清“许多重复记录”的含义,其他PK之一是日期列。因此,例如,可能有1000条不同日期的记录与条目A,然后另外1000条记录具有相同的日期(和其他列相同),但条目B。这就是即使只有三个选项,仍然可以有很多冗余。
答案 0 :(得分:1)
你不能拥有“在所有方面都相同的许多重复记录”,除了PK中带有A或B或C之一的第4列。这对我来说意味着你最多有3行(以上)其他3个PK柱)由A或B或C
区分这意味着你应该有一个独特的约束。
我会基于此而
。编辑:
您的冗余不在ABC列中。行乘法是由日期时间引起的。
您可以将日期时间更改为smalldatetime并以此方式抑制近似重复吗?例如,解决到最接近的分钟不是3.33毫秒?或者对于SQL Server 2008使用datetime2并选择您的分辨率
答案 1 :(得分:0)
我个人不这样做,我会创建另一个存储A, B, or C
和RecordID的表。
答案 2 :(得分:0)
如何创建一个存储这些“标志”的单独表,将外键返回原始表?
表1(原始表)
----------------------
PriKey1(表1的PK)
COL1
COL2
表2(新表)
------------------
PriKey2(表2的PK)
PriKey1(FK至表1)
一个
乙
Ç
答案 3 :(得分:0)
我能想到的唯一问题是,如果您希望在这些位列上使用索引编制,则需要更改现有代码并包含所有3个字段。
比特字段本质上不是很有选择性。为了获得良好的选择性,您需要在所有3个字段中创建覆盖索引,然后在WHERE
子句中包含所有3个,以便获得最佳搜索。
答案 4 :(得分:0)
在任何情况下,大多数数据库都会为每个字段分配最小的最有效处理单元,因此调用它们位字段只会是元数据差异。但无论如何,将位解压缩成单词只是开销。你可能也可能使用整数。而且我很确定Sql Server没有索引位字段 - 2的基数没有多大帮助。
50M记录?大多数帐户都是少数。
您是否尝试量化您尝试减少的开销?如果没有其他任何事情,你将为增加的复杂性添加工作。
在增加复杂性之前,我必须考虑很长时间。
这是否是一个非常稳定的设计,你有一些额外的时间?