【发布时间】:2020-09-22 02:32:35
【问题描述】:
我经常使用查找表,有时我在查找表中有一些默认记录,我认为对于这条记录,我可以使用 0 作为主键 a,如下所示:
项目:
Id | Name | Description
----------------------------------------------------
0 | General | Used for general situations
1 | Project A | ...
2 | Project B | ...
3 | Project C | ...
通过这样做,我可以从 1 开始获取实际项目值(A、B、C...),另一方面,我可以轻松地将其他表的一般/默认值区分为 FK。
状态:
Id | ProjectId | Name
----------------------------------------------------
1 | 0 | Deleted
2 | 0 | Active
3 | 0 | Passive
4 | 1 | Waiting for Approval
5 | 2 | Waiting for Sales
6 | 3 | Waiting for Service
上面的方法是错误的还是使用0作为PK/FK会有问题?
【问题讨论】:
-
主键是数据库功能。 Java 或 C# 没有主键(或外键)的概念。即使您使用
NULL作为主键,语言也不会在意,如果database allows it。 -
将主键链接到数据是没有意义的。
-
谢谢,实际上我想到了实体框架代码优先方法,因此我想到了 Java/C#。我更新了标签。
-
既然它是一个代理键,你不应该真正关心它是
0、1、-42还是4243。如果您要根据主键的值编写逻辑,那么您的设计就很糟糕。 -
主键的值通常是完全任意的。通常它甚至不暴露给表示层,因为它纯粹用于提供对象之间的关系。显示的值通常是与该 ID 相关的“名称”,在本例中为项目名称。 PK 不必从
1开始。事实上,在某些设计中,您会发现人们从 -2,147,483,648(甚至 -9,223,372,036,854,775,808)开始,以从int(bigint) 数据类型和IDENTITY中获取最大数量的可能值。
标签: java c# sql-server database postgresql