我正在为用户可以在其上编写Articles
的网站上创建数据库模式。设计几乎完成了,突然间我在JSON datatype
的{{1}}上读了几个博客。
根据博客,在某些情况下可以使用MySQL
:
JSON
。最后一个对我来说值得怀疑。为什么?
好的,我已经将标记值存储在JSON中,为tags
。我同意这有助于轻松维护文章中的标签。
但是,假设用户想阅读与{"tags": ["mysql", "JSON", "mysql-datatype"]}
标签相关的所有文章!如果为mysql
-article_id
维护了一个单独的表,则可以很容易地基于tags_id
获得所有Articles
。但是使用tags
可能是一个非常繁忙的要求,尽管可以解决但要付出一定的代价。较慢的课程查询。
这是我的文章架构:
我的思维方式是否正确,或者我在这里缺少什么?很高兴听到一些建议。
答案 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
表的方法使用两种索引方式:
article_tags
中与所需标签匹配的条目无需表格扫描。该查询仅读取查询结果中将要包含的行。
我对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])
不确定与索引字符串列相比,此方法的效率。