我最終直接將評論指向產品/照片/文章字段。以下是我在總
CREATE TABLE comment (
id SERIAL PRIMARY KEY,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT (now()),
updated_at TIMESTAMP WITH TIME ZONE,
account_id INT NOT NULL REFERENCES account(id),
text VARCHAR NOT NULL,
-- commentable sections
product_id INT REFERENCES product(id),
photo_id INT REFERENCES photo(id),
article_id INT REFERENCES article(id),
-- constraint to make sure this comment appears in only one place
CONSTRAINT comment_entity_check CHECK(
(product_id IS NOT NULL)::INT
+
(photo_id IS NOT NULL)::INT
+
(article_id IS NOT NULL)::INT
= 1
)
);
CREATE TABLE comment_likes (
id SERIAL PRIMARY KEY,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT (now()),
updated_at TIMESTAMP WITH TIME ZONE,
account_id INT NOT NULL REFERENCES account(id),
comment_id INT NOT NULL REFERENCES comment(id),
-- comments can only be liked once by an account.
UNIQUE(account_id, comment_id)
);
想出了在所得:
![enter image description here](https://i.stack.imgur.com/ZgnVj.png)
這就讓我必須做的少了一個加入到中介表。另外,它可以讓我添加一個字段並輕鬆更新約束。
您可能會發現對此有用的繼承(http://www.postgresql.org/docs/current/static/ddl-inherit.html)。 –
@GordonLinoff你認爲產品/文章/照片會繼承comment_board嗎?看起來像postgres繼承的問題之一是它不能對子項進行索引/ FK約束。也許沒什麼大不了的。 我正在考慮將comment_board更改爲「實體」,然後結尾爲:實體(entity_id PK,created_at,updated_at)和產品(id,created_at,updated_at,entity_id)'和comment(id PK,entity_id REFERENCES實體(entity_id),...)''。我不知道該怎麼做的唯一事情就是在事實之後繼承其他表 – Handonam