将外键引用存储到多个表的最佳方法是什么?

时间:2017-01-27 21:33:25

标签: postgresql

我有三张表,赞成票,评论和帖子。由于这里的评论和帖子都可以投票,我现在正在使用:

CREATE TABLE upvotes(
  id PRIMARY KEY,
  post_id INTEGER REFERENCES posts(id),
  comment_id INTEGER REFERENCES comments(id),
  user_id INTEGER REFERENCES users(id),
  time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
)

CREATE TABLE comments(
      id PRIMARY KEY,
      body TEXT,
      user_id INTEGER REFERENCES users(id),
      time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
    )

CREATE TABLE posts(
  id PRIMARY KEY,
  title TEXT,
  body TEXT,
  user_id INTEGER REFERENCES users(id),
  time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
)

是否有某种方式可以在某种视图或表格中将帖子和评论一起表示在一起,我可以更好地从赞成票中引用它。例如。

CREATE TABLE upvotes(
  id PRIMARY KEY,
  item_id INTEGER REFERENCES items(id), /*this could be a post or a comment*/
  user_id INTEGER REFERENCES users(id),
  time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
)

有没有办法创建一个可以实现此目的的表或视图项?有没有更好的方法来对可以被投票的项目组进行分组,使得它们都有自己唯一的主键ID(我被困在这里的原因是因为帖子和注释可能具有相同的主键)。很抱歉,如果这是一个显而易见的问题,我不确定如何在我搜索时说出来,这可能是重复的。

1 个答案:

答案 0 :(得分:0)

这样的事情:

CREATE TABLE comments(
      id PRIMARY KEY,
      body TEXT,
      user_id INTEGER REFERENCES users(id),
      time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
    )

CREATE TABLE posts(
  id PRIMARY KEY,
  title TEXT,
  body TEXT,
  user_id INTEGER REFERENCES users(id),
  time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
)

改为使用:

CREATE TABLE user_input(
  id PRIMARY KEY,
  inputType smallint,
  title TEXT,
  body TEXT,
  user_id INTEGER REFERENCES users(id),
  time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
)

为id,inputType添加索引。