繁体   English   中英

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

[英]How do you structure a database that allows voting similar to how stackoverflow does it?

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

请注意,我并不是在问stackoverflow是如何做到的,而是关于用户体验的概念是如何工作的。

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

是否有更好的方法可以使人们以外行的方式进行解释? 不需要特定的代码...我可能可以在以后的时候弄清楚。 我现在只是在理论化,并建立一个纸模型以供日后使用。

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

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

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

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

用户表非常简单,有趣的部分发生在后台逻辑中。 这显然是非常粗糙的布局,还需要考虑许多其他事项,并且有数十种方法可以完成表格布局。

使用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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM