这个问题适用于所有NoSQL和特别是mongoDB专家.我开始为项目设计关系数据库,但客户希望我们使用可以轻松扩展的数据库.为此,我们决定使用mongoDB.这些天我无法映射我的NoSQL关系模型.我有一个用户表,它与许多其他表有多对多的关系,如下图所示:
转换为mongoDB时我有几个选项:
选项1(用户中有完整的行):
users:{
_id:,
battles:{[battle1, battle2, ...]},
items:{[item1, item2, ...]},
locations:{[location1, location2, ...]},
units:{[unit1, unit2, ...]},
}
battles:{
}
locations:{
}
units:{
}
items:{
}
Option2(用户只有外键):
users:{
_id:,
battles:{[battle1_id, battle2_id, ...]},
items:{[item1_id, item2_id, ...]},
locations:{[location1_id, location2_id, ...]},
units:{[unit1_id, unit2_id, ...]},
}
battles:{
}
locations:{
}
units:{
}
items:{
}
选项3(其他表中的用户ID):
users:{
_id:,
}
battles:{
,
user:{[user1_id, user2_id, ...]}
}
locations:{
,
user:{[user1_id, user2_id, ...]}
}
units:{
,
user:{[user1_id, user2_id, ...]}
}
items:{
,
user:{[user1_id, user2_id, ...]}
}
选项1有很多重复,因为我们正在添加其他表的完整行.我在其中看到的一个问题是,如果某个项目或战斗更新,我们将不得不在用户表中找到它的所有出现并更新它们.但是这给了我们一个优势,即始终拥有一个完整的用户对象,可以在登录时将其传递给客户端应用程序.
选项2更具关系性,我们在users表中只有mongoIds的其他表.此选项的优点是更新战斗或项目没有太多成本,因为引用的行未被复制.另一方面,当用户登录时,我们必须找到所有引用的单位,战斗,项目和位置以响应完整的用户对象.
选项3与选项2相反,其中用户表的mongoIds保存在其他表中.这个选项对我没什么吸引力.
我真的很感激有人可以指导我或想出一个更好的模型.
编辑:
基本上这是一个mmorpg游戏,其中多个客户端应用程序将通过Web服务连接到服务器.我们在客户端有一个本地数据库来存储数据.我想要一个模型,服务器可以通过该模型响应完整的用户对象,然后更新或插入客户端应用程序上更改的数据.