Câu trả lời cho tất cả các câu hỏi của bạn thực sự phụ thuộc vào dữ liệu JSON dùng để làm gì và liệu bạn có cần sử dụng một số thuộc tính của dữ liệu đó để xác định hàng nào được trả về hay không.
Nếu dữ liệu của bạn thực sự không có lược đồ và bạn thực sự chỉ sử dụng nó để lưu trữ dữ liệu sẽ được sử dụng bởi một ứng dụng biết cách truy xuất hàng chính xác theo một số tiêu chí khác (chẳng hạn như một trong các trường khác) mọi lúc, không có lý do gì để lưu trữ nó dưới dạng bất kỳ thứ gì khác ngoài chính xác như ứng dụng mong đợi nó (trong trường hợp này là JSON).
Nếu dữ liệu JSON KHÔNG chứa một số cấu trúc giống nhau cho tất cả các mục nhập và nếu việc truy vấn dữ liệu này trực tiếp từ cơ sở dữ liệu là hữu ích, bạn sẽ muốn tạo một hoặc nhiều bảng (hoặc có thể chỉ là một số trường khác) để chứa dữ liệu này .
Ví dụ thực tế về điều này, nếu các trường dữ liệu chứa các dịch vụ liệt kê JSON cho người dùng đó trong một mảng và mỗi dịch vụ có một id, loại và giá duy nhất, bạn có thể muốn có một bảng riêng biệt với các trường sau (sử dụng cách đặt tên của riêng bạn quy ước):
serviceId (integer)
userName (string)
serviceType (string)
servicePrice (float)
Và mỗi dịch vụ cho người dùng đó sẽ nhận được mục nhập riêng. Sau đó, bạn có thể truy vấn người dùng hơn là có một dịch vụ cụ thể, tùy thuộc vào nhu cầu của bạn, có thể rất hữu ích. Ngoài việc truy vấn dễ dàng, việc lập chỉ mục các trường nhất định của các bảng riêng biệt cũng có thể tạo ra các truy vấn rất NHANH CHÓNG.
Cập nhật:Dựa trên giải thích của bạn về dữ liệu được lưu trữ và cách bạn sử dụng nó, có thể bạn muốn nó được chuẩn hóa. Một cái gì đó như sau:
# user table
userId (integer, auto-incrementing)
userName (string)
userEmail (string)
password (string)
deviceID (string)
# note table
noteId (integer, auto-incrementing)
userId (integer, matches user.userId)
noteTime (datetime)
noteData (string, possibly split into separate fields depending on content, such as subject, etC)
# request table
requestId (integer, auto-incrementing)
userId (integer, matches user.userId)
requestTime (datetime)
requestData (string, again split as needed)
Sau đó, bạn có thể truy vấn như vậy:
# Get a user
SELECT * FROM user WHERE userId = '123';
SELECT * FROM user WHERE userNAme = 'foo';
# Get all requests for a user
SELECT * FROM request WHERE userId = '123';
# Get a single request
SELECT * FROM request WHERE requestId = '325325';
# Get all notes for a user
SELECT * FROM note WHERE userId = '123';
# Get all notes from last week
SELECT * FROM note WHERE userId = '123' AND noteTime > CURDATE() - INTERVAL 1 WEEK;
# Add a note to user 123
INSERT INTO note (noteId, userId, noteData) VALUES (null, 123, 'This is a note');
Lưu ý rằng bạn có thể làm được nhiều việc hơn với dữ liệu chuẩn hóa và nó dễ dàng như thế nào? Việc xác định vị trí, cập nhật, nối thêm hoặc xóa bất kỳ thành phần cụ thể nào là điều vô cùng đơn giản.