数据库设计 - 存储所有必需信息的密钥与授权访问时执行连接

Database design - Storing keys to all required information vs performing Joins when authorizing access

在考虑“公司”是否有权查看有关“ClientSale”的信息时,请参考以下示例(仅伪代码)。我可以存储对所有内容的 FK 引用 [选项 B],随着表的增长可以扩展以存储大量引用,或者对查询 [选项 A] 执行连接以进行访问比较。

每种方法的优缺点是什么?还有更好的选择吗?

选项A

CREATE TABLE Company (
  Id,
  ...
)

CREATE TABLE Client (
  Id,
  CompanyId FK
)

CREATE TABLE ClientSale (
  Id,
  ClientId FK
)

选项 B

CREATE TABLE Company (
  Id,
  ...
)

CREATE TABLE Client (
  Id,
  CompanyId FK
)

CREATE TABLE ClientSale (
  Id,
  CompanyId FK,
  ClientId FK
)

编辑

我应该把它分成更多的表格吗[Company_Client & ClientSale_Client & Company_ClientSale] ??

DBMS 期望您的 FK 将形成一个 multi-layer 层次结构,正如您针对选项 A 显示的那样。因此它们针对跨 FK 的 JOIN 查询进行了优化。

根据您的选项 B 在 grand-child 表中重复 FK 的缺点是您现在正在复制信息,更新时需要做额外的工作,并且存在异常风险:您的代码可能 UPDATE Client SET CompanyId = ... 但忘记了至 UPDATE ClientSale WHERE ClientId = ... SET CompanyId = ...。像这样的 co-ordinated UPDATE 也需要 COMMMIT 控制以避免您的表格失调。