Mysql 您如何构建一个允许投票的数据库,类似于stackoverflow的工作方式?

Mysql 您如何构建一个允许投票的数据库,类似于stackoverflow的工作方式?,mysql,ruby,database,schema,voting,Mysql,Ruby,Database,Schema,Voting,我对数据库和web开发还不熟悉,但我正在尽我最大的努力学习我的方法,尽管我正在创建自己的动态网站。我正在一步一步地进行,目前正在纸上设计数据模型。我想知道一个人是如何为一个允许投票的网站构建一个数据库的,就像stackoverflow是如何做到的一样?如果有一个包含问题列表的表,则用户创建的每个问题都会添加到此表中。这张表上不能简单地有一个计算选票的字段,因为这将允许一个人拥有无限的选票,对吗?所以应该有一个键连接到另一个统计投票数并跟踪用户的表,这样他们就不能投票两次了,对吗?如果这是真的,这

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

请注意,我不是专门询问stackoverflow是如何实现的,而是询问用户体验的概念是如何工作的

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

有没有更好的方法可以让人用外行的术语来解释?不需要特定的代码。。。到时候我可能会明白的。我现在只是在理论上,然后建立一个纸上模型,以备日后使用

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


注意。数据库设计中的问题的答案决不是“为每一个新的(用户/讨论/任何类型的项目)动态创建一个新表”。如果您认为为每个用户创建一个新表是一个好主意,那么您就犯了一个错误!停下来,想一想如何用一组固定的表格做你想做的事情。

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

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

tblQuestions
    questid
    question
    userid
然后

最后

tblVote
    vote (up or down)
    questid
    answerid
    userid

用户表相当简单,有趣的部分发生在幕后逻辑中。这显然是一个非常粗糙的布局,需要考虑很多其他事情,有几十种方法来完成表布局

使用NOSQL文档方法。(couchdb)

数据库:Stacklike

数据库中的文档类似于:

查看投票计数和总数(统计信息)


尝试谷歌的多对多关系,因为这是问题和用户之间的关系。当涉及到数据库设计时,你需要做的第一件事就是抛开你所有的excel思维。我看到很多数据库都走上了“excel”的道路,结果维护起来一团糟。查找一对多关系、多对多关系和数据库规范化。有些人会认为第一个标准格式是完整的,但我总是发现第三个标准格式是数据完整性和可用性之间的一个很好的折衷。我说的excel样式是指可视化一个表,其中数据库是所有这些excel电子表格的集合。我理解一对多和多对多,但我以前从未听说过db规范化。我将一对多可视化的方式是一个电子表格,其中一列中有一个键,引用另一个电子表格中的数据。这是正确的观点吗?我可视化多对多的方式是两个多对多和第三个表之间的二对一对多关系。规范化基本上是与数据完整性相关的,其中数据在数据库中从不重复。它只能通过外键访问。第一个范式意味着基本上绝对没有重复,因此如果更新表中的一个值,它将通过键传播到所有其他表中。第三范式意味着一些数据重复,但在许多情况下,查询表格会更容易一些。为什么投票表上需要一个questionID和一个answerID?如果有一个字段作为一个全面的“forID”,不是更好吗这可以包含提问ID或回答ID,因为不应该存在投票同时对问题和答案起作用的情况,对吗?你可以这样做,或者为问题投票和回答投票设置单独的表格,或者只有一个表格具有投票类型,以指定它是对问题的投票还是对答案的投票。您将需要一些原因来告诉用户投票的内容,但有很多方法可以实现这一点。正如他们所说,向10名开发人员提问,你会得到12个答案。与使用tw相比,使用带有参考表的单一投票表来确定投票是针对某个问题还是针对某个答案,有什么优势或劣势
tblAnswer
    Answer
    answerid
    userid
    questid 
    accepted (to flag as accepted answer)
tblVote
    vote (up or down)
    questid
    answerid
    userid
{
  "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
}