Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
JSON操作与MySQL查询相比,哪一个更能提高效率和减少服务器负载?_Mysql_Json_Database - Fatal编程技术网

JSON操作与MySQL查询相比,哪一个更能提高效率和减少服务器负载?

JSON操作与MySQL查询相比,哪一个更能提高效率和减少服务器负载?,mysql,json,database,Mysql,Json,Database,首先,我知道它们是完全不同的东西,不能直接比较,但让我解释一下我的问题。我想存储投票以及投票,用户只能从向上投票或向下投票中进行选择。我想记录每个动作,这意味着我必须在数据库中存储更多数据 在这种情况下,我有两个选择。我可以创建两个名为faq和faq\u vows的表,其结构如下: 方法1: 常见问题解答表列:id,问题(字符串),答案(文本),创建时间(时间戳)和更新时间(时间戳) 常见问题解答投票表列:id,faq\u id(国外),user\u id(国外)和投票(布尔) 或者我可以将所有

首先,我知道它们是完全不同的东西,不能直接比较,但让我解释一下我的问题。我想存储投票以及投票,用户只能从向上投票向下投票中进行选择。我想记录每个动作,这意味着我必须在数据库中存储更多数据

在这种情况下,我有两个选择。我可以创建两个名为
faq
faq\u vows
的表,其结构如下:

方法1:

常见问题解答表列:
id
问题(字符串)
答案(文本)
创建时间(时间戳)
和更新时间(时间戳)

常见问题解答投票表列:
id
faq\u id(国外)
user\u id(国外)
投票(布尔)

或者我可以将所有内容存储在一个表中,只需在
faq
表中添加两列即可。但在这种情况下,我必须以
JSON
格式存储投票

方法2:

常见问题解答表列:
id
问题(字符串)
答案(文本)
UpVoces(JSON)
DownVoces(JSON)
创建和
更新

示例JSON:
{“总计”:5,“用户”:[3,6,10,12,2]}

在第一种情况下,我会启动大量的MySQL查询来完成我的任务。在第二种情况下,我会发出较少的查询,但我必须发出大量的JSON操作

那么,当我们谈论每月增加数千次操作时,哪个选项更能提高效率和减少服务器负载呢?

您的第二个选择(将投票者的用户ID存储在JSON对象中)比第一个选择差得多

为什么??它不会扩大规模。要记录对某个项目的第50000次投票,您必须读取一个大型JSON对象,对其进行修改,并使用更新操作在数据库中覆盖它。那将需要很长时间

第80000位选民的投票从上到下都发生了什么变化?这样做的操作有多复杂

在您的第一个备选方案中,每次新投票只需插入一个
。。。在重复键更新…
操作中,只需将新行放入投票表。SQL就是这样做的

编辑以这种方式思考此问题:

  • 两个实体:用户和faq
  • 用户和faq之间的一种关系是:投票
实体表将具有
user\u id
faq\u id
唯一标识符,以及应用程序需要的任何其他列

您的关系表称为“投票”
,每次投票将有一行。它将
user\u id
faq\u id
相关联。此关系表需要三列

user_id     PK   FK to user.user_id
faq_id      PK   FK to faq.faq_id
vote        TINYINT   1  or -1
datestamp   TIMESTAMP   the time of casting the vote.
请注意,
vote
表有一个复合主键。这可以防止用户对常见问题进行多次投票

这样的结构为您提供了非常灵活的报告。例如,此查询将查找过去两天投票最多的常见问题解答

 SELECT v.faq_id, SUM(v.vote) votes
   FROM vote v 
  WHERE v.datestamp >= CURDATE() - INTERVAL 2 DAY
  GROUP BY v.faq_id
  ORDER BY SUM(v.vote) DESC
  LIMIT 1
本例为您提供了在过去一周中投下最多反对票的用户

 SELECT v.user_id, u.user_name, COUNT(*) downvotes
   FROM vote v
   JOIN user u ON v.user_id = u.user_id
  WHERE v.vote < 0 
    AND v.datestamp >= CURDATE() - INTERVAL 1 WEEK
  GROUP BY v.user_id, u.user_name
  ORDER BY COUNT(*) DESC
  LIMIT 1
选择v.user\u id、u.user\u name、COUNT(*)下票数
第五票
在v.user\u id=u.user\u id上加入用户u
其中v.vote<0
和v.datestamp>=CURDATE()-间隔1周
按v.user\u id、u.user\u name分组
按计数排序(*)说明
限制1

为什么需要对方法1进行更多查询?使用存储过程,您可以通过一次往返将所有数据传递到MySQL。为什么您认为在这两种情况下会有不同数量的查询?您可以在一个查询中插入多行
插入faq_投票值(null,1,1),(null,1,2),(null,1,3)
,并使用联接从两个表中检索数据,不是多个查询。尽管MySQL现在有内置的JSON函数,但有时要做一些普通连接很容易做到的事情确实很复杂。我不认为它很有用。但是,是的,根据你的说法,在这种情况下,什么样的结构才是好的。