一对一的关系应该分成两个表吗?

Wil*_*iam 2 sql database

我有一个表[Users]和另一个表[Administrators]链接1:0..1.合并这些表是最佳做法吗?我已经阅读了很多关于SO的答案,说明拆分表只对一对多的关系是必要的.

我将它们分开的原因是我可以使用AdministratorId而不是一般的UserId来引用管理员.在其他表中,我的字段应该只包含一个管理员,因此它可以作为参考检查.

one*_*hen 5

有一条经验法则规定表可以模拟实体/类或实体/类之间的关系,但不能同时模拟两者.但是,这只是一个经验法则,永远不要说永远!

SQL通常在专用的1:1关系表中存在问题,因为通常发现的唯一的表间约束是外键.但是,FK不要求引用表中存在值.这使得关系1:0..1("一对零或一"),这通常是可接受的.

严格1:1需要解决方法.由于SQL缺少多个赋值,因此解决方法通常涉及诉诸程序代码,例如两个可延迟的"双向"FK; 触发; 通过CRUD存储过程强制更新; 等等

相比之下,在同一个表中建立1:1关系很容易:将两列声明为NOT NULL!

  • @HLGEM:"你在第二张表中使用Fk作为PK" - 这意味着你可以**不超过一个**引用值.但它并没有强制值出现在引用("秒")表中.因此,它是一对一或一,而不是严格一对一.假设这些表是"Orders"和"OrderDetails".业务规则是,"每个订单必须只有一个订单明细." FK是`OrderDetails`引用`Orders`.如果只在"订单"表**中添加一行**,那么FK就满足了,但业务规则却没有. (3认同)

ype*_*eᵀᴹ 4

我认为最好的选择是为两个不同的实体创建两个表,Users并且Administrators,可能具有相同的Primary Key

CREATE TABLE User
( UserId int
, ... other data               --- data for all users
, PRIMARY KEY (UserId)
) ;

CREATE TABLE Administrator
( AdministratorId int
, ... other data               --- data for administrators only
, PRIMARY KEY (AdministratorId)
, FOREIGN KEY AdministratorId
    REFERENCES User(UserId)
) ;
Run Code Online (Sandbox Code Playgroud)

这样,正如您提到的,其他表可以引用AdministratorId

CREATE TABLE OtherTable
( OtherTableId int
, AdministratorId int
, ... other data
, ...
, FOREIGN KEY AdministratorId
    REFERENCES Administrator(AdministratorId)
) ;
Run Code Online (Sandbox Code Playgroud)

好处:

  • 参照完整性的实现很简单。
  • 相关数据(用户和管理员)可以存储在相关表中,因此表中的列和数据更少NULL
  • 与表的行数(可能很大)相比,任何需要JOINtoAdministrator表的查询都只需查找几行User。如果您只有一张表,您最终会得到如下代码:

    WHERE User.admin = True

    这可能不容易优化。