我有两列:“string”“int”
我将两者都设置为唯一组合的主键。
基于字符串列进行搜索会比进一步规范化字符串列并改为使用2个int列更差吗?
答案 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和/或字符串。
对表进行规范化是否与索引选择的一半无关。规范化通常会减慢搜索速度,因为它会强制查找不同的表。