我正在创建一个具有用户,问题,答案,评论和投票表的应用程序。不知道这是否是一个好决定,但是我决定将投票表变成一个包含所有其他表的ID的联接表,而不是让每个其他表都有一个vote_count列,因为投票将属于其他所有表。>
投票表如下-
CREATE TABLE vote (
"questionVoteCount" SERIAL,
"answerVoteCount" SERIAL,
"commentVoteCount" SERIAL,
"accountId" INTEGER REFERENCES account(id),
"questionId" INTEGER REFERENCES question(id),
"answerId" INTEGER REFERENCES answer(id),
"commentId" INTEGER REFERENCES comment(id),
PRIMARY KEY ("questionVoteCount", "answerVoteCount",
"commentVoteCount")
);
我的模型看起来像这样-
class Vote {
constructor({
questionVoteCount,
answerVoteCount,
commentVoteCount,
accountId,
questionId,
answerId,
commentId
} = {}) {
this.questionVoteCount =
this.questionVoteCount || VOTE_DEFAULTS.questionVoteCount
this.answerVoteCount = this.answerVoteCount || VOTE_DEFAULTS.answerVoteCount
this.commentVoteCount =
this.commentVoteCount || VOTE_DEFAULTS.commentVoteCount
this.accountId = accountId || VOTE_DEFAULTS.accountId
this.questionId = questionId || VOTE_DEFAULTS.questionId
this.answerId = answerId || VOTE_DEFAULTS.answerId
this.commentId = commentId || VOTE_DEFAULTS.commentId
}
static upVoteQuestion({ accountId, questionId }) {
return new Promise((resolve, reject) => {
pool.query(
`UPDATE vote SET "questionVoteCount" =
"questionVoteCount" + 1 WHERE
"questionId" = $1 AND "accountId" =
$2`,
[questionId, accountId],
(err, res) => {
if (err) return reject(err)
resolve()
}
)
})
}
我希望每个问题/答案/评论都有一个投票数,并且在投票路线上张贴的用户会增加或减少上述任何一项的投票。我该怎么做呢?我觉得我对投票表本身犯了一些错误。我是否应该坚持在每个表中都有一个vote_count列的最初想法?
答案 0 :(得分:1)
您将questionVoteCount
声明为类型SERIAL
,这意味着自动递增。看来您想要将其定义为INTEGER
。
答案 1 :(得分:0)
更新表-感谢alfasin
CREATE TABLE vote (
"questionVoteCount" INTEGER DEFAULT 0 NOT NULL,
"answerVoteCount" INTEGER DEFAULT 0 NOT NULL,
"commentVoteCount" INTEGER DEFAULT 0 NOT NULL,
"accountId" INTEGER REFERENCES account(id),
"questionId" INTEGER REFERENCES question(id),
"answerId" INTEGER REFERENCES answer(id),
"commentId" INTEGER REFERENCES comment(id),
);
不是运行“ UPDATE”语句,而是对“ vosCount”使用1代表upvote,-1代表downvote的'INSERT'对我有用。
现在,我可以运行'SELECT SUM(“ voteCount”)'以获得问题,答案,评论,用户以及其他任何方式的所有票。