为不同类型的实体构建评论系统

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。此外,它让我可以轻松添加字段并更新约束。