這個問題適用於所有NoSQL,特別是那裏的mongoDB專家。我從一個項目設計關係數據庫開始,但客戶希望我們使用可輕鬆擴展的數據庫。爲了實現這一點,我們決定使用mongoDB。現在,我無法映射NoSQL的關係模型。我有與很多其他表的許多一對多的關係,一個用戶表如下圖所示:與NoSQL數據庫的關係
選項:
轉換它,當MongoDB的我有幾個選項1(在用戶完成行):
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>
}
1選項(在用戶只外鍵):
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>
}
選項3(在其它表中的用戶ID):
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, ...]}
}
選項1具有很多重複,因爲我們正在添加其他表的完整的行。我在這裏看到的一個問題是,如果某個項目或戰鬥更新了,我們將不得不在用戶表中找到它的所有事件並更新它們。但是這給我們帶來的好處是始終有一個完整的用戶對象,可以在登錄時交給客戶端應用程序。
選項2更具關係性,我們只有用戶表中其他表的mongoIds。這個選項的好處是,更新戰鬥或物品不會有太多的成本,因爲行不被複制。另一方面,當用戶登錄時,我們將不得不查找所有引用的單位,戰鬥,項目和位置以用完整的用戶對象進行響應。
選項3與選項2相反,其中users表的mongoIds保存在其他表中。這個選項對我沒有吸引力。
我真的很感激有人能指導我或想出一個更好的模型。
編輯:
基本上這是一個MMORPG遊戲,其中多個客戶端應用程序將通過Web服務連接到服務器。我們在客戶端有一個本地數據庫來存儲數據。我想要一個模型,服務器可以通過它完成一個完整的用戶對象的響應,然後更新或插入在客戶端應用上更改的數據
「更好」是一個目的的問題。這些數據的訪問模式是什麼? – 2012-01-13 11:05:48
基本上這是一個MMORPG遊戲,其中多個客戶端應用程序將通過web服務連接到服務器。我們在客戶端有一個本地數據庫來存儲數據。我想要一個模型,通過它服務器可以用一個完整的用戶對象進行響應,然後更新或插入在客戶端應用程序中更改的數據。 – umair 2012-01-13 11:09:12
關係數據庫具有相當的擴展能力...差異應該是它們預期可以保持的數據類型,不是一個虛假的偏見,認爲RDB只適用於小數據,mongodb適用於大型 – 2012-01-13 11:09:33