Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 新手数据库设计-“;“堆栈溢出式投票系统”;_Database_Database Design_Relational Database - Fatal编程技术网

Database 新手数据库设计-“;“堆栈溢出式投票系统”;

Database 新手数据库设计-“;“堆栈溢出式投票系统”;,database,database-design,relational-database,Database,Database Design,Relational Database,这是我到目前为止所做的数据库设计的简化版本,用于“堆栈溢出”式投票系统 问题是:如果用户对某个响应的总投票数有一个分数,那么该分数应该“即时”计算出来,还是应该在用户表中有一个字段引用他们的分数。此外,如果情况是后者,建议采用什么方法保持最新 Users Table -id -name -email Question Table -id -text -poster (user id) Responses Table -id -text -question (question id) -pos

这是我到目前为止所做的数据库设计的简化版本,用于“堆栈溢出”式投票系统

问题是:如果用户对某个响应的总投票数有一个分数,那么该分数应该“即时”计算出来,还是应该在用户表中有一个字段引用他们的分数。此外,如果情况是后者,建议采用什么方法保持最新

Users Table
-id
-name
-email

Question Table
-id
-text
-poster (user id)

Responses Table
-id
-text
-question (question id)
-poster (user id)

Votes Table
-id
-response (response id)
-voter (user id)

我建议至少在一开始就根据需要计算出总票数。在开始使用时,需求可能会很低,并且可以在以后更改为存储为Responses表中的字段。如果发生这种情况,请使用触发器更新它。另外,设置一个视图来报告的响应和总计,这样当/如果进行了更改,您就有一个中心位置来进行界面更新,而不是在代码中查找查询

如果需求在开发过程中或在初始发布后发生变化,那么这样做的额外好处是更加灵活。注意特性爬行


还可以删除投票表中的id字段。如果每个投票都是响应和投票人独有的,那么将这些字段设置为表的键就足够了。

我建议至少在开始时根据需要计算出投票总数。在开始使用时,需求可能会很低,并且可以在以后更改为存储为Responses表中的字段。如果发生这种情况,请使用触发器更新它。另外,设置一个视图来报告的响应和总计,这样当/如果进行了更改,您就有一个中心位置来进行界面更新,而不是在代码中查找查询

如果需求在开发过程中或在初始发布后发生变化,那么这样做的额外好处是更加灵活。注意特性爬行


还可以删除投票表中的id字段。如果每个投票对response和voter都是唯一的,那么将这些字段设置为表的键就足够了。

您可能希望模式也允许对问题进行投票(这意味着需要另一个投票表)。我认为在
Users
表中有一个投票总数(声誉)是一个好主意,因为每次要显示用户的声誉时,查询表中的一行要比查询两个表上的总和更有效。您可以通过触发器或业务逻辑来更新它。你还需要考虑你将如何代表赞成票/反对票。您可以在两个投票表中使用位值(表示向上或向下)或绝对数(1/-1)来执行此操作。每次在两个投票表中插入、删除或更新条目时,您都必须调整
Users
表中的总数。通过触发器更新total可能更“简单”,但您也可以认为它应该存在于您的业务逻辑层中,并且人们不应该直接在表中玩。但只要你做出明智的决定,我个人认为这并不重要。

你可能也希望让模式允许对问题进行投票(这意味着需要另一张投票表)。我认为在
Users
表中有一个投票总数(声誉)是一个好主意,因为每次要显示用户的声誉时,查询表中的一行要比查询两个表上的总和更有效。您可以通过触发器或业务逻辑来更新它。你还需要考虑你将如何代表赞成票/反对票。您可以在两个投票表中使用位值(表示向上或向下)或绝对数(1/-1)来执行此操作。每次在两个投票表中插入、删除或更新条目时,您都必须调整
Users
表中的总数。通过触发器更新total可能更“简单”,但您也可以认为它应该存在于您的业务逻辑层中,并且人们不应该直接在表中玩。但是,只要您做出明智的决定,我个人认为这并不重要。

只要您以谨慎和深思熟虑的方式进行操作,就可以对数据库模型进行反规范化,从而使一些关键场景具有更好的性能

因此,对实际数据量进行基准测试并确定动态计票会导致性能问题后,请继续并缓存计票结果

使缓存值保持最新的最可靠的方法可能是实现一个数据库触发器,每当一行被插入到
投票中时,该触发器就会增加缓存值,当一行被删除时,它就会减少缓存值


(注意:使用
SELECT COUNT(*)…
触发器可能会带来微妙的并发问题。)

对数据库模型进行反规范化,这样一些关键场景可以获得更好的性能是合理的,只要您以谨慎和深思熟虑的方式进行

因此,对实际数据量进行基准测试并确定动态计票会导致性能问题后,请继续并缓存计票结果

使缓存值保持最新的最可靠的方法可能是实现一个数据库触发器,每当一行被插入到
投票中时,该触发器就会增加缓存值,当一行被删除时,它就会减少缓存值


(注意:使用
SELECT COUNT(*)…
触发器可能会带来微妙的并发问题。)

您还应该为问题添加投票和书签/收藏夹表。您还应该为问题添加投票和书签/收藏夹表。我将删除投票表上的id,谢谢,用这两个外键的组合键替换它。我将删除投票表上的id,