数据库设计:数据库中两个相关的 table 都引用了第三个 table。如何保证三者关系连贯?
Database design: two related tables in a Database both reference a third table. How to ensure the three relations are coherent?
在我的数据库中,我有三个 table,如下所示:
companies
+------------+
| company_id |
+------------+
agents
+----------+------------+
| agent_id | company_id |
+----------+------------+
customers
+-------------+----------+------------+
| customer_id | agent_id | company_id |
+-------------+----------+------------+
其中每行的第一个 id 是 table 的主键。
规则如下:
- 每个公司都有很多客户
- 每家公司有零个或多个个代理商
- 每个代理只为一家公司工作
- 每个代理与许多客户打交道
- 每个客户只从一家公司购买(假设如此)
- 每个客户可以分配一个与他们打交道的代理人
属性 company_id
in customers
table 可以技术计算如果客户被分配了一个代理(首先我们寻找 agent_id客户,然后是该代理的 company_id)。
但是,如果公司没有代理人 或 如果客户未分配代理人,则 company_id
必须在 customers
table 中明确说明。
如何设计我的数据库,使 customers.company_id
与 agent.company_id
一致,而 agent
来自 customers.agent_id
?
您可以在 agents
中定义一个唯一键,结合 company_id
和 agent_id
。像这样:
alter table agents add constraint unq_agents_company_agent
unique (company_id, agent_id);
然后您将从客户定义一个外键:
alter table customers add constraint fk_customers_agents
foreign key (company_id, agent_id) references agents (company_id, agent_id);
[以上语法非常通用,但可能取决于数据库。]
这应该能保证你指定的条件。
在我的数据库中,我有三个 table,如下所示:
companies
+------------+
| company_id |
+------------+
agents
+----------+------------+
| agent_id | company_id |
+----------+------------+
customers
+-------------+----------+------------+
| customer_id | agent_id | company_id |
+-------------+----------+------------+
其中每行的第一个 id 是 table 的主键。
规则如下:
- 每个公司都有很多客户
- 每家公司有零个或多个个代理商
- 每个代理只为一家公司工作
- 每个代理与许多客户打交道
- 每个客户只从一家公司购买(假设如此)
- 每个客户可以分配一个与他们打交道的代理人
属性 company_id
in customers
table 可以技术计算如果客户被分配了一个代理(首先我们寻找 agent_id客户,然后是该代理的 company_id)。
但是,如果公司没有代理人 或 如果客户未分配代理人,则 company_id
必须在 customers
table 中明确说明。
如何设计我的数据库,使 customers.company_id
与 agent.company_id
一致,而 agent
来自 customers.agent_id
?
您可以在 agents
中定义一个唯一键,结合 company_id
和 agent_id
。像这样:
alter table agents add constraint unq_agents_company_agent
unique (company_id, agent_id);
然后您将从客户定义一个外键:
alter table customers add constraint fk_customers_agents
foreign key (company_id, agent_id) references agents (company_id, agent_id);
[以上语法非常通用,但可能取决于数据库。]
这应该能保证你指定的条件。