我创建了一个website_settings
表。将website_id
设为null
表示此key
适用于其他全球的任何网站,这是不好的做法吗?
例如:
+----+-----------+------------+------------------------------+---------------+---------+
| id | client_id | website_id | key | value | is_json |
+----+-----------+------------+------------------------------+---------------+---------+
| 7 | 1 | NULL | display_featured_products | 1 | 0 |
| 9 | 1 | NULL | display_popular_products | 1 | 0 |
| 10 | 1 | 1 | categories_display_mode | across | 0 |
| 11 | 1 | 2 | categories_display_mode | across | 0 |
| 12 | 1 | 3 | categories_display_mode | single | 0 |
| 13 | 1 | NULL | categories_id | ["3","5","6"] | 1 |
+----+-----------+------------+------------------------------+---------------+---------+
您还可以看到我重复了categories_display_mode
的密钥,并且website_id不为空。
编辑:修复了ID列唯一
答案 0 :(得分:1)
在SQL中以不同的方式使用NULL。
NULL的这些含义之一是不适用的值,,例如"终止日期"对于仍然受雇的员工。
在您的案例中使用NULL表示密钥适用于任何/所有网站是合理使用NULL。它比试图分配一些特殊价值更好[&34]。为此目的,如0或-999。
答案 1 :(得分:1)
使website_id
允许空值意味着此列不能是此表的键的一部分(键列必须是不可为空的。)
如果我们查看表格中的其他列:
id, client_id, key, value, is_json
我们可以看到这些列中的某些值是重复的:
| 10 | 1 | categories_display_mode | across | 0 |
| 10 | 1 | categories_display_mode | across | 0 |
根本没有候选人钥匙。所以你提出的设计似乎有问题。
根据您的说法,我预计website_id
和key
之间存在一些非关键依赖关系。如果您应用第5范式的原则,我认为这些列中的一列或两列应该在另一个表中并且 NOT 可以为空。结论:根据这里的信息,我认为使website_id
可以为空是错误的。