Mặc dù NoSQL thường khuyến nghị không chuẩn hóa của các mô hình dữ liệu, tốt nhất là không có danh sách không giới hạn trong một mục nhập cơ sở dữ liệu. Để lập mô hình dữ liệu này trong DynamoDB, bạn nên sử dụng danh sách gần kề để lập mô hình mối quan hệ nhiều người . Không có hiệu quả về chi phí cách lập mô hình dữ liệu mà tôi biết, để cho phép bạn nhận được tất cả dữ liệu bạn muốn chỉ trong một lần gọi. Tuy nhiên, bạn đã nói rằng tốc độ là quan trọng nhất (không đưa ra yêu cầu về độ trễ), vì vậy tôi sẽ cố gắng cung cấp cho bạn ý tưởng về tốc độ bạn có thể lấy dữ liệu nếu được lưu trữ trong DynamoDB.
Các lược đồ của bạn sẽ trở thành một cái gì đó giống như thế này:
Actor {
ActorId, <-- This is the application/database id, not the actor's actual ID
Name,
Age,
Bio
}
Film {
FilmId, <-- This is the application/database id for the film
Title,
Description,
ReleaseDate
}
ActedIn {
ActorId,
FilmId
}
Để chỉ ra rằng một diễn viên đã đóng phim, bạn chỉ cần thực hiện một lần ghi (thường là mili giây đơn lẻ bằng cách sử dụng DynamoDB theo kinh nghiệm của tôi) để thêm một mục ActedIn vào bảng của bạn.
Để có được tất cả các bộ phim cho một diễn viên, bạn sẽ cần truy vấn một lần để có được tất cả các hành động trong các mối quan hệ và sau đó đọc hàng loạt để lấy tất cả các bộ phim. Độ trễ điển hình cho một truy vấn (theo kinh nghiệm của tôi) là dưới 10 mili giây, tùy thuộc vào tốc độ mạng và lượng dữ liệu được gửi qua mạng. Vì mối quan hệ ActedIn là một đối tượng nhỏ như vậy, tôi nghĩ bạn có thể mong đợi trường hợp trung bình là 5ms cho một truy vấn, nếu truy vấn của bạn bắt nguồn từ thứ gì đó cũng đang chạy trong trung tâm dữ liệu AWS (EC2, Lambda, v.v.).
Thời gian nhận một mục đơn lẻ sẽ dưới 5 mili giây và bạn có thể làm điều đó song song. Ngoài ra còn có API BatchGetItems, nhưng tôi không có bất kỳ thống kê nào cho bạn về điều đó.
Vậy, ~ 10ms có đủ nhanh cho bạn không?
Nếu không, bạn có thể sử dụng DAX , thêm một lớp bộ nhớ đệm vào DynamoDB và hứa hẹn độ trễ yêu cầu là <1ms.
Cách không thể xác định được, không hiệu quả về chi phí để thực hiện điều này trong một cuộc gọi là gì?
Đối với mọi mối quan hệ ActedIn, hãy lưu trữ dữ liệu của bạn như sau:
ActedIn {
ActorId,
ActorName,
ActorAge,
ActorBio,
FilmId,
FilmTitle,
FilmDescription,
FilmReleaseDate
}
Bạn chỉ cần thực hiện một truy vấn cho bất kỳ Diễn viên cụ thể nào để nhận tất cả các chi tiết phim của họ và chỉ một truy vấn để nhận tất cả các chi tiết Diễn viên cho một bộ phim nhất định. Không thực sự làm điều này. Dữ liệu trùng lặp có nghĩa là mỗi khi bạn phải cập nhật thông tin chi tiết cho một Diễn viên, bạn cần cập nhật nó cho mọi Phim mà họ đã tham gia và tương tự cho chi tiết Phim. Đây sẽ là một cơn ác mộng hoạt động.
Tôi không bị thuyết phục; Có vẻ như NoSQL rất tệ cho việc này.
Bạn nên nhớ rằng NoSQL có nhiều loại (NoSQL =Không chỉ SQL), và vì vậy ngay cả khi một giải pháp NoSQL không phù hợp với bạn, bạn cũng không nên loại trừ hoàn toàn. Nếu bạn thực sự cần điều này trong một cuộc gọi, bạn nên cân nhắc sử dụng Cơ sở dữ liệu đồ thị (là một loại cơ sở dữ liệu NoSQL khác).