定义空值意味着全局?

时间:2017-09-21 22:03:05

标签: mysql database-design null

我创建了一个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列唯一

2 个答案:

答案 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_idkey之间存在一些非关键依赖关系。如果您应用第5范式的原则,我认为这些列中的一列或两列应该在另一个表中并且 NOT 可以为空。结论:根据这里的信息,我认为使website_id可以为空是错误的。