Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 任何可能的新专栏的规则基础看起来都不是个好主意_Mysql_Json_Database_Database Normalization - Fatal编程技术网

Mysql 任何可能的新专栏的规则基础看起来都不是个好主意

Mysql 任何可能的新专栏的规则基础看起来都不是个好主意,mysql,json,database,database-normalization,Mysql,Json,Database,Database Normalization,Python和PHP使JSON验证非常有魅力,所以我们是否需要在MySql端进行JSON验证是值得怀疑的。为什么不同时验证XML、Microsoft Office文档或检查拼写?;) 在表达式或函数中使用这样的列会破坏使用索引来帮助优化查询的任何机会。上面显示的查询被强制执行表扫描 SELECT * FROM t1 WHERE series IN ... 关于“有效访问”的说法具有误导性。这意味着,在查询使用JSON文档检查一行之后,它可以提取字段,而无需解析JSON语法的文本。但仍然需要进行

Python和PHP使JSON验证非常有魅力,所以我们是否需要在MySql端进行JSON验证是值得怀疑的。为什么不同时验证XML、Microsoft Office文档或检查拼写?;)

在表达式或函数中使用这样的列会破坏使用索引来帮助优化查询的任何机会。上面显示的查询被强制执行表扫描

SELECT * FROM t1
WHERE series IN ...
关于“有效访问”的说法具有误导性。这意味着,在查询使用JSON文档检查一行之后,它可以提取字段,而无需解析JSON语法的文本。但仍然需要进行表扫描来搜索行。换句话说,查询必须检查每一行

打个比方,如果我在电话簿上搜索名为“Bill”的人,我仍然必须阅读电话簿中的每一页,即使名字已经突出显示,以便更快地找到他们

MySQL 5.7允许您在表中定义虚拟列,然后在虚拟列上创建索引

ALTER TABLE t1
  ADD COLUMN series AS (JSON_EXTRACT(data, '$.series')),
  ADD INDEX (series);
然后,如果查询虚拟列,它可以使用索引并避免表扫描

SELECT * FROM t1
WHERE series IN ...
这很好,但有点忽略了使用JSON的意义。使用JSON最吸引人的地方是,它允许您添加新属性,而无需更改表。但事实证明,如果要借助索引搜索JSON字段,无论如何都必须定义一个额外的(虚拟)列

但是,您不必为JSON文档中的每个字段定义虚拟列和索引,只需为您想要搜索或排序的字段定义虚拟列和索引。JSON中可能还有其他属性,您只需在选择列表中提取,如下所示:

SELECT JSON_EXTRACT(data, '$.series') AS series FROM t1
WHERE <other conditions>

但我通过测试发现,如果表达式是JSON提取函数,由于某种原因,该功能不起作用。它适用于其他类型的表达式,只是不适用于JSON函数。

Strong不同意其他答案中的一些说法(公平地说,这是几年前的事)

我们怀着健康的怀疑态度,非常谨慎地开始采用JSON字段。随着时间的推移,我们已经添加了更多

这通常描述了我们所处的情况:

  • 就像99%的应用程序一样,我们并没有大规模地做事情。我们使用许多不同的应用程序和数据库,其中大多数都能够在普通硬件上运行
  • 如果性能确实成为一个问题,我们有适当的流程和诀窍来进行更改
  • 我们大致了解哪些表将是大的,并仔细考虑如何为它们优化查询
  • 我们还知道,在哪些情况下,这不是真正需要的
  • 我们非常擅长应用层的数据验证和静态类型
最后,

当我们使用JSON存储复杂数据时,其他表从不直接引用该数据。在热路径中的where子句中,我们也往往不需要使用它们

因此,考虑到所有这些,使用一个小JSON字段而不是一个或多个表可以大大降低查询和数据模型的复杂性。消除这种复杂性可以更容易地编写某些查询,使代码更简单,并且通常可以节省时间

复杂性和性能是需要仔细平衡的。JSON字段不应该盲目地应用,但对于这种情况,这是非常好的

“JSON字段性能不好”是不使用JSON字段的一个有效理由,如果您所在的位置的性能差异很重要

一个具体的例子是,我们有一个存储视频转码设置的表。设置表每行有1个“配置文件”,设置本身的最大嵌套级别为4(数组和对象)

尽管这是一个很大的数据库,但数据库中只有几百条这样的记录。建议将其分为5个表将不会产生任何好处,也会带来很多痛苦

这是一个极端的例子,但我们还有很多其他的例子(行数更多),其中使用JSON字段的决定是几年前的事了,而且还没有引起任何问题


最后一点:现在可以直接在JSON字段上建立索引。

哦,请不要说我认为你在说的话。“你的是一个坏主意的另一个变体。”你给出了一个大答案。但这不是我的问题。我只想知道,如果我们为json数据编写查询,那么我们可能会跳过sql规则。因为我们不需要太多的表,所以现在可以在列中存储更复杂的数据了。小心JSON数据类型支持索引,它有智能大小:64K&4G。那么,如果我想存储2000个数据并添加5个嵌套标签,而不是5个具有关系的表,那么问题出在哪里呢?“我真的很想了解更多有关此功能的信息。”和“MySQL JSON数据类型的优缺点。”都不是问题,如果重新表述为问题太广泛。“所以我从来没有想到MySQL中有复杂的模式结构和外键。我只使用几个表来存储复杂的关系。”这是自相矛盾的,因为JSON不是关系&FKs。对“IsThisGood”的解释只是对关系模型的介绍,所以这一点也太宽泛了。通过一些例子,列出你自己的优点和缺点以及参考资料,并询问你哪里出了错;Mysql内存表不支持JSON数据类型,如数据类型TEXT和BLOB。这意味着,如果需要临时表,它将创建一个基于磁盘的表,而不是内存。使用临时表的一些情况如下所述:@raizmedia您能详细说明为什么基于磁盘的表与内存(我想是基于磁盘的表)相比会出现问题吗?@lapin可能是由于速度限制。@如果您使用PCI 4x 40 Gb/s M.2插槽并插入40 Gb/s支持的驱动器,您可以避免这种情况。这和memmory一样快。您可以对其应用特殊格式
{ "name": "value", "newName": "value" }
UPDATE `JsonTable` SET `JsonColumn` = JSON_SET(`JsonColumn`, "newName", JSON_EXTRACT(`JsonColumn`, "name"))
SELECT * FROM t1
WHERE JSON_EXTRACT(data,"$.series") IN ...
ALTER TABLE t1
  ADD COLUMN series AS (JSON_EXTRACT(data, '$.series')),
  ADD INDEX (series);
SELECT * FROM t1
WHERE series IN ...
SELECT JSON_EXTRACT(data, '$.series') AS series FROM t1
WHERE <other conditions>
SELECT * FROM t1
WHERE JSON_EXTRACT(data,"$.series") IN ...