簡體   English   中英

有沒有辦法在SQL中使用json對象

[英]Is there any way to use json objects in SQL

這是問題所在:

我們有一個MySQL數據庫,我們在其中存儲JSON字符串。 到目前為止,這沒有問題,但突然我們的客戶要求我們使用這些對象進行搜索/訂購/其他操作。 由於項目處於相當晚的狀態,所以前往Mongo不是團隊領導者想要做出的選擇,所以我想問有沒有快速的方法來使用這些JSON字符串?

意圖是JSON

在MySQL中無法使用JSON。 有些DBMS可能支持JSON,但這是不可能的,此外,任何類型的“支持”只是執行一些特定於JSON的操作,而不是關於建模您的架構(這兩件事情完全不同)更多,完全意義上,MySQL的模型概念(即關系)與JSON不同的是:作為關系型DBMS,它遵循關系數據模型 ,而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-unit來測試你存儲的代碼,如果你的MySQL是5.6或更高(嗯,我寫過這個工具,但是......它可能包含蟲子也)

“標准”功能

最后,如果您正在運行MySQL 5.7,那么預發布JSON函數可能會有一線希望 - 因此,您可以嘗試使用當前為MySQL 5.7存在的alfa版本的JSON功能。 但我不會(強烈)建議在實際項目中使用它,因為這些功能既沒有經過充分測試也沒有完整。 但是,要安裝這些功能,您需要下載相應的軟件包,然后將它們插入您的服務器,如:

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數據類型。

如果你看一下關於它包含在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" }';

MySQL5.7現在支持JSON數據類型 - https://dev.mysql.com/doc/refman/5.7/en/json.html

似乎他們不想被排除在NoSQL對話之外。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM