我有一个名为state的列,其中包含以下值:draft
,active
,published
,archived
。我想将它们存储为VARCHAR
并将它们映射到Enum
类。
该表可能有数百万行,我很想知道存储这些信息的几种方法的空间节省。
一种方法是在主表上有一个table_states
表,其中id, state
列和state_id
。
另一种方法是将状态存储在主列上但索引。
我是否正确地理解内部的索引字符串列同样存储在第一个提到的方法中?
有问题的数据库是MySQL,但我相信这个问题也与其他数据库有关。
答案 0 :(得分:0)
索引不会使字符串占用更少的空间。实际上,它增加存储,因为索引是排序数据结构中字符串的副本。
您可能想要使用MySQL ENUM data type:
ALTER TABLE WhateverYourTableNameIs
MODIFY state ENUM('active','archived','draft','published') NOT NULL;
这使得列的存储每行只占用1个字节,因为内部字符串只是表定义的一部分,并且它们作为序数整数存储在每一行上。列表中最多可包含255个枚举字符串,每行仍需要1个字节。
另一方面,每次要添加新值时,都需要ALTER TABLE重新定义ENUM列表。
答案 1 :(得分:0)
建议为状态使用单独的表,并使用tinyint作为ID。空间要求与枚举(1字节)相同,但枚举没有限制。