0

希望我的解释比标题更清楚。我有一组文件。每个文件包含可变数量的论文/表格。所以我有一个名为files的表,带有一个fid。

为了简单起见,假设我们只有 3 种不同的形式,每一种都包含自己的数据集。所以我有 3 个表,FormA、FormB 和 FormC,它们的主键分别是 Aid、Bid 和 Cid。

例如,该文件可以包含 2 个 A 表格和 1 个 B 表格,或每个表格 1 个,或 3 个 A 表格、2 个 B 表格、2 个 C 表格。你明白了,可变数量的表格,并且可能包括超过 1 个相同类型的表格。

如何在 SQL 中正确表示这种关系?如果重要的话,我正在使用 PostGreSQL。

4

1 回答 1

1

在 PostgreSQL 中,我会这样做。注意我使用的是危险的(非初学者/高级)工具,值得了解其中的陷阱。

现在由于这里有许多表,问题是我们如何管理约束。这有点令人费解,但这是我要做的:

CREATE TABLE file (...);
-- add your tables for tracking form data here....
CREATE TABLE file_to_form (
    file_id int NOT NULL;
    refkey int NOT NULL,
    form_class char NOT NULL
    CHECK NOINHERIT (file_id IS NULL)
 );  -- this table will never have anything in it.

 CREATE TABLE file_to_form_a (
    PRIMARY KEY (file_id, refkey, form_class)
    FOREIGN KEY (refkey) REFERENCES file_a (form_id)
    CHECK (form_class = 'a')
 ) INHERITS (file_to_form);

 CREATE TABLE file_to_form_b (
    PRIMARY KEY (file_id, refkey, form_class)
    FOREIGN KEY (refkey) REFERENCES file_b (form_id)
    CHECK (form_class = 'b')
 ) INHERITS (file_to_form);

 -- etc

现在您有一个一致的界面来显示哪些表单与文件相关联,并且可以通过搜索 file_to_form 表找到它们(其功能类似于继承它的所有表的只读视图)。这是 PostgreSQL 的表继承真正有用的情况之一,如果你认真对待这些问题并考虑如何处理它们。

于 2013-11-06T11:47:01.930 回答