【发布时间】:2012-02-09 14:20:20
【问题描述】:
这个问题是针对所有 NoSQL 和特别是 mongoDB 专家的。我开始为一个项目设计一个关系数据库,但客户希望我们使用可以轻松扩展的数据库。为了实现这一点,我们决定使用 mongoDB。这些天来,我在为 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>
}
选项2(用户中只有外键):
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 更具相关性,我们在 users 表中只有其他表的 mongoIds。此选项的优点是更新战斗或物品不会有太多成本,因为行被引用而不是复制。另一方面,当用户登录时,我们必须找到所有引用的单位、战斗、物品和位置,以使用完整的用户对象进行响应。
选项3与选项2相反,其中用户表的mongoIds保存在其他表中。这个选项对我没有多大吸引力。
如果有人可以指导我或提出更好的模型,我将不胜感激。
编辑:
基本上这是一个多人游戏,其中多个客户端应用程序将通过网络服务连接到服务器。我们在客户端有一个本地数据库来存储数据。我想要一个模型,服务器可以通过该模型以完整的用户对象进行响应,然后更新或插入客户端应用程序上更改的数据。
【问题讨论】:
-
“更好”是一个目的问题。您对这些数据的访问模式是什么?
-
基本上这是一个多人在线游戏,其中多个客户端应用程序将通过网络服务连接到服务器。我们在客户端有一个本地数据库来存储数据。我想要一个模型,服务器可以通过该模型以完整的用户对象进行响应,然后更新或插入客户端应用程序上更改的数据
-
关系型数据库具有很强的扩展能力......不同之处应该在于它们预期保存的数据类型,而不是RDB仅适用于小数据,mongodb适用于大数据的错误先入之见跨度>
标签: php mongodb database-design relational-database nosql