Tôi đang triển khai dịch vụ mà mỗi người dùng phải có cơ sở dữ liệu json/tài liệu của riêng mình. Ngoài việc cho phép người dùng truy vấn các tài liệu json bằng ví dụ, cơ sở dữ liệu cũng phải hỗ trợ các giao dịch ACID liên quan đến nhiều tài liệu, vì vậy tôi đã loại bỏ sử dụng Couch/Mongo hoặc các cơ sở dữ liệu NoSQL khác (không thể sử dụng RavenDB vì nó phải chạy trên các hệ thống Unix).Cần một cách hiệu quả để lưu trữ/truy vấn json trong cơ sở dữ liệu SQL
Với ý nghĩ đó, tôi đã cố gắng tìm ra cách để thực hiện điều đó trên cơ sở dữ liệu SQL. Dưới đây là những gì tôi đã đưa ra cho đến nay:
CREATE TABLE documents (
id INTEGER PRIMARY KEY,
doc TEXT
);
CREATE TABLE indexes (
id INTEGER PRIMARY KEY,
property TEXT,
value TEXT,
document_id INTEGER
)
Mỗi người dùng sẽ có một cơ sở dữ liệu với hai bảng này, và người dùng sẽ phải khai báo các trường ông cần để truy vấn vì vậy hệ thống đúng cách có thể cư trú trong 'Chỉ số ' bàn. Vì vậy, nếu người dùng 'A' cấu hình tài khoản của mình để bật truy vấn theo 'tên' và 'tuổi', mọi người dùng chèn tài liệu có thuộc tính 'tên' hoặc 'tuổi' hệ thống cũng sẽ chèn bản ghi vào 'chỉ mục' bảng, trong đó cột 'thuộc tính' sẽ chứa tên/tuổi, 'giá trị' sẽ chứa giá trị thuộc tính và 'document_id' sẽ trỏ đến tài liệu tương ứng.
Ví dụ, giả sử người dùng chèn doc sau:
'{"name" : "Foo", "age" 43}'
này sẽ cho kết quả trong một chèn vào bảng 'tài liệu' và hai chèn nhiều vào bảng 'chỉ':
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);
sau đó, chúng ta hãy nói rằng người dùng 'A' gửi các dịch vụ truy vấn sau đây:
'{"name": "Foo", "age": 43}' //(the queries are also json documents).
truy vấn này sẽ được dịch sang SQL sau đây:
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')
Câu hỏi của tôi:
- Biết rằng người dùng có thể sử dụng một số lượng lớn các điều kiện trong các truy vấn của mình (cho phép nói 20-30 VÀ điều kiện), mà sẽ gây ra truy vấn con làm tổ rất cao, truy vấn SELECT ở trên có hiệu quả như thế nào trên hầu hết các hệ thống cơ sở dữ liệu (postgres, mysql ...)?
- Giải pháp trên có khả thi cho một cơ sở dữ liệu mà cuối cùng sẽ chứa hàng triệu/tỷ tài liệu json không?
- Có cách nào tốt hơn để đáp ứng các yêu cầu của tôi không?
- Có cơ sở dữ liệu tài liệu có thể mở rộng nào có thể thực hiện các giao dịch ACID liên quan đến nhiều tài liệu và chạy trên các hệ thống Unix không?
PostgreSQL 9.2 sẽ hỗ trợ loại dữ liệu JSON và với một số chức năng (ví dụ: được viết bằng JavaScript) ở trên có thể thực hiện được. Xem ở đây cho một ví dụ: http://people.planetpostgresql.org/andrew/index.php?/archives/249-Using-PLV8-to-index-JSON.html –
Xem liệu CouchDB có hoạt động cho bạn không: "CouchDB cung cấp ACID ngữ nghĩa. Nó thực hiện điều này bằng cách thực hiện một hình thức kiểm soát đồng thời nhiều phiên bản, có nghĩa là CouchDB có thể xử lý một khối lượng lớn các độc giả đồng thời và các nhà văn mà không xung đột. " –
Mẹo thú vị về PostgreSQL, tôi sẽ kiểm tra nó, nhờ –