首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql JSON数据类型的用例

MySql JSON数据类型的用例
EN

Stack Overflow用户
提问于 2018-08-13 21:03:43
回答 2查看 2.3K关注 0票数 2

我正在为一个网站创建一个数据库模式,用户可以在该网站上编写Articles。我几乎完成了设计,突然间,我在JSON datatype上读到了很少的MySQL博客。

根据博客,有一些可以使用JSON的用例:

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

最后一个对我来说是可疑的。为什么?

好的,我已经将标记值以{"tags": ["mysql", "JSON", "mysql-datatype"]}的形式存储在JSON中。我同意这有助于轻松维护标签与文章。

但是假设一个用户想要阅读所有与mysql标签相关的文章!如果我为article_id - tags_id维护了一个单独的表,我可以很容易地得到所有基于tagsArticles。但是对于JSON来说,这可能是一个非常繁忙的需求,尽管这是可以解决的,但需要付出代价。当然,查询速度较慢。

这是我的文章模式:

我的思维方式正确吗?还是我在这里漏掉了什么?我很想听听一些建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-13 22:55:46

你想要做的任务,把文章和标签联系起来,作为一种多到多的关系来处理更好。为此,您需要另一个表,我认为它是图表中的article_tags表。

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

代码语言:javascript
复制
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在项目表中存储标记,则执行相同的操作是不同的:

代码语言:javascript
复制
SELECT ...
FROM article AS a
WHERE JSON_CONTAINS(a.article_tags, '1234')

这看起来可能更简单,因为它不需要连接。

但是,将需要搜索的列放在函数调用中的任何搜索都不能使用索引。这将导致表扫描,因此查询将始终搜索表中的每一行。随着表的增长,执行“艰难之路”搜索的速度会越来越慢。

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

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

不需要扫描桌子。查询只读取将在查询结果中的行。

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

在select列表中引用JSON列,但不引用WHERE子句.

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

一旦找到了相关的行,就可以提取部分JSON数据以返回结果。与在表扫描中搜索JSON文档相比,从与搜索匹配的行上的JSON文档中提取字段的成本相对较小。

除非行与搜索条件匹配,否则不对行计算选择列表.

票数 4
EN

Stack Overflow用户

发布于 2018-08-13 21:27:59

我自己还没有使用它,但据我所知,对于您希望查找/筛选的项,我不会使用JSON。例如:我使用它来存储一个JSON配置,其中配置模式可能经常更改(意味着没有任何DB模式更改)。

然而,看起来MySQL确实有在JSON,https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html中搜索的函数

JSON_CONTAINS(target, candidate[, path])

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51830526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档