私は、各ユーザーが独自のjson/documentデータベースを持っている必要があるサービスを実装しています。ユーザーがjsonドキュメントをクエリできるようにするだけでなく、データベースは複数のドキュメントを含むACIDトランザクションもサポートする必要があるため、Couch / Mongoまたはその他のNoSQLデータベースを使用して破棄しました(RavenDBはUnixシステムで実行する必要があるため使用できません)。
それを念頭に置いて、SQLデータベースの上にそれを実装する方法を考えようとしてきました。これが私がこれまでに思いついたものです:
CREATE TABLE documents (
id INTEGER PRIMARY KEY,
doc TEXT
);
CREATE TABLE indexes (
id INTEGER PRIMARY KEY,
property TEXT,
value TEXT,
document_id INTEGER
)
各ユーザーは、これら2つのテーブルを含むデータベースを持っており、システムが「インデックス」テーブルに適切にデータを入力できるように、ユーザーはクエリを実行する必要のあるフィールドを宣言する必要があります。したがって、ユーザー「A」が「名前」と「年齢」によるクエリを有効にするようにアカウントを構成すると、そのユーザーが「名前」または「年齢」プロパティを持つドキュメントを挿入するたびに、システムは「インデックス」にもレコードを挿入します。テーブル。「property」列には名前/年齢が含まれ、「value」にはプロパティ値が含まれ、「document_id」は対応するドキュメントを指します。
たとえば、ユーザーが次のドキュメントを挿入するとします。
'{"name" : "Foo", "age" 43}'
これにより、「documents」テーブルに挿入され、「indexes」テーブルにさらに2つの挿入が行われます。
INSERT INTO documents (id,doc) VALUES (1, '{"name" : "Foo", "age" 43}');
INSERT INTO indexes (property, value, document_id) VALUES ('name', 'foo', 1);
INSERT INTO indexes (property, value, document_id) VALUES ('age', '43', 1);
次に、ユーザー「A」がサービスに次のクエリを送信したとします。
'{"name": "Foo", "age": 43}' //(the queries are also json documents).
このクエリは、次のSQLに変換されます。
SELECT doc FROM documents
WHERE id IN (SELECT document_id FROM indexes
WHERE document_id IN (SELECT document_id FROM indexes
WHERE property = 'name' AND value = 'Foo')
AND property = 'age' AND value = '43')
私の質問:
- ユーザーがクエリで多数の条件(たとえば20〜30のAND条件)を使用できる可能性があることを知っていると、サブクエリのネストが非常に高くなり、上記のSELECTクエリはほとんどのデータベースシステムでどれほど効率的ですか( postgres、mysql ...)?
- 上記のソリューションは、最終的に数百万/数十億のjsonドキュメントを含むデータベースで実行可能ですか?
- 私の要件を満たすためのより良い方法はありますか?
- 複数のドキュメントを含むACIDトランザクションを実行でき、Unixシステムで実行できるスケーラブルなドキュメントデータベースはありますか?