如何构建一个允许投票类似于stackoverflow的数据库?

时间:2012-03-12 12:55:59

标签: mysql ruby database schema voting

我是数据库和网络开发的新手,但我正在努力学习自己的方式,尽管我自己的动态网站。我正在逐步采用它,目前正在设计纸上的数据模型。我想知道如何构建一个允许投票的网站数据库,就像stackoverflow一样?如果有一个包含问题列表的表,则用户创建的每个问题都会添加到此表中。不能简单地在这张桌子上有一个字段来计票,因为那样一个人可以拥有无​​限制的投票权吗?所以应该有一个连接到另一个表的密钥,该表计算投票并跟踪用户,因此他们不能投票两次,对吗?如果这是真的,那就是我感到困惑的部分。每个答案也可以投票。这是否意味着当用户提交答案时,除了将答案添加到可能是针对每个问题的答案的单独表格之外,模型还必须在运行时动态生成每个答案的新表格以跟踪所有答案这些票?

请注意,我并没有具体询问stackoverflow是如何做到的,而是用户体验的概念如何运作。

我还想做的一件事就是查询单个用户的活动,因此如果必须为每个提交的数据动态创建所有这些表,那么随着时间的推移创建表的垃圾负载,就不会是否真的很慢必须解析每个表以检查特定用户是否提交了任何数据或投票?

有没有更好的方法来做这个,有人可以用非专业术语解释?不需要特定的代码......我可以在以后的时间里找到它。我现在正在理论化,并建立纸模型以便以后工作。

编辑:哦,我明白了。当我想到数据库表时,我认为在excel类似的电子表格中,如果我的理解是错误的,请纠正我。因此,网站范围内的每个投票都在一张桌子上(在电子表格中垂直列出),每个投票都有一行数据(水平),将投票链接到各种所有者(用户和问题或答案)?那是对的吗?我说问题或答案是因为我不理解将它们都作为投票属性(不确定这是否是正确的术语)而不是为答案和问题创建两个单独的投票数据的情况。被投票。基本上我看到它的方式,每一行代表一个投票,有3个字段,1。值(+1或-1),2。从谁(用户名),3。到什么(问题或答案)。

3 个答案:

答案 0 :(得分:3)

CREATE TABLE "QuestionVote" (
    "Question" INT NOT NULL, -- To identify the question being voted on
    "User" INT NOT NULL, -- To identify the user who is casting their vote
    "Vote" SMALLINT NOT NULL CHECK ("Vote" = 1 OR "Vote" = -1),
    PRIMARY KEY ("Question", "User"),
    CONSTRAINT "Constr_QuestionVote_Question"
        FOREIGN KEY "QuestionVote_Question" ("Question")
        REFERENCES "Question" ("ID"),
    CONSTRAINT "Constr_QuestionVote_User"
        FOREIGN KEY "QuestionVote_User" ("User")
        REFERENCES "User" ("ID")
)

NB。数据库设计中的问题的答案永远不是“为每个新的(用户/讨论/任何类型的项目)动态创建新表”。如果您认为为每个用户创建一个新表是个好主意,那么您就犯了一个错误!停止并弄清楚如何使用一组固定的表来执行您想要做的事情。

答案 1 :(得分:3)

您必须查看所有元素。基本上你有

Questions
Users
Answers
Votes

用户与问题和答案以及投票相关联,因此您需要足够的外键来处理此问题或连接这些的子表。例如,你可以

tblQuestions
    questid
    question
    userid

然后

tblAnswer
    Answer
    answerid
    userid
    questid 
    accepted (to flag as accepted answer)

最后

tblVote
    vote (up or down)
    questid
    answerid
    userid

用户表非常简单,有趣的部分发生在幕后逻辑中。这显然是一个非常粗略的布局,还需要考虑很多其他事情,并且有很多方法可以完成表格布局。

答案 2 :(得分:0)

使用NOSQL文档方法。 (CouchDB的)

数据库: Stacklike

数据库中的文档 Stacklike

{
  "type": "question",
  "user": "<userid>"
  ...
}

{
  "type": "answer",
  "user": "<userid>",
  "question": "<questionid>"
  ...
}

{
  "type": "vote",
  "user": "<userid>",
  "question": "<questionid>",
  "weight": "<weight>"
  ...
}

{
  "type": "user",
  ...
}

查看:

列出投票,按问题排序

map(doc){
  if (doc.type === 'vote'){
    emit(doc.questionid, doc)
}

查看投票计数和总计(统计数据)

map(doc){
  if (doc.type === 'vote'){
    emit(doc.questionid, doc.weight)
}
reduce(keys,values, rereduce){
  _stats
}