Postgresql
確保一列對複合主鍵的引用完整性的更好方法?
給定第一個表
CREATE TABLE table1 ( column1 INTEGER, column2 TEXT, PRIMARY KEY (column1, column2));
SQL 是否有一種慣用的方式來約束
column3
第二個表CREATE TABLE table2 ( column3 INTEGER, column4 TEXT, PRIMARY KEY (column3, column4));
這樣
column3
⊆column1
?我目前的解決方案是這個kludge:
CREATE TABLE table0 ( column0 SERIAL PRIMARY KEY); CREATE TABLE table1 ( column1 INTEGER REFERENCES table0 (column0), column2 TEXT, PRIMARY KEY (column1, column2)); CREATE TABLE table2 ( column3 INTEGER REFERENCES table0 (column0), column4 TEXT, PRIMARY KEY (column3, column4));
我學到了外鍵不能只引用複合主鍵的一個值的艱難方法:https ://stackoverflow.com/questions/3996774/foreign-key-relationship-with-composite-primary-keys-in-sql -伺服器-2005。
如果這很重要,我正在使用 PostgreSQL。
編輯 (2020-04-26)
一條評論建議我添加一個具體的例子。
該表
table1
包含別名。多人可以被命名為“Jane Doe”,任何一個“Jane Doe”也可以被稱為“Jane Smith”和“Jane1990”。每個人都由 中的數字唯一標識column1
。任一列都可以有重複項,但不允許重複行。該表
table2
列出了 中的人出版的書籍table1
,但table1
可以包括從未出版過書籍的人,等等column3
⊆column1
。再次不允許重複行。
在一些複雜的域(銀行、電信)中,名稱始終是實體而不是屬性。一個人可以擁有多個護照(姓名、國籍)我會為您提供的場景創建一個表結構;
create table author ( id integer PRIMARY KEY, default_name_id integer -- you may / may not need this -- , any other author properties ); -- just name aliases create table author_name ( id integer PRIMARY KEY, author_id integer NOT NULL REFERENCES author(id), name text not null, unique (author_id, name) ); alter table author add FOREIGN KEY (default_name_id) REFERENCES author_name (id); create table books( id integer PRIMARY KEY, book_name text ); -- a book can be published by more than one author create table book_publisher ( book_id integer REFERENCES books (id), author_id integer REFERENCES author (id), PRIMARY KEY (book_id, author_id) );
Postgresql 有數組類型。它也非常有用。但是大多數 ORM 不支持它。如果您可以在應用程式碼中使用數組,那麼它就更簡單了;
create table author ( id integer PRIMARY KEY, name text[], -- name[1] is default name. -- , any other author properties );