Postgresql 有没有基于数据值创建引用完整性的方法?
下面是一个简化的说明Postgresql 有没有基于数据值创建引用完整性的方法?,postgresql,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 departm
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
如果员工值用于租户1,部门ID来自租户2,是否有方法无法将数据插入员工部门?e、 g.其中员工id=1属于租户=1,部门id=2属于租户=2
ID | EMPLOYEED_ID | DEPARTMENT_ID
2 | 1 | 2
是否有办法防止在应用程序或数据库级别插入此类数据。PS>没有使用触发器的空间,不想使用触发器 如果没有触发器,唯一的方法是复制租户id,使其出现在每个表中,并使用复合主约束或唯一约束和复合外键 e、 g.如果您对
员工(租户ID,ID)
和部门(租户ID,ID)
有唯一的约束,您可以添加外键(租户ID,员工ID)引用员工(租户ID,ID)
和外键(租户ID,部门ID)引用部门(租户ID,ID)
这要求联接表包含租户ID
我建议将员工部门的主键定义为(租户ID、部门ID、员工ID)
,并去掉员工部门表上无用的代理键ID
,除非你的工具箱/框架/ORM没有它就无法应付。你想让两个表连接起来吗?。。或者EMPLOYEED\u ID
值始终与DEPARTMENT\u ID
值匹配?BCNF:如果它们是相同的,租户ID是可传递依赖的(取决于DEPARTMENT\u ID),因此您可以将其从employee中删除。对于(尚未)加入任何部门的员工来说,存在一个边缘案例。(注意:如果该员工是两个部门的一部分,则这两个部门应具有相同的租户id。看起来像是4NF问题…)