Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Có cách nào để sử dụng các đối tượng json trong SQL không

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ụng mysql-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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cloud 9 IDE không thể kết nối với cơ sở dữ liệu

  2. Chỉ trả lại các hàng có giá trị tối đa nhỏ hơn giá trị đã chỉ định

  3. Mysql lỗi 1236 từ chính khi đọc dữ liệu từ nhật ký nhị phân

  4. Chỉ mục MySQL cho MIN và MAX

  5. Sử dụng mysql_real_escape_string với PDO (không có kết nối với máy chủ localhost)