我正在PostgreSQL中构建一个评论系统,我可以在我已经拥有的不同实体(例如产品,文章,照片等)上发表评论(以及“喜欢它们”)。目前,我想出了这个:
(注意::comment_board和product / article / photo之间的外键在这里非常松散.ref_id只是存储id,它与comment_board_type一起使用以确定哪个这是表)
显然,这似乎不是良好的数据完整性。我能做些什么才能让它更好的完整性?此外,我知道每个产品/文章/照片都需要一个comment_board。这是否意味着我对每个产品/文章/照片实体实施了comment_board_id,例如:?
我确实认识到这个SO解决方案,但它让我第二次猜测超类型及其复杂性:Database design - articles, blog posts, photos, stories
感谢任何指导!
答案 0 :(得分:0)
我最后只是将评论直接指向产品/照片/文章字段。以下是我提出的总体内容
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)
);
导致:
这使得我必须少做一个连接到中间表。此外,它允许我添加一个字段并轻松更新约束。