Câu hỏi này dành cho tất cả chuyên gia NoSQL và đặc biệt mongoDB ở đó. Tôi bắt đầu bằng cách thiết kế một DB quan hệ cho một dự án nhưng khách hàng muốn chúng tôi sử dụng một DB có thể dễ dàng mở rộng quy mô. Để đạt được điều này, chúng tôi đã quyết định sử dụng mongoDB. Những ngày này tôi đang gặp khó khăn trong việc lập bản đồ mô hình quan hệ của tôi cho NoSQL. Tôi có một bảng người dùng trong đó có một mối quan hệ nhiều-nhiều với rất nhiều bảng khác như minh họa dưới đây:Quan hệ với cơ sở dữ liệu NoSQL
Tôi có một vài lựa chọn khi chuyển đổi nó cho MongoDB:
Tùy chọn 1 (với hàng hoàn toàn trong sử dụng):
users:{
_id:<user_id>,
battles:{[battle1, battle2, ...]},
items:{[item1, item2, ...]},
locations:{[location1, location2, ...]},
units:{[unit1, unit2, ...]},
}
battles:{
<battle_info>
}
locations:{
<location_info>
}
units:{
<units_info>
}
items:{
<items_info>
}
OPTION2 (chỉ với phím nước ngoài trong người sử dụng):
users:{
_id:<user_id>,
battles:{[battle1_id, battle2_id, ...]},
items:{[item1_id, item2_id, ...]},
locations:{[location1_id, location2_id, ...]},
units:{[unit1_id, unit2_id, ...]},
}
battles:{
<battle_info>
}
locations:{
<location_info>
}
units:{
<units_info>
}
items:{
<items_info>
}
Lựa chọn 3 (id người dùng trong các bảng khác):
users:{
_id:<user_id>,
}
battles:{
<battle_info>,
user:{[user1_id, user2_id, ...]}
}
locations:{
<location_info>,
user:{[user1_id, user2_id, ...]}
}
units:{
<units_info>,
user:{[user1_id, user2_id, ...]}
}
items:{
<items_info>,
user:{[user1_id, user2_id, ...]}
}
Lựa chọn 1 có rất nhiều sự trùng lặp như chúng tôi có thêm hàng hoàn toàn của các bảng khác. Một vấn đề tôi thấy ở đây là nếu một mục hoặc trận chiến nào đó được cập nhật, chúng ta sẽ phải tìm tất cả các lần xuất hiện của nó trong bảng người dùng và cập nhật chúng. Nhưng điều này mang lại cho chúng ta lợi thế của việc luôn có một đối tượng người dùng hoàn chỉnh có thể được trao cho ứng dụng của khách hàng tại thời điểm đăng nhập.
Tùy chọn 2 có quan hệ hơn khi chúng tôi chỉ có mongoIds các bảng khác trong bảng người dùng. Lợi thế của các tùy chọn này là việc cập nhật một trận chiến hoặc mục không có nhiều chi phí vì các hàng được tham chiếu không được sao chép. Mặt khác, khi người dùng đăng nhập, chúng tôi sẽ phải tìm tất cả các đơn vị được tham chiếu, trận chiến, vật phẩm và vị trí để phản hồi với đối tượng người dùng hoàn chỉnh.
Tùy chọn 3 nằm đối diện với tùy chọn 2 trong đó mongoBảng người dùng được lưu giữ trong các bảng khác. Tùy chọn này không hấp dẫn tôi nhiều.
Tôi thực sự đánh giá cao ai đó có thể hướng dẫn tôi hoặc đưa ra mô hình tốt hơn.
Edit:
Về cơ bản đây là một trò chơi MMORPG nơi nhiều khách hàng ứng dụng sẽ kết nối đến máy chủ thông qua webservices. Chúng tôi đã có một db cục bộ tại máy khách để lưu trữ dữ liệu. Tôi muốn một mô hình mà qua đó máy chủ có thể đáp ứng với một đối tượng người dùng hoàn chỉnh và sau đó cập nhật hoặc chèn dữ liệu thay đổi trên ứng dụng khách.
"tốt hơn" là vấn đề của mục đích. Mẫu truy cập của bạn cho dữ liệu này là gì? –
về cơ bản đây là trò chơi MMORPG nơi nhiều ứng dụng khách hàng sẽ kết nối với máy chủ thông qua dịch vụ web. Chúng tôi đã có một db cục bộ tại máy khách để lưu trữ dữ liệu. Tôi muốn một mô hình thông qua đó máy chủ có thể đáp ứng với một đối tượng người dùng hoàn chỉnh và sau đó cập nhật hoặc chèn dữ liệu thay đổi trên ứng dụng của khách hàng – umair
Cơ sở dữ liệu quan hệ có khả năng mở rộng quy mô ... sự khác biệt phải là loại dữ liệu mà chúng được dự kiến sẽ giữ, không phải là một định kiến sai lầm rằng RDB chỉ dành cho dữ liệu nhỏ, mongodb cho lớn –