使用 PostgreSQL 解决循环外键关系

Solving a circular foreign key relationship with PostgreSQL

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

用户table:

Id  Name    
1   Alice
2   Bob
3   Charlie

文件夹 table:

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

文档table:

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

这是我概念化的架构:

这里的想法是用户拥有文档和文件夹,这些文档可以可选择地分类到文件夹中。我需要一个约束以确保文档仅分类到拥有该文档的同一用户所拥有的文件夹中(即 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,
              "user" integer
                     NOT NULL,
              "folder" integer,
              PRIMARY KEY ("id"),
              FOREIGN KEY ("user")
                          REFERENCES "user"
                                     ("id"),
              FOREIGN KEY ("folder",
                           "user")
                          REFERENCES "folder"
                                     ("id",
                                      "user"));

另一种选择是始终为每个用户设置一个默认文件夹,然后仅通过引用 "folder" 来处理所有文件夹。