解决与PostgreSQL的循环外键关系

问题描述

我有一个具有以下数据结构的数据库:

用户表:

Id  Name    
1   Alice
2   Bob
3   Charlie

文件夹表:

Id  Name       User
1   Invoices   2
2   Contracts  3
3   Receipts   3

文档表:

Id  Name                  User    Folder
1   Birth Certificate     1       null
2   Fax Machine Receipt   3       3
3   Work NDA              3       2
4   Laptop Invoice        2       1
5   Job Application       2       null

这是我概念化的架构:

enter image description here

这里的想法是用户拥有文档和文件夹,并且这些文档可以可选被分类到文件夹中。我需要一个约束来确保文档只被分类到拥有该文档的同一用户所拥有的文件夹中(即 DOCUMENT(user) = FOLDER(user)),或者一种规范化架构以防止出现以下情况的巧妙方法哪个文档的用户与文件夹的用户不匹配。

解决方法

您可以将 ("user","folder") 设为 "folder" 中的键并在 "document" 中引用它。

CREATE TABLE "user"
             ("id" serial,PRIMARY KEY ("id"));

CREATE TABLE "folder"
             ("id" serial,"user" integer
                     NOT NULL,PRIMARY KEY ("id"),UNIQUE ("id","user"),FOREIGN KEY ("user")
                          REFERENCES "user"
                                     ("id"));

CREATE TABLE "document"
             ("id" serial,"folder" integer,FOREIGN KEY ("user")
                          REFERENCES "user"
                                     ("id"),FOREIGN KEY ("folder","user")
                          REFERENCES "folder"
                                     ("id","user"));

另一种选择是始终为每个用户设置一个默认文件夹,然后只需引用 "folder" 即可处理所有文件夹。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...