我目前使用MySQL,在查看Document DB后,似乎这可能是一个很好的举措。我查询单个记录的TON(95%)。随着我的数据库变大,其执行此操作的时间似乎变得越来越慢。阅读和写作。我很好奇基于下面的(简化)方案,如果它可以很好地转移到DocumentDB,以及所述架构的布局(我对documentDB有点新)
用户 用户身份 用户名 CreatedDate
罐 TankID UserID REF User.UserID TankName 奖
地图 的azazaz MAPNAME MAPFILE
属于MapData MapID REF Map.MapID TankID REF Tank.TankID 秩 颜色 TimePlayed 设备
每次玩家加入时,来自Tank,MapaData的数据都会被查询以收集一个完整的坦克对象。每次他们死亡,赢得奖励,杀死某人或退出游戏,数据都会被写回坦克和mapdata。
网站查询User表以进行登录,该表存储用户名和密码的哈希值。登录后,用户可以在网站上修改/删除/创建新的坦克,这会将记录插入到tank / mapdata表中。
该网站还存储世界前25名,地图中的t25,每种颜色的t25,每种地图的每种颜色t25。
这是我现在能想到的唯一查询模式。
答案 0 :(得分:2)
根据提供的信息,您可以选择多种模式设计(以JSON为例)。我已经做了一些假设,例如一个地图上可以有多个坦克,而地图数据只链接到一个地图。你必须根据自己的需要调整它。我还尝试提供每种解决方案的一些优点和缺点。
选项#1(单一收藏)
这应该是最简单的,但不是最好的解决方案。在这里,您将所有内容放入一个具有极端“非规范化”的文档中。
{
"mapname": "map1",
"mapfile": "mapfile1",
"data": {
"rank": "rank1",
"color": "color1",
...
"tanks": [
{
"name": "tank1",
...
"user": {
"name": "user1",
...
}
},
{
...
}
]
}
}
当您执行大量写入,罕见更新以及要将所有信息放在一起的读取时,此解决方案效果最佳。另一方面,它有很多缺点,例如将用户信息直接存储到应用程序数据中(例如密码哈希)。
选项#2(两个馆藏)
将您的用户数据放入一个集合,将其他数据放入第二个集合。
用户集合
{
"id": 1,
"username": "user1",
"password": "passwordhash",
...
}
数据收集
{
"mapname": "map1",
"mapfile": "mapfile1",
"data": {
"rank": "rank1",
"color": "color1",
...
"tanks": [
{
"name": "tank1",
...
"user": userId
}
},
{
...
}
]
}
}
这个选项比第一个好很多。首先,您不希望在包含其他数据的集合中包含敏感用户数据(例如密码的哈希值)。此外,这对于读取用户对象更有效,因为您只需检索所需的信息,而无需跳过大量不需要的字段。缺点是对坦克对象的大量写入操作可能成为一个问题。
选项#3(三个馆藏)
下一步可能是将坦克从数据收集中移出到他们自己的收藏中。
用户集合
{
"id": 1,
"username": "user1",
"password": "passwordhash",
...
}
坦克收藏
{
"name": "tank1",
...
"user": userId
}
数据收集
{
"mapname": "map1",
"mapfile": "mapfile1",
"data": {
"rank": "rank1",
"color": "color1",
...
"tanks": [
idOfTank1,
idOfTank2,
...
]
}
}
这适用于大量单个物体的写入,例如坦克,以及来自其收藏品的阅读箱。在一起读取大量数据时,此解决方案存在问题,例如,如果您想获取地图和该地图中的所有坦克。在这种情况下,您必须解决坦克和地图数据的依赖关系。
<强>摘要强>
如图所示,面向文档的数据库中的模式设计并不容易。这就是我要求查询模式的原因。要想出一个好的设计,您必须事先了解大多数查询模式。首先,您应该使用您认为合理的设计创建一个简单的原型,并使用一些测试数据测试您的查询模式。如果可行,您可以进行微小的更改以获得更好的性能。如果没有,请重新考虑您的查询模式以及更好的设计的外观。请记住,您不需要一个完整的应用程序。其中大部分内容可以在编写单行代码之前进行测试,例如使用MongoDB的管理shell或DocumentDB的简单控制台应用程序。