数据库主键0是否允许或建议使用后备?

时间:2013-11-19 14:08:08

标签: mysql database-design primary-key fallback

我想使用主键= 0作为我的应用程序的后备 其中id = 0表示使用System Default,以上所有都是用户定义的Entrys。没有用户访问id 0,也没有删除该表的可能性 这可能是一种罕见但通常的方式,或者我最好不要那样做。

编辑:
对于以下用法:
SELECT...FROM...WHERE IF(id=0, system_col, other_col)

2 个答案:

答案 0 :(得分:1)

如您所知,PK不能具有重复值。

我建议将id UNIQUE INDEX和NULL设为系统默认值。

UNIQUE INDEX可以有多个NULL值

<强>更新

你可以在没有0的情况下做到这一点。这是我的测试。

mysql> select * from a;
+------+
| a    |
+------+
|    1 |
| NULL |
| NULL |
+------+
3 rows in set (0.00 sec)

mysql> select a, if(a is null, "default", "not default") from a;
+------+-----------------------------------------+
| a    | if(a is null, "default", "not default") |
+------+-----------------------------------------+
|    1 | not default                             |
| NULL | default                                 |
| NULL | default                                 |
+------+-----------------------------------------+
3 rows in set (0.00 sec)

答案 1 :(得分:1)

这有几个方面。它不是一个好的&#34;与#34;坏&#34;决定 - 这取决于(像往常一样)。

您的设计在概念上类似于面向对象设计中的null object pattern。通过引入&#34;默认&#34;,您可以简化代码 - 而不是始终检查&#34; null&#34;,您可以保证记录,并像任何其他记录一样对待它用于数据检索目的。您也可以通过不必检查null来获得一些性能优势(尽管我怀疑这将是一个重大影响)。

另一方面,你引入了一个magic number - 通常被认为是一件坏事,因为开发人员必须知道id为0的记录是&#34; special&#34;,以某种方式是您的应用程序所独有的(而不是null,这是一个完善的概念)。如果概念跨应用程序的各个层 - 从数据库到业务逻辑,甚至到表示层,这尤其令人讨厌。