我有一个表[Users]和另一个表[Administrators]链接1:0..1.合并这些表是最佳做法吗?我已经阅读了很多关于SO的答案,说明拆分表只对一对多的关系是必要的.
我将它们分开的原因是我可以使用AdministratorId而不是一般的UserId来引用管理员.在其他表中,我的字段应该只包含一个管理员,因此它可以作为参考检查.
有一条经验法则规定表可以模拟实体/类或实体/类之间的关系,但不能同时模拟两者.但是,这只是一个经验法则,永远不要说永远!
SQL通常在专用的1:1关系表中存在问题,因为通常发现的唯一的表间约束是外键.但是,FK不要求引用表中存在值.这使得关系1:0..1("一对零或一"),这通常是可接受的.
严格1:1需要解决方法.由于SQL缺少多个赋值,因此解决方法通常涉及诉诸程序代码,例如两个可延迟的"双向"FK; 触发; 通过CRUD存储过程强制更新; 等等
相比之下,在同一个表中建立1:1关系很容易:将两列声明为NOT NULL!
我认为最好的选择是为两个不同的实体创建两个表,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
这可能不容易优化。
| 归档时间: |
|
| 查看次数: |
1820 次 |
| 最近记录: |