这个2列表需要规范化吗?

时间:2009-04-16 04:36:06

标签: sql database database-design

我有两列:“string”“int”
我将两者都设置为唯一组合的主键。

基于字符串列进行搜索会比进一步规范化字符串列并改为使用2个int列更差吗?

6 个答案:

答案 0 :(得分:6)

你希望有很多重复的字符串吗?如果不是,那么正常化将不会产生任何结果。如果是,那么索引变得越不有效,你就越复制。 (因为必须检索所有具有相同索引的项目)

如果您的数据库引擎支持它,您可以简单地将字符串设置为聚簇索引,在这种情况下,相似的字符串将彼此相邻存储。

如果您已经在两个列上都有索引,并且正在比较它们,那么您将获得索引的全部好处。

答案 1 :(得分:2)

如果你确实需要字符串值,那么答案是否定的。

比较DB中的字符串比比较int要便宜,然后从int中查找字符串。

对于字符串的重复,您拥有的重复次数越多,那么如果它们被非规范化,则需要的存储空间越少。但它仍然会慢一些。

如果您正在寻找超过存储空间的性能,那么坚持使用字符串,即PK。

答案 2 :(得分:1)

这实际上听起来很容易测试。

您可以双向设置表,生成100,000个随机行,对两个行运行一些查询,并查看哪个更快。

答案 3 :(得分:1)

该表已经标准化。

将字符串更改为int不会进一步标准化。

这可能看起来很挑剔,但“正常化”一词正在被过度使用,以至于它变得毫无结果。

答案 4 :(得分:0)

如果您使用的是Oracle,您可能希望探索使用COMPRESS 1将其作为索引组织表。

来自Oracle docs

  

指定COMPRESS以启用密钥   压缩,消除重复   发生主键列   索引组织表中的值。使用   整数来指定前缀长度,   这是前缀列的数量   压缩。

答案 5 :(得分:0)

索引可以快速搜索。但请记住,如果数据库知道所有最重要的字段,那么它只能使用索引。例如,如果您有索引:

int, string

然后数据库可以使用索引来搜索int,或者搜索int和string的组合。但它不能用它来搜索字符串。

如果您创建两个单独的索引:

index 1: int
index 2: string

然后数据库可以有效地搜索int和/或字符串。

对表进行规范化是否与索引选择的一半无关。规范化通常会减慢搜索速度,因为它会强制查找不同的表。