JSON như ý định
Không có cách nào để làm việc với JSON trong MySQL. Một số DBMS có thể hỗ trợ JSON, nhưng điều đó không xảy ra và ngoài ra, bất kỳ loại "hỗ trợ" nào như vậy chỉ nhằm thực hiện một số hoạt động cụ thể của JSON, chứ không phải về việc mô hình hóa kiến trúc của bạn (và hai thứ đó hoàn toàn khác nhau) , theo nghĩa đầy đủ, khái niệm mô hình (tức là quan hệ) cho MySQL khác với JSON là:như một DBMS quan hệ, nó tuân theo mô hình dữ liệu quan hệ và JSON là định dạng hoàn toàn khác. Bạn sẽ lưu trữ nó dưới dạng giá trị chuỗi thuần túy, do đó, không thể thực hiện bất kỳ điều gì với nó theo một cách nào đó, nếu không sử dụng các hàm chuỗi. Vì vậy, ngay cả khi làm việc với JSON, bạn sẽ thực hiện điều đó không bên trong mô hình quan hệ, do đó, sẽ không thể duy trì các tính năng quan hệ, chẳng hạn như tính toàn vẹn tham chiếu.
Các tùy chọn để giải quyết
Bạn có một số tùy chọn:
- Chuyển sang Postgree SQL vì nó đã mở rộng hỗ trợ cho json, kể từ phiên bản 9.4 nó jsonb và nó thậm chí còn nhanh hơn. Đây có thể là lựa chọn tốt nhất vì đó là RDBMS và do đó việc di chuyển sẽ không khó như đối với DBMS thực sự hướng tài liệu.
- Hoặc di chuyển sang Mongo ngay bây giờ (nếu đó là ý định của bạn), trước khi quá muộn. Hãy lưu ý, Mongo đó hoàn toàn khác với RDBMS, nó hướng đến tài liệu. Tôi đoán đây là lựa chọn tốt nhất cho cả dự án của bạn và khách hàng của bạn (và nhiệm vụ của bạn là giải thích điều đó)
- Thay đổi toàn bộ kiến trúc để bạn sẽ không lưu trữ các đối tượng JSON và sẽ hoạt động với các thực thể được chuẩn hóa (theo quan hệ DB). Điều này có nghĩa là - có, tái cấu trúc toàn bộ mã, thay đổi tất cả các quan hệ, v.v. Trong tình huống thực tế, đó chỉ là lựa chọn lý thuyết, bạn sẽ không có thời gian cũng như tiền bạc cho việc đó.
- Triển khai thư viện JSON của riêng bạn cho MySQL. Có khó không? Tùy thuộc vào những gì bạn sẽ làm với JSON của mình, nhưng JSON
là định dạng công khai, vì vậy bạn sẽ biết phải làm gì, ít nhất. Bạn có thể làm điều đó với tư cách là UDF
hoặc tại user-land (với
CREATE FUNCTION
bản tường trình). Tất nhiên, điều này sẽ đòi hỏi những kỹ năng và thời gian cụ thể. Những điều tồi tệ:lỗi. Ngay cả khi bạn có thể tạo các chức năng đó nhanh hơn so với cấu trúc lại kiến trúc của mình hoặc chuyển sang Mongo, bạn sẽ không bao giờ chắc chắn về chất lượng của các chức năng đó. Không có cách nào để kiểm tra mã đó một cách nguyên bản. Tuy nhiên, tôi có thể đưa ra gợi ý cho trường hợp của các hàm người dùng trên đất - bạn có thể sử dụngmysql-unit
để kiểm tra mã được lưu trữ của bạn, nếu MySQL của bạn là 5.6 trở lên (tốt, tôi đã viết công cụ này, nhưng .. nó cũng có thể chứa lỗi)
Chức năng "tiêu chuẩn"
Cuối cùng, nếu bạn đang chạy MySQL 5.7, thì có thể có một tia hy vọng với các hàm JSON phát hành trước - vì vậy, bạn có thể thử để sử dụng phiên bản alfa của chức năng JSON, hiện đang tồn tại cho MySQL 5.7. Nhưng tôi không (thực sự) khuyên bạn nên sử dụng nó trong dự án thực tế vì những chức năng đó không được kiểm tra kỹ lưỡng cũng như không hoàn chỉnh. Tuy nhiên, để cài đặt các chức năng đó, bạn cần tải xuống gói tương ứng, sau đó cắm chúng vào máy chủ của bạn, chẳng hạn như:
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';
Và sau đó bạn sẽ có thể thử chúng.