我在 DB 图表中工作,我有一个名为cm_identifier_type
. 该表的每条记录可以有或没有可下载文件(保存文件路径)。我已经确定了两种可能的方法来实现这一目标。
- 放置一
download_file
列为默认VARCHAR(250)
设置为NULL
(这是因为不是所有的记录都会有下载相关)
cm_identifier_type
在和新表之间创建关系cm_download_file
:
现在,关于性能、磁盘空间节省、查询节省等,您会怎么做?您对这种极端情况有何建议?
注意:目前我使用的是 MariaDB 10.1.x,但这将在 MySQL 实例中,可能是 5.x 左右,我完全不确定,因为我还没有得到这些细节
如果您有很多关于可选列为空的频率以及需要读取非空列的频率(与您的核心强制列相对)的大量特定统计信息,那么您可以计算(或不)节省空间并至少您可以得出一些性能实验来测试每种方法。
对于将可选列隔离到单独的表中是否“更好”,没有经验法则。
“更好”是一个主观术语。有什么价值?磁盘空间、CPU 周期、查询响应时间、代码的简单性?如果不首先考虑您要优化的是什么,就无法考虑一种方法相对于另一种方法的相对优点。
您可能希望将可选列移动到单独的 1:1 相关子表的原因有很多。有关这些原因的更多讨论,请参阅我对这个问题的回答。
在您的情况下,由于您担心空间,因此需要记住有关数据物理存储方式的一些事项:
在占用更少空间和性能更好的问题上存在很多相互竞争的影响。您需要考虑:
另一件需要考虑的事情,甚至可能是最重要的事情,是您是否通过尝试预优化而过度考虑了这个问题。磁盘很便宜。CPU 很便宜。程序员很贵。除非您需要担心大规模,否则最好的答案可能是给您留下最简单(错误最少、最容易维护)代码的答案。
我认为最好的选择是第一个解决方案,因为该字段是 VARCHAR:这意味着如果值为 NULL,则不会占用大量空间。
另一方面,使用第二种解决方案,您需要维护更多的表、其他索引,如果您需要该值,则需要加入等等。对于一个可以用非常简单的方式解决的问题来说太麻烦了。