【发布时间】:2017-12-29 22:58:12
【问题描述】:
首先,我知道它们是完全不同的东西,不能直接比较,但让我解释一下我的问题。我想存储民意调查以及用户只能从 Upvote 或 Downvote 中选择的投票。我想记录每一个动作,这意味着我必须在数据库中存储更多数据。
在这种情况下,我有两个选择。我可以创建两个名为 faq 和 faq_votes 的表,其结构如下:
方法一:
常见问题表列:
id、question(string)、answer(text)、created_at(timestamp)和updated_at(timestamp)faq_votes 表格列:
id、faq_id(foreign)、user_id(foreign)和vote(boolean)
或者我可以将所有内容存储在一个表中,我只需在faq 表中添加两列。但在这种情况下,我必须以JSON 格式存储投票。
方法二:
常见问题表列:
id、question(string)、answer(text)、upvotes(JSON)、downvotes(JSON)、created_at和updated_at示例 JSON:
{ "total": 5, "users":[ 3,6,10,12,2 ] }
在第一种情况,我会触发大量的 MySQL 查询来完成我的工作。 在第二种情况下,我会触发更少的查询,但我将不得不触发大量 JSON 操作。
那么,当我们谈论每月增加数千次操作时,哪个选项更能提高效率并减少服务器负载?
【问题讨论】:
-
为什么方法 1 需要更多查询?使用存储过程,您可以一次往返将所有数据传递给 MySQL。
-
为什么你认为这两种情况下查询的数量会不同?
-
您可以在单个查询中插入多行
INSERT INTO faq_votes VALUES (null, 1, 1), (null, 1, 2), (null, 1, 3) -
从两个表中检索数据是通过连接完成的,而不是多个查询。
-
虽然 MySQL 现在已经内置了 JSON 函数,但是有时候用普通的 join 很容易做一些事情确实很复杂。我不相信它很有用。