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

时间:2016-02-27 02:17:09

标签: database postgresql relational-database data-modeling datamodel

我正在PostgreSQL中构建一个评论系统,我可以在我已经拥有的不同实体(例如产品,文章,照片等)上发表评论(以及“喜欢它们”)。目前,我想出了这个:

注意::comment_board和product / article / photo之间的外键在这里非常松散.ref_id只是存储id,它与comment_board_type一起使用以确定哪个这是表)

Solution 1

显然,这似乎不是良好的数据完整性。我能做些什么才能让它更好的完整性?此外,我知道每个产品/文章/照片都需要一个comment_board。这是否意味着我对每个产品/文章/照片实体实施了comment_board_id,例如:?

Solution 2

我确实认识到这个SO解决方案,但它让我第二次猜测超类型及其复杂性:Database design - articles, blog posts, photos, stories

感谢任何指导!

1 个答案:

答案 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)
);

导致:

enter image description here

这使得我必须少做一个连接到中间表。此外,它允许我添加一个字段并轻松更新约束。