Sql 如何在数据库中高效地存储大型不断变化的平铺图

Sql 如何在数据库中高效地存储大型不断变化的平铺图,sql,database,mongodb,backend,game-development,Sql,Database,Mongodb,Backend,Game Development,我目前正在开发一个游戏作为个人项目!游戏的一个主要方面是地图-这将是一个多人游戏,玩家可以通过构建东西来捕获地图的不同区域 地图会很大!约1000x1000(约1M瓷砖)。游戏同时也会有相当数量的玩家出现在地图上(100-1000),他们会不断地捕捉新的区域,并从其他玩家那里窃取区域,因此瓷砖数据库会不断地实时变化 我的问题是——有人对如何进行这项工作有什么建议吗?我最初的想法是: 拥有一个包含互动程序集合的MongoDB数据库。 优点:可以查询地图的某些区域,这样客户端每次只需下载地图的一部分

我目前正在开发一个游戏作为个人项目!游戏的一个主要方面是地图-这将是一个多人游戏,玩家可以通过构建东西来捕获地图的不同区域

地图会很大!约1000x1000(约1M瓷砖)。游戏同时也会有相当数量的玩家出现在地图上(100-1000),他们会不断地捕捉新的区域,并从其他玩家那里窃取区域,因此瓷砖数据库会不断地实时变化

我的问题是——有人对如何进行这项工作有什么建议吗?我最初的想法是:

拥有一个包含互动程序集合的MongoDB数据库。

优点:可以查询地图的某些区域,这样客户端每次只需下载地图的一部分

缺点:收集将非常大(数GB)(每个磁贴需要有X、Y坐标、资源级别、所有者,以及是否有其他玩家在争夺磁贴)

拥有一个SQL数据库

优点:尺寸更轻,查询速度更快

缺点:可能无法实时写入和编辑

任何想法/方向都将不胜感激


谢谢大家!

如果我理解了这个问题,听起来空间索引是一个不错的选择。有了一个好的空间索引,定位玩家并确定地图的哪些部分在附近就变得很简单了。我只在地理数据中使用过它,但如果使用正确的多边形,它在您的场景中也应该可用


微软做的比我在stackoverflow中给出的答案要好得多,而且类似的功能也存在于中。希望有帮助

对于数据库来说,一百万个tile不一定是要管理的大量对象。与其他类型的可寻址资产(如飞机座位、酒店房间、音乐会门票)一样,每个地图磁贴都将有一个主键标识符,该标识符将被索引,以便快速检索和精确、有针对性的更新

根据有关在磁贴之间移动的规则以及渲染磁贴时涉及的易变信息量,您可能希望设计一个预取方案,预测播放器接下来可能需要哪些磁贴,并提前下载它们以最大限度地减少延迟


为了使您的应用程序能够容纳数百或数千名同时查看、修改和拥有特定记录的用户,而不会出现锁定超时和死锁,您的数据库模型和查询工作负载需要针对并发性进行设计。基于SQL的数据库允许您使用规范化技术来获得一个数据模型,该模型不仅准确地表示您正在管理的数据,而且还消除了重复记录、重复预订、丢失更新和其他异常的风险。如果您的数据模型已充分规范化,并且您的应用程序正在正确使用原子事务(工作单元),则基于SQL的数据库的A.C.I.D.属性将以最少的应用程序编码为您的数据提供强大的内置保护

我不知道你的利弊有多准确。例如,无论平台如何,每个磁贴都需要有X、Y坐标、资源级别、所有者,以及是否有其他玩家在争夺磁贴。如果写得好,那么两个平台都应该具有良好的性能。无论哪种情况,编写/编辑程序都可能不容易。谢谢您的回复!非常有用的信息在这里,将研究原子化和sql解决方案,谢谢Randall!看起来,空间索引肯定有助于在数据库上使事情变得更简单、更快