为不同类型的实体构建评论系统
Building comment system for different types of entities
我正在 PostgreSQL 中构建一个评论系统,我可以在其中对我已有的不同实体(例如产品、文章、照片等)发表评论(以及 "liking" 它们)。目前,我想到了这个:
(注意:comment_board和product/article/photo之间的外键在这里很松散。ref_id只是存储 id,与 comment_board_type 一起使用以确定它是哪个 table)
显然,这看起来不像良好的数据完整性。我该怎么做才能让它更完整?另外,我知道每个 product/article/photo 都需要一个 comment_board。这是否意味着我为每个 product/article/photo 实体实现了一个 comment_board_id?:
我确实认识这个 SO 解决方案,但它让我再次猜测超类型及其复杂性:Database design - articles, blog posts, photos, stories
感谢任何指导!
我最后只是将评论直接指向 product/photo/article 字段。这是我总共想到的
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)
);
导致:
这使得我不得不少做一个与中介的连接table。此外,它让我可以轻松添加字段并更新约束。
我正在 PostgreSQL 中构建一个评论系统,我可以在其中对我已有的不同实体(例如产品、文章、照片等)发表评论(以及 "liking" 它们)。目前,我想到了这个:
(注意:comment_board和product/article/photo之间的外键在这里很松散。ref_id只是存储 id,与 comment_board_type 一起使用以确定它是哪个 table)
显然,这看起来不像良好的数据完整性。我该怎么做才能让它更完整?另外,我知道每个 product/article/photo 都需要一个 comment_board。这是否意味着我为每个 product/article/photo 实体实现了一个 comment_board_id?:
我确实认识这个 SO 解决方案,但它让我再次猜测超类型及其复杂性:Database design - articles, blog posts, photos, stories
感谢任何指导!
我最后只是将评论直接指向 product/photo/article 字段。这是我总共想到的
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)
);
导致:
这使得我不得不少做一个与中介的连接table。此外,它让我可以轻松添加字段并更新约束。