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