2

我正在为用户可以在其上编写Articles. 我几乎完成了设计,突然间我JSON datatypeMySQL.
根据博客,JSON可以使用某些用例:

  1. 用于存储元数据。例如,产品的高度、宽度、颜色存储为 JSON。
  2. 用于存储非标准模式类型数据
  3. 用于将标签存储为 JSON。例如,这个问题可能有标签 - mysql、JSON。因此,博客建议使用包含所有tags.

最后一个让我怀疑。为什么?
好的,我已将 JSON 中的标签值存储为{"tags": ["mysql", "JSON", "mysql-datatype"]}. 我同意这有助于轻松维护文章的标签。
但是假设用户想要阅读所有与mysql标签相关的文章!如果我一直为article_id-维护一个单独的表tags_id,我可以轻松地获得所有Articles基于tags. 但这JSON可能是一个非常繁忙的要求,尽管这可以解决但需要付出代价。当然查询速度较慢。
这是我的文章模式: 在此处输入图像描述 我的思维方式是正确的还是我在这里遗漏了什么?喜欢听一些建议。

4

2 回答 2

4

您尝试执行的任务是将文章与标签关联起来,最好将其作为多对多关系处理。为此,您需要另一个表格,我相信它是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 文档中提取字段的成本相对较小。

除非它们与搜索条件匹配,否则不会评估选择列表的行。

于 2018-08-13T22:55:46.893 回答
0

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

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

JSON_CONTAINS(target, candidate[, path])

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

于 2018-08-13T21:27:59.730 回答