意図としてのJSON
MySQLでJSONを操作する方法はありません。一部のDBMSはJSONをサポートする場合がありますが、それは問題外です。さらに、そのような「サポート」は、JSON固有の操作の実行に関するものであり、アーキテクチャのモデリングに関するものではありません(これら2つは完全に異なります)。 、完全な意味で、MySQLのモデルコンセプト(つまりリレーション)はJSONとは異なります。リレーショナルDBMSとしては、リレーショナルデータモデル 、およびJSONは完全に異なる形式です。プレーンな文字列値として保存するため、文字列関数を使用しない限り、他の方法で何かを行うことはできません。したがって、JSONを使用する場合でも、リレーショナルモデル内でそれを行うことはできません。したがって、たとえば、参照整合性などのリレーショナル機能を維持することはできません。
解決するオプション
いくつかのオプションがあります:
- jsonのサポートが拡張されているため、PostgreeSQLに移行します。バージョン9.4以降は
jsonb そしてそれはさらに高速です。これはRDBMSであるため、最良のオプションである可能性があります。したがって、真のドキュメント指向のDBMSのように、移行はそれほど難しくありません。 - または、手遅れになる前に、今すぐMongoに移行します(それがあなたの意図である場合)。 MongoはRDBMSとはまったく異なるものであり、ドキュメント指向であることを考慮に入れてください。これはあなたのプロジェクトとあなたのクライアントの両方にとって最良の選択肢だと思います(そしてあなたの仕事はそれを説明することでしょう)
- アーキテクチャ全体を変更して、JSONオブジェクトを保存せず、正規化された(リレーションDBの観点から)エンティティで機能するようにします。つまり、すべてのコードの完全なリファクタリング、すべての関係の変更などです。実際の状況では、これは単なる理論上のオプションであり、そのための時間もお金も与えられません。
- MySQL用に独自のJSONライブラリを実装します。難しい? JSONで何をするかによって異なりますが、 JSON
はパブリックフォーマットなので、少なくとも何をすべきかがわかります。 UDF
として実行できます。 またはユーザーランドで(
CREATE FUNCTION
声明)。もちろん、これには特定のスキルと時間が必要になります。悪いこと:バグ。アーキテクチャを再構築したり、Mongoに移行したりするよりも速くこれらの関数を作成できる場合でも、これらの関数の品質を確信することはできません。そのコードをネイティブにテストする方法はありません。ただし、ユーザーランド関数の場合のヒントを提供する場合があります。mysql-unit
保存したコードをテストするために、MySQLが5.6以上の場合(まあ、私はこのツールを作成しましたが、バグも含まれている可能性があります)
「標準」機能
最後に、MySQL 5.7を実行している場合は、プレリリースJSON関数 -だから、試してみる 現在MySQL5.7に存在する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';
その後、それらを試すことができるようになります。