Mysql 有没有办法在SQL中使用json对象

Mysql 有没有办法在SQL中使用json对象,mysql,json,database-design,architecture,Mysql,Json,Database Design,Architecture,问题是: 我们有一个MySQL数据库,其中存储JSON字符串。到目前为止,这还没有问题,但突然我们的客户要求我们对这些对象执行搜索/订购/其他操作。由于项目处于相当晚的状态,团队负责人不想选择Mongo,所以我想问有没有一种快速的方法来使用这些JSON字符串?JSON作为意图 在MySQL中无法使用JSON。有些DBMS可能支持JSON,但这是不可能的,而且,任何类型的“支持”都只是执行一些特定于JSON的操作,而不是建模您的架构(这两件事完全不同),更确切地说,是模型概念(即关系)因为MySQ

问题是:


我们有一个MySQL数据库,其中存储JSON字符串。到目前为止,这还没有问题,但突然我们的客户要求我们对这些对象执行搜索/订购/其他操作。由于项目处于相当晚的状态,团队负责人不想选择Mongo,所以我想问有没有一种快速的方法来使用这些JSON字符串?

JSON作为意图

在MySQL中无法使用JSON。有些DBMS可能支持JSON,但这是不可能的,而且,任何类型的“支持”都只是执行一些特定于JSON的操作,而不是建模您的架构(这两件事完全不同),更确切地说,是模型概念(即关系)因为MySQL不同于JSON:作为一个关系型DBMS,它遵循,JSON是完全不同的格式。您将它存储为普通字符串值,因此,如果不使用字符串函数,就不可能以其他方式对其进行任何处理。所以,即使使用JSON,您也不会在关系模型中这样做,因此,不可能维护关系特性,例如引用完整性

解决方案选项

您有几个选择:

  • 迁移到Postgree SQL,因为它扩展了对json的支持,自9.4版以来,它的速度更快。这可能是最好的选择,因为它是RDBMS,因此迁移不会像真正面向文档的DBMS那样困难
  • 或者现在就迁移到Mongo(如果这是你的意图的话),否则就太晚了。考虑到Mongo与RDBMS完全不同,它是面向文档的。我想这对你的项目和你的客户来说都是最好的选择(你的任务就是解释这一点)
  • 更改整个体系结构,这样您就不会存储JSON对象,并且可以使用规范化(关系数据库)实体。这意味着——是的,所有代码的整个重构,所有关系的改变等等。在实际情况中,这只是一个理论上的选择,你们既不会得到时间也不会得到金钱
  • 为MySQL实现您自己的JSON库。难吗?取决于您将如何使用JSON,但它是公共格式,所以您至少知道该怎么做。您可以作为用户使用,也可以在用户处使用(语句也是如此)。当然,这需要特定的技能和时间。坏东西:虫子。即使您能够以比重新构建体系结构或迁移到Mongo更快的速度创建这些功能,您也永远无法确定这些功能的质量。没有办法对代码进行本地测试。然而,我可能会给出一些关于用户土地函数的提示——如果您的MySQL是5.6或更高版本,您可以使用它来测试存储的代码(好吧,我已经编写了这个工具,但是..它可能也包含bug)
标准功能

最后,如果您运行的是MySQL 5.7,那么可能会有一线希望-因此,您可以尝试使用JSON功能的alfa版本,该版本目前适用于MySQL 5.7。但我不(强烈)建议在实际项目中使用它,因为这些功能既没有经过良好测试,也根本不完整。但是,要安装这些功能,您需要下载相应的软件包,然后将其插入服务器,如:

CREATE FUNCTION json_append       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_valid        RETURNS integer SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_extract      RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_replace      RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_remove       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_set          RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_merge        RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_search       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_contains_key RETURNS integer SONAME 'libmy_json_udf.so';

然后你就可以试试了

如果您不使用任何特定于MySQL的功能,您可以相对轻松地切换到PostgreSQL,并利用其JSONB数据类型

如果您查看了,那么您将看到,通过这个,您可以存储原始JSON并对其进行查询。例如,给定此JSON结构(我将PostgreSQL特定的列类型替换为标准类型,JSONB类型除外:

table booksdata ( 
    title text not null,
    isbn text not null primary key,
    pubinfo jsonb not null 
)
然后,您可以对其进行查询,以查找单个出版商所有书籍的平均成本,如下所示:

SELECT avg((pubinfo #>> '{"cost"}')::NUMERIC) 
FROM booksdata
WHERE pubinfo @> '{ "publisher" : "It Books" }';

MySQL5.7现在支持JSON数据类型-

似乎他们不想被排除在NoSQL对话之外

mysql> SELECT JSON_ARRAY('a', 1, NOW());

好吧,我们可能会去Mongo,但是你让我对这些预发布的JSON函数充满了好奇。我在哪里可以读到更多关于它们的信息?我提供了一个链接。它们正在开发阶段(甚至不是beta版)-因此,根据定义,它们无法正确记录。请尝试在MySQL实验室查找更多信息-老实说,我从未使用过这些函数。关系模型并不禁止使用JSON。事实上,值可以任意复杂。例如,请参阅Chris Date的书《数据库系统简介》,第7版,第114页。PostgreSQL支持。您要做什么它与关系数据库概念有关吗?PostgreSQL有库可以与JSON一起使用吗?当然,我并没有说所有的DBM都不支持JSON(正如您所看到的,即使对于MySQL,也或多或少有相关的库)。但简单想想这种支持是什么。您真的可以在JSON条目内的独立的实体之间创建关系吗?不。您真的可以使用JSON数据保持引用完整性吗?不。我可以继续,但概念是:如果您可以使用JSON结构,并不意味着它们与模型一致本身。但感谢dv explain。关系模型支持任意复杂的数据类型。这意味着它支持XML、视频、音频和JSON等。当然,您不能在JSON值中设置对字段的外键引用,但这与此无关,并且显示了对关系模型的误解是关于。您也不能在日期值中为字段设置外键引用。而且OP的问题中没有任何内容表明他甚至试图设置外键引用。