请明确一点。
最好的方法是在每个表上都有一个下拉列表来源列。
以下是原因...
"我不应该担心在数据库中保存数据时的空间吗?"
简单的答案是不用。更长的答案是你应该担心的是性能。如果专注于空间,你会做出非常糟糕的事情。
如果空间是一个问题,你会做出以下糟糕的事情:
- 你会把意义埋入主键中,即智能键。
- 你会尝试在一个列中存储多个值。
- 你将过少地建立索引。
- (毫无疑问,我们可以列出50种节省空间的糟糕实践)
假设有50家商店(下拉框有50个可能的值)。在这种情况下,要存储默认商店,您需要50个布尔字段,
好吧,这是一个布尔列。它存在于每一行中。
让我问你这个问题。如果你创建了一个只有1个日期列并插入了1行的表,你会使用多少磁盘空间?
如果你说7或8个字节,那么你错了大约1000倍。
磁盘空间的最小单位是块。块通常为8kb(可以小至2kb,大至32kb,在一般情况下(这里不要挑剔,实际限制并不重要))
假设你有8kb的块,那么你的1列、1行表将占用8Kb。如果你插入另外999行,它仍将占用8KB。(再次说明,每个块和每行都有开销-这只是一个例子)
因此,在你的包含50个商店名称的查找表中,添加50个字节到表的大小强制你从1个块扩展到2个的可能性微乎其微,完全无关紧要。
另一方面,你的默认表肯定会占用至少一个额外的块。但对性能的最严重影响是,你的调用填充下拉列表将需要两次往返数据库的操作,一次获取列表,一次获取默认值。(是的,你可能可以在一次操作中完成,但还是这样吧)
所以你节省了零空间,但网络流量翻了一倍。
你明白我的意思吧。
停止担心空间的另一个关键原因是你放弃了清晰度。想象一下你将雇用运行此应用程序的开发人员。当他加入团队并查看数据库时,想象两种情况。
- 有一个名为Default_value的布尔型列。
- 有一个没有与任何东西相关联的表,名为Default_Values。
您要求他建立一个带下拉列表的新表单,用于“商店”。
在第一种情况下,他找到了store表,将下拉列表连接到该表的简单查询,并使用default_value字段选择初始值。
在第二种情况下,如果没有一些训练,他怎么会知道要寻找一个单独的表呢?也许他会看到这个表,但当你雇佣人员时,你的数据模型现在已经拥有数百个表。
再次强调一下,这有点刻意,但要点很显著。数据库中的清晰度非常值得每行一个字节的代价。
技术方面
我不是MySQL专家,但在Oracle中,最后一行的空列不占用额外的空间。在Oracle中,我会使用Varchar2(1),并让'T' = Default,其他保持为空。这将总共只使用 1 个额外字节,而不是每行都占用一个字节。在MySQL中,您可以单独提出这个问题,如果无法通过Google搜索答案。
但是开始担心这个问题的时间是在有数百万行数据的时候,而不是几百行。任何用于下拉列表的表都不会足够大,以至于需要开始担心额外的字节。