如果该字段是一个通常包含大约 30 个字符的 VARCHAR(255),另一种方法是在主表中存储一个 4 字节整数并使用具有 4 字节整数和 VARCHAR(255) 的第二个表,然后您正在考虑节省一些空间。
旧方案:
T1: 30 bytes * 60 K entries = 1800 KiB.
新方案:
T1: 4 bytes * 60 K entries = 240 KiB
T2: (4 + 30) bytes * 30 K entries = 1020 KiB
所以,这粗略地节省了 1800 - 1260 = 540 KiB 空间。如果必要时在 T2 中的整数列上建立索引,则会失去更多空间。如果数据的平均长度大于 30 字节,则空间节省会增加。如果重复行的比率增加,则节省会增加。
节省空间是否显着取决于您的上下文。如果您需要多半兆字节的内存,那么您就得到了——如果您确定不需要使用 2 字节整数而不是 4 字节整数(120 + 960 KiB = 1080 KiB;节省 720 KiB)。另一方面,如果您真的没有注意到可用的数 GB 存储中的半兆字节,那么它就变成了一个更实际的问题。维护两个表比较困难,但可以保证每次使用的名称都相同。维护一张表意味着您必须确保正确处理名称对 - 或者,更有可能的是,您忽略了这种可能性,并且最终在应该有对的地方没有对,或者在应该有的地方得到了三胞胎双胞胎。
显然,如果重复的类型是 4 字节整数,则使用两个表不会节省任何东西;这将花费你的空间。
因此,很大程度上取决于您没有告诉我们的内容。类型是一个关键问题。另一个是重复背后的语义。