目前使用MySQL,查看DocumentDB

时间:2014-12-29 21:41:03

标签: azure-cosmosdb

我目前使用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。

这是我现在能想到的唯一查询模式。

1 个答案:

答案 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的简单控制台应用程序。