我正在为一个网站创建一个数据库模式,用户可以在该网站上编写Articles。我几乎完成了设计,突然间,我在JSON datatype上读到了很少的MySQL博客。
根据博客,有一些可以使用JSON的用例:
tags的JSON结构。最后一个对我来说是可疑的。为什么?
好的,我已经将标记值以{"tags": ["mysql", "JSON", "mysql-datatype"]}的形式存储在JSON中。我同意这有助于轻松维护标签与文章。
但是假设一个用户想要阅读所有与mysql标签相关的文章!如果我为article_id - tags_id维护了一个单独的表,我可以很容易地得到所有基于tags的Articles。但是对于JSON来说,这可能是一个非常繁忙的需求,尽管这是可以解决的,但需要付出代价。当然,查询速度较慢。
这是我的文章模式:

我的思维方式正确吗?还是我在这里漏掉了什么?我很想听听一些建议。
发布于 2018-08-13 22:55:46
你想要做的任务,把文章和标签联系起来,作为一种多到多的关系来处理更好。为此,您需要另一个表,我认为它是图表中的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')这看起来可能更简单,因为它不需要连接。
但是,将需要搜索的列放在函数调用中的任何搜索都不能使用索引。这将导致表扫描,因此查询将始终搜索表中的每一行。随着表的增长,执行“艰难之路”搜索的速度会越来越慢。
article_tags表的第一个方法使用索引的两种方法:
article_tags中快速查找匹配所需标记的条目不需要扫描桌子。查询只读取将在查询结果中的行。
我对JSON数据类型和JSON函数的看法遵循以下一般规则:
在select列表中引用JSON列,但不引用WHERE子句.
也就是说,如果可以使用非JSON列在WHERE子句中执行搜索条件,则可以利用索引使查询尽可能高效。
一旦找到了相关的行,就可以提取部分JSON数据以返回结果。与在表扫描中搜索JSON文档相比,从与搜索匹配的行上的JSON文档中提取字段的成本相对较小。
除非行与搜索条件匹配,否则不对行计算选择列表.
发布于 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])
与索引字符串列相比,不确定此方法的效率。
https://stackoverflow.com/questions/51830526
复制相似问题