有什么方法可以根据数据值创建参照完整性?

时间:2015-08-21 03:26:22

标签: postgresql

以下是简化说明

TABLE : EMPLOYEE (TENANT_ID is a FK)
ID   |    NAME   | TENANT_ID   
1    | John      |  1

TABLE DEPARTMENT
ID   |   NAME  | TENANT_ID
1    | Physics | 1
2    | Math    | 2


TABLE : EMPLOYEE_DEPARTMENTS (Join between employee and department)
ID | EMPLOYEE_ID   | DEPARTMENT_ID 
1  | 1             | 1

如果EMPLOYEE值为TENANT 1且DEPARMENT_ID来自TENANT 2,是否有办法将数据插入EMPLOYEE_DEPARTMENTS?例如employee_id = 1属于tenant = 1而department_id = 2属于tenant = 2

ID |  EMPLOYEED_ID  | DEPARTMENT_ID
2  |   1            | 2

有没有办法在app或db级别阻止此类数据插入。 PS>没有使用触发器的空间,也不想使用触发器。

1 个答案:

答案 0 :(得分:1)

没有触发器,唯一的方法是复制租户ID,使其出现在每个表中,并使用复合主要或唯一约束和复合外键。

e.g。如果您在UNIQUEEMPLOYEE(TENANT_ID, ID)上有DEPARTMENT(TENANT_ID, ID)约束,则可以添加FOREIGN KEY (TENANT_ID, EMPLOYEE_ID) REFERENCES EMPLOYEE (TENANT_ID, ID)FOREIGN KEY (TENANT_ID, DEPARTMENT_ID) REFERENCES DEPARTMENT (TENANT_ID, ID)

这要求连接表包含TENANT_ID

我建议将PRIMARY_KEY的{​​{1}}定义为EMPLOYEE_DEPARTMENTS并删除(TENANT_ID, DEPARTMENT_ID, EMPLOYEE_ID)表上无用的代理键ID,除非您的工具包/没有它,框架/ ORM无法应对。