以下是简化说明
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>没有使用触发器的空间,也不想使用触发器。
答案 0 :(得分:1)
没有触发器,唯一的方法是复制租户ID,使其出现在每个表中,并使用复合主要或唯一约束和复合外键。
e.g。如果您在UNIQUE
和EMPLOYEE(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无法应对。