问题在于:
我们有一个MySQL数据库,我们在其中存储JSON字符串。到目前为止,这没有问题,但突然我们的客户要求我们使用这些对象进行搜索/订购/其他操作。由于项目处于相当晚的状态,因此组队领导想要选择Mongo并不是一个选择,所以我问是否可以快速使用这些JSON字符串?
答案 0 :(得分:3)
JSON作为意图
在MySQL中无法使用JSON。有些DBMS可能支持JSON,但这是不可能的,此外,任何类型的“支持”只是执行一些特定于JSON的操作,而不是关于建模您的架构(这两件事情完全不同)更多,完全意义上,MySQL的模型概念(即关系)与JSON不同:作为关系DBMS,它遵循relational data model,而JSON是完全不同的格式。您将它存储为纯字符串值,因此,如果不使用字符串函数,则无法以其他方式对其执行任何操作。因此,即使使用JSON,您也不会在关系模型中执行此操作,因此,不可能维护关系功能,例如参照完整性。
要解决的选项
您有几种选择:
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());