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

时间:2014-08-06 06:55:38

标签: mysql json database-design architecture

问题在于:

我们有一个MySQL数据库,我们在其中存储JSON字符串。到目前为止,这没有问题,但突然我们的客户要求我们使用这些对象进行搜索/订购/其他操作。由于项目处于相当晚的状态,因此组队领导想要选择Mongo并不是一个选择,所以我问是否可以快速使用这些JSON字符串?

3 个答案:

答案 0 :(得分:3)

JSON作为意图

在MySQL中无法使用JSON。有些DBMS可能支持JSON,但这是不可能的,此外,任何类型的“支持”只是执行一些特定于JSON的操作,而不是关于建模您的架构(这两件事情完全不同)更多,完全意义上,MySQL的模型概念(即关系)与JSON不同:作为关系DBMS,它遵循relational data model,而JSON是完全不同的格式。您将它存储为纯字符串值,因此,如果不使用字符串函数,则无法以其他方式对其执行任何操作。因此,即使使用JSON,您也不会在关系模型中执行此操作,因此,不可能维护关系功能,例如参照完整性。

要解决的选项

您有几种选择:

  • 迁移到Postgree SQL,因为它扩展了对json的支持,因为版本9.4是jsonb,而且速度更快。这可能是最好的选择,因为它是RDBMS,因此迁移对于真正面向文档的DBMS来说不会那么难。
  • 或者现在迁移到Mongo(如果这是你的意图),在为时已晚。请注意,Mongo与RDBMS完全不同,它是面向文档的。我想这对你的项目和你的客户来说都是最好的选择(你的任务就是解释它)
  • 更改整个体系结构,以便您不会存储JSON对象,并且将使用规范化(就关系数据库而言)实体。这意味着 - 是的,所有代码的整个重构,改变所有关系等。在实际情况下,它只是理论选择,你不会既没有时间也没有钱。
  • 为MySQL实现自己的JSON库。难吗?取决于您将使用JSON做什么,但JSON是公共格式,因此您至少应该知道该做什么。您可以将其作为UDF或在user-land(因此使用CREATE FUNCTION语句)执行此操作。当然,这需要特定的技能和时间。坏事:错误。即使您能够比重新构建体系结构或迁移到Mongo更快地创建这些功能,您仍然无法确定这些功能的质量。没有办法本机测试该代码。但是,我可能会提示用户登陆功能的情况 - 如果您的MySQL是5.6或更高版本,您可以使用mysql-unit来测试您存储的代码(好吧,我已经编写了这个工具,但是......它也可能包含错误)

“标准”功能

最后,如果您正在运行MySQL 5.7,那么pre-release JSON functions可能会有一线希望 - 所以,您可以尝试使用alfa-version的JSON功能,目前存在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';

之后你就可以尝试了。

答案 1 :(得分:0)

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

如果您查看official wiki page regarding its inclusion in PostgreSQL 9.4,那么您将看到这一点,您可以存储原始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" }';

答案 2 :(得分:0)

MySQL5.7现在支持JSON数据类型 - https://dev.mysql.com/doc/refman/5.7/en/json.html

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

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