MySql JSON数据类型的用例

时间:2018-08-13 21:03:44

标签: mysql mysql-json

我正在为用户可以在其上编写Articles的网站上创建数据库模式。设计几乎完成了,突然间我在JSON datatype的{​​{1}}上读了几个博客。
根据博客,在某些情况下可以使用MySQL

  1. 用于存储元数据。例如具有高度,宽度, 颜色存储为JSON。
  2. 用于存储非标准架构类型数据
  3. 用于将标签存储为JSON。例如,这个问题可能有标签- mysql,JSON。因此,博客建议使用JSON结构, 拥有所有JSON

最后一个对我来说值得怀疑。为什么?
好的,我已经将标记值存储在JSON中,为tags。我同意这有助于轻松维护文章中的标签。
但是,假设用户想阅读与{"tags": ["mysql", "JSON", "mysql-datatype"]}标签相关的所有文章!如果为mysql-article_id维护了一个单独的表,则可以很容易地基于tags_id获得所有Articles。但是使用tags可能是一个非常繁忙的要求,尽管可以解决但要付出一定的代价。较慢的课程查询。
这是我的文章架构: enter image description here 我的思维方式是否正确,或者我在这里缺少什么?很高兴听到一些建议。

2 个答案:

答案 0 :(得分:1)

您尝试执行的将文章与标签关联的任务最好以多对多关系处理。为此,您需要另一个表,我相信它是图表中的article_tags表。

这使得查询带有给定标签的所有文章变得容易。

SELECT ...
FROM article AS a
JOIN article_tags AS t USING (article_id)
WHERE t.topic_id = 1234 -- whatever is the id for the topic you want to read

如果您使用JSON将标记存储在商品表中,则做相同的事情是不同的:

SELECT ...
FROM article AS a
WHERE JSON_CONTAINS(a.article_tags, '1234')

这似乎更简单,因为它不需要JOIN。

但是任何将需要搜索的列放在函数调用中的搜索都将无法使用索引。这将导致进行表扫描,因此查询将始终搜索表中的每一行。随着表的增长,以“困难的方式”进行搜索的速度将越来越慢。

第一个带有article_tags表的方法使用两种索引方式:

  1. 快速查找article_tags中与所需标签匹配的条目
  2. 通过主键快速查找相应文章

无需表格扫描。该查询仅读取查询结果中将要包含的行。

我对JSON数据类型和JSON函数的看法遵循以下一般规则:

在选择列表中引用JSON列,但不在WHERE子句中。

也就是说,如果您可以使用非JSON列在WHERE子句中执行搜索条件,则可以利用索引来使查询尽可能高效。

一旦以这种方式找到了相关行,则可以提取部分JSON数据以返回结果。与在表扫描中搜索JSON文档的成本相比,从符合搜索条件的行上的JSON文档中提取字段的成本相对较低。

除非行与搜索条件匹配,否则不对选择列表进行评估。

答案 1 :(得分:0)

我还没有使用过它,但是据我了解,我不会将JSON用于您要查找/过滤的项目。例如:我将使用它来存储JSON配置,其中配置架构可能会经常更改(这意味着数据库架构不会更改)。

但是,看起来MySQL确实具有在JSON https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html

中进行搜索的功能

JSON_CONTAINS(target, candidate[, path])

不确定与索引字符串列相比,此方法的效率。