Ví dụ: giả sử tôi muốn tìm nạp Người dùng và tất cả số điện thoại và địa chỉ email của anh ấy. Các số điện thoại và email được lưu trữ trong các bảng riêng biệt, Một người dùng cho nhiều điện thoại / email. Tôi có thể làm điều này khá dễ dàng:
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
Vấn đề * với điều này là nó trả lại tên người dùng, DOB, màu yêu thích và tất cả các thông tin khác được lưu trữ trong bảng người dùng lặp đi lặp lại cho mỗi bản ghi (người dùng gửi email bản ghi điện thoại), có lẽ ăn hết băng thông và làm chậm xuống kết quả.
Sẽ không đẹp hơn nếu nó trả về một hàng cho mỗi người dùng và trong hồ sơ đó có một danh sách email và danh sách điện thoại? Nó sẽ làm cho dữ liệu dễ dàng hơn để làm việc với quá.
Tôi biết bạn có thể nhận được kết quả như thế này bằng cách sử dụng LINQ hoặc có lẽ các khung công tác khác, nhưng dường như đó là một điểm yếu trong thiết kế cơ sở của cơ sở dữ liệu quan hệ.
Chúng ta có thể khắc phục điều này bằng cách sử dụng NoQuery, nhưng không nên có một số điểm trung gian?
Tui bỏ lỡ điều gì vậy? Tại sao điều này không tồn tại?
* Có, nó được thiết kế theo cách này. Tôi hiểu rồi. Tôi đang tự hỏi tại sao không có sự thay thế nào dễ làm việc hơn. SQL có thể tiếp tục làm những gì nó đang làm nhưng sau đó họ có thể thêm một hoặc hai từ khóa để thực hiện một chút xử lý hậu kỳ trả về dữ liệu theo định dạng lồng nhau thay vì sản phẩm cartesian.
Tôi biết điều này có thể được thực hiện bằng ngôn ngữ kịch bản mà bạn chọn, nhưng nó yêu cầu máy chủ SQL phải gửi dữ liệu dư thừa (ví dụ bên dưới) hoặc bạn đưa ra nhiều truy vấn như thế nào SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
Thay vì có MySQL trả lại một cái gì đó giống như thế này:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "johnsmith45@gmail.com",
},
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "john@smithsunite.com",
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"email": "originaljane@deerclan.com",
}
]
Và sau đó phải nhóm trên một số định danh duy nhất (có nghĩa là tôi cũng cần tìm nạp phía đó!) Phía khách hàng để định dạng lại tập kết quả theo cách bạn muốn, chỉ cần trả về điều này:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"emails": ["johnsmith45@gmail.com", "john@smithsunite.com"]
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"emails": ["originaljane@deerclan.com"],
}
]
Ngoài ra, tôi có thể đưa ra 3 truy vấn: 1 cho người dùng, 1 cho email và 1 cho số điện thoại, nhưng sau đó bộ kết quả số email và số điện thoại cần phải chứa user_id để tôi có thể kết hợp chúng với người dùng Tôi đã lấy trước đây. Một lần nữa, dữ liệu dư thừa và xử lý hậu kỳ không cần thiết.