【问题标题】:How to define sql relationship to variable number of tables如何定义与可变数量表的sql关系
【发布时间】:2013-08-07 04:45:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我没有时间写出正确的答案,但这些关键字可能会对您有所帮助:多态关联、不相交的子类型。这在 SO 上被回答了几次,例如:stackoverflow.com/questions/561576/…stackoverflow.com/questions/7947218/…
  • 可能会添加一个名为files 的表,其中将包含文件的ID(以及与所有表单相关的任何其他数据),并且只需将每个表单表中的FK 添加到主表。

标签: sql postgresql foreign-keys normalization


【解决方案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 的表继承真正有用的情况之一,如果您认真对待这些问题并考虑如何处理它们。

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2016-11-01
    相关资源
    最近更新 更多