Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 有没有基于数据值创建引用完整性的方法?_Postgresql - Fatal编程技术网

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问题…)