数据库设计 - 存储所有必需信息的密钥与授权访问时执行连接
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
控制以避免您的表格失调。
在考虑“公司”是否有权查看有关“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
控制以避免您的表格失调。