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

use*_*500 5 ruby mysql database schema voting

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

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

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

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

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

Bri*_*ian 4

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

Questions
Users
Answers
Votes
Run Code Online (Sandbox Code Playgroud)

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

tblQuestions
    questid
    question
    userid
Run Code Online (Sandbox Code Playgroud)

然后

tblAnswer
    Answer
    answerid
    userid
    questid 
    accepted (to flag as accepted answer)
Run Code Online (Sandbox Code Playgroud)

最后

tblVote
    vote (up or down)
    questid
    answerid
    userid
Run Code Online (Sandbox Code Playgroud)

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