Mis*_*hko 9 mysql database database-design default-value
我有几个表像Buyers,Shops,Brands,Money_Collectors,等
这些每个人都有一个默认值,例如默认的Buyer是David,默认的Shop是Ebay,依此类推.
我想将这些默认值保存在数据库中(以便用户可以更改它们).
我想将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个布尔字段,
好吧,这是一个布尔列.它存在于每一行.
让我问你一下.如果您创建了一个包含1个日期列并插入1行的表,那么您将在磁盘上使用多少空间?
如果你说7或8个字节,那么你的关闭大约1000次.
磁盘空间的最小单位是块.块通常是8kb(一般可以小到2kb,大到32kb (这里没有挑剔,实际限制并不重要))
假设您有8kb块然后是1列,1行表需要8Kb.如果你插入另外999行,它仍然会占用8KB.(同样没有挑剔每块和每行的开销 - 这是一个例子)
因此,在具有50个商店名称的查找表中,向表格大小添加50个字节的可能性迫使您从1个块扩展到2个,这一点很小甚至完全无关紧要.
另一方面,您的默认表肯定会占用至少一个额外的块.但是对PERFORMANCE的最大打击是你填写下拉列表的调用需要两次往返数据库,一次获取列表,一次获取默认值.(是的,你可以在一个中做到这一点但是随之而去)
因此,您节省了零空间,并使网络流量增加了一倍.
你看到我在说什么.
停止担心空间的另一个重要原因是你放弃了清晰度.想想你将要雇用的开发人员来运行这个应用程序.当他加入团队并查看数据库时,想象一下这两个场景.
你要求他用"商店"的下拉列表建立一个新的for.
在方案1中,他找到了商店表,将下拉列表连接到表的简单查询,并使用default_value字段选择初始值.
在方案2中,如果没有经过一些培训,他怎么知道寻找一个单独的表?也许他会看到桌子,但是当你正在招聘时,你的数据模型现在有数百张桌子.
再一次,有点做作,但重点是显着.数据库中的清晰度很好,每行值得一个字节.
技术的东西
我不是MySQL人,但在Oracle中,行末的空列不占用额外的空间.在Oracle中我会使用Varchar2(1)并让'T'= Default并将其他人保留为null.这将仅对1个加法字节总数产生影响,而不是每行.YMMV与MySQL,你可以单独提出这个问题,如果你不能谷歌的答案.
但是担心这个问题的时间是数百万行,而不是数百行.任何提供下拉列表的表都不会大到足以开始担心额外的字节.