1

我将创建一个表,其行数在 1000-20000 之间,并且我的字段可能会重复很多...大约 60% 的行将具有此值,其中大约每 50- 100 有一个共同的价值。

我最近一直担心效率问题,我想知道是否最好将此字符串存储在每一行(它将在 8-20 个字符之间)或创建另一个表并将它们与其代表 ID 链接。 .所以在这个表中有~1-50行用整数替换大约300-5000个字符串?

这是一个好方法,还是根本没有必要?

4

4 回答 4

2

是的,在大多数情况下这是一个好方法。它被称为标准化,主要有两个原因:

  • 删除重复数据
  • 避免重复实体

我无法从你的问题中看出你的情况是什么原因。

两者之间的区别在于,第一个重用恰好看起来相同的值,而第二个连接具有相同含义的值。实际的区别在于,如果一个值发生变化会发生什么,即,如果一个记录的值发生变化,值本身是否会发生变化,以便所有其他使用它的记录也会发生变化,或者该记录是否应该连接到一个新值,这样其他记录保持不变。

如果是第一个原因,那么您将节省数据库中的空间,但更新记录会更加复杂。如果是第二个原因,您不仅可以节省空间,还可以降低不一致的风险,因为值只存储在一个地方。

于 2013-03-08T17:46:16.040 回答
1

这是为字符串创建查找表的好方法。这样,您可以在整数值上构建更有效的索引。这不是绝对必要的,但作为一种好的做法,我会这样做。

于 2013-03-08T17:27:55.093 回答
1

我建议使用int带有外键的查找表(就像您在第二个场景中描述的那样)。这将导致索引比索引 VARCHAR 小得多,因此所需的存储空间会更小。它也应该表现更好。

于 2013-03-08T17:29:00.080 回答
1

Avitus 是对的,创建查找通常是一个好习惯。

考虑一下您将在其中使用此表的 JOINS。1000-20000 行需要 MySQL 处理的并不多。如果您没有,我不会为查找而烦恼,只需索引该列即可。

但是,一旦您开始与其他人(相同大小)加入表格,这就是性能损失的来源,您可以(很可能)通过引入查找来补偿。

于 2013-03-08T17:38:31.630 回答