在数据库中存储默认值的最佳方法是什么?

Mis*_*hko 9 mysql database database-design default-value

我有几个表像Buyers,Shops,Brands,Money_Collectors,等

这些每个人都有一个默认值,例如默认的BuyerDavid,默认的ShopEbay,依此类推.

我想将这些默认值保存在数据库中(以便用户可以更改它们).

我想将is_default列添加到每个表中,但它似乎无效,因为每个表中只有一行可能是默认值.

然后我认为最好的是拥有Defaults包含所有默认值的表.该表将包含1行和N列,其中N是默认值的数量:

Defaults table:

buyer      shop      brand      money_collector
-----      ----      -----      ---------------
David      Ebay      Dell       NULL   (no default value)
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不是最好的方法,因为在添加新的默认值时表结构会发生变化.

存储默认值的最佳方法是什么?

Ste*_*age 20

只是为了清楚.

最好的方法是在每个表上都有一个列来自下拉源.

这就是为什么......

"在数据库中保存数据时,我不应该担心空间吗?"

最简洁的答案是不.更长的答案是你应该担心的是性能.专注于太空将导致你做很糟糕的事情.

如果空间是一个问题,你会做的坏事.

  • 你会把意义埋在主键中.即智能钥匙.
  • 您将尝试在一列中存储多个值.
  • 你的索引太少了
  • (毫无疑问,我们可以创建50个节省空间的不良做法清单)

假设有50个商店(选择包含50个可能值的商店).在这种情况下,要存储默认商店,您需要50个布尔字段,

好吧,这是一个布尔列.它存在于每一行.

让我问你一下.如果您创建了一个包含1个日期列并插入1行的表,那么您将在磁盘上使用多少空间?

如果你说7或8个字节,那么你的关闭大约1000次.

磁盘空间的最小单位是块.块通常是8kb(一般可以小到2kb,大到32kb (这里没有挑剔,实际限制并不重要))

假设您有8kb块然后是1列,1行表需要8Kb.如果你插入另外999行,它仍然会占用8KB.(同样没有挑剔每块和每行的开销 - 这是一个例子)

因此,在具有50个商店名称的查找表中,向表格大小添加50个字节的可能性迫使您从1个块扩展到2个,这一点很小甚至完全无关紧要.

另一方面,您的默认表肯定会占用至少一个额外的块.但是对PERFORMANCE的最大打击是你填写下拉列表的调用需要两次往返数据库,一次获取列表,一次获取默认值.(是的,你可以在一个中做到这一点但是随之而去)

因此,您节省了零空间,并使网络流量增加了一倍.

你看到我在说什么.


停止担心空间的另一个重要原因是你放弃了清晰度.想想你将要雇用的开发人员来运行这个应用程序.当他加入团队并查看数据库时,想象一下这两个场景.

  1. 有一个名为Default_value的布尔列
  2. 有一个表与任何名为Default_Values的东西没有任何关系

你要求他用"商店"的下拉列表建立一个新的for.

在方案1中,他找到了商店表,将下拉列表连接到表的简单查询,并使用default_value字段选择初始值.

在方案2中,如果没有经过一些培训,他怎么知道寻找一个单独的表?也许他会看到桌子,但是当你正在招聘时,你的数据模型现在有数百张桌子.

再一次,有点做作,但重点是显着.数据库中的清晰度很好,每行值得一个字节.


技术的东西

我不是MySQL人,但在Oracle中,行末的空列不占用额外的空间.在Oracle中我会使用Varchar2(1)并让'T'= Default并将其他人保留为null.这将仅对1个加法字节总数产生影响,而不是每行.YMMV与MySQL,你可以单独提出这个问题,如果你不能谷歌的答案.

但是担心这个问题的时间是数百万行,而不是数百行.任何提供下拉列表的表都不会大到足以开始担心额外的字节.