我的意思是:
FK1 -> 1FK2 -> 2PK
请注意,1FK2是FK1的PK,但1FK2是FK到2PK。所以嵌套结构中的关键是FK和PK。
一个例子:
--- Like an interface
CREATE TABLE q_content (
user_id SERIAL PRIMARY KEY, ---);
---- tables that refer to it
CREATE TABLE questions (
user_id SERIAL
references q_content(user_id) ---);
CREATE TABLE removed_questions (
user_id SERIAL
references questions(user_id) ---);
答案 0 :(得分:3)
是的,列可以是其表的主键,也可以是父表的外键。
但是,在这种情况下,您无需使用SERIAL
作为questions.user_id
和removed_questions.user_id
的数据类型。 SERIAL
数据类型隐式创建一个新的序列对象,您不需要它,因为这些主键必须只包含它们引用的表中已存在的值。
这也与您的问题相关,但我根本不会定义removed_questions
表。这应该是questions
表中的属性列。
答案 1 :(得分:1)
是
当你尝试使用自然键或大多数自然键时,它很常见 - 子对象的表通常具有“包含”其父键的主键的主键。要扩展您的示例,您可能有:
CREATE TABLE questions
(
user_id INTEGER REFERENCES q_content(user_id),
topic TEXT,
PRIMARY KEY (used_id, topic)
);
-- CREATE TABLE removed_questions (that has the same primary key as questions, which is also a foreign key to questions's primary).
我已经在这里将user_id
更改为INTEGER,因为当它应该与q_content
表中的值相对应时,通常不希望从空中生成它。< / p>
答案 2 :(得分:0)
是的,这是完全合法的,事实上可能相当普遍。