json数据类型的用例

waxmsbnn  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(510)

我正在为一个网站创建一个数据库模式,用户可以在上面编写 Articles . 我几乎完成了设计,突然我读了一些博客上 JSON datatypeMySQL .
根据博客,有一些用例 JSON 可用于:
用于存储元数据。e、 g高度、宽度、颜色存储为json的产品。
用于存储非标准模式类型数据
用于将标记存储为json。e、 g这个问题可以有标签-mysql,json。所以博客推荐使用json结构来保存所有 tags .
最后一个对我来说是可疑的。为什么?
好的,我将标记值存储在json中 {"tags": ["mysql", "JSON", "mysql-datatype"]} . 我同意这有助于轻松维护文章的标签。
但是假设一个用户想阅读所有与 mysql 标签!!如果我有一张单独的table article_id - tags_id ,我可以很容易地得到所有的 Articles 基于 tags . 但与 JSON 这可能是一个非常繁忙的要求,虽然这可以解决,但成本。当然,查询速度较慢。
这是我的文章模式:

我的思维方式是正确的还是遗漏了什么?喜欢听一些建议。

64jmpszr

64jmpszr1#

我自己还没有使用它,但据我所知,我不会对您希望查找/筛选的项使用json。例如:我将使用它存储一个json配置,其中配置模式可能经常更改(意味着没有db模式更改)。
但是看起来mysql确实有在json中搜索的功能,https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html JSON_CONTAINS(target, candidate[, path]) 与索引字符串列相比,不确定此列的效率。

jdzmm42g

jdzmm42g2#

您尝试执行的任务,将文章与标记关联起来,作为多对多关系处理得更好。为此,你需要另一张table,我相信这是最好的 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在article表中存储标记,则执行相同的操作是不同的:

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

这似乎更简单,因为它不需要连接。
但是,任何将需要搜索的列放在函数调用中的搜索都不能使用索引。这将导致表扫描,因此查询将始终搜索表中的每一行。随着表的增长,搜索“艰难的方式”的速度会越来越慢
第一种方法是 article_tags 表以两种方式使用索引:
在中查找条目 article_tags 快速匹配所需标签
快速按主键查找相应的文章
不需要表扫描。查询只读取将在查询结果中出现的行。
我对json数据类型和json函数的理解遵循以下一般规则:
在select列表中引用json列,但在where子句中不引用。
也就是说,如果可以使用非json列在where子句中执行搜索条件,就可以利用索引使查询尽可能高效。
一旦以这种方式找到了相关行,就可以提取json数据的一部分以返回结果。与在表扫描中搜索json文档的成本相比,从与搜索匹配的行上的json文档中提取字段的成本相对较小。
除非行与搜索条件匹配,否则不会对选择列表求值。

相关问题