Answers:
我们做到了,希望本Z会比我更好地解释原因,因为他实际上是我们数据库的原始作者。简短的版本是关系数据库在游戏中不是很有用,因为它们不能有效地存储结构化的层次结构数据,这些数据构成了MMO正常操作所需的绝大多数数据。我们选择建立一个自定义对象数据库和一个分布式事务处理系统的一部分,该系统现已投入生产并为我们的两个实时游戏提供动力。
至于您是否应该这样做?可能不是,至少起初不是。我仍然会提倡避免使用SQL,但是“ NoSQL”世界现在有很多其他选择,几年前还没有。
也就是说,大多数MMO都可以在SQL(关系)数据库上运行。我知道Eve在安装在几个多TB RAMSAN之上的SQL Server安装上运行(我一生中可能永远不会拥有这些东西所花的钱)。
编辑:我希望他不会介意我在这里张贴这一点,但是这是一个博客条目约在我们给GDC'08我们的数据库演示一些链接和评论。
好的,这个答案更像是一个观察。
全面披露我尚未从事MMORPG。我曾在2009年访问量最高的十大网站之一工作,而我曾在游戏引擎公司工作,认为他们正在制造MMORPG技术(我不知道是否发货)。
如果您看一下已经实现大规模发展的公司(Google,Facebook,Twitter等,我知道他们不是游戏公司,但在这个领域值得研究),我认为有两件事很重要。
一个大错误是拿起一些昂贵的交钥匙物品,并期望它可以为您神奇地扩展。那样行不通。扩大规模的关键是适当应对每个新挑战。您需要灵活,易于使用的解决方案,并且可以轻松移入和移出。
所以我对您的建议是,如果您刚起步,就可以轻松应对。
基本上,有各种各样的方法,我认为选择它们的依据更多是开发人员的经验以及数据库的属性。一方面,许多MMO正在使用标准的关系数据库-例如。使用/使用Camelot的黑暗时代(还在吗?)MySQL,FreeRealms使用经过修改的Postgresql等。
顺带一提,您会遇到Guild Wars:他们使用SQL Server,但它们将数据作为单个BLOB保留在其中。这意味着他们将获得常规二进制格式的好处以及数据库提供的一些好处。不用说,您可能还会看到这种方法的一些缺点,但是对于曾经使用平面文件的公司而言,它可能仍在进步。
然后可能还有一些地方使用了各种形式化的NoSQL方法,尽管还很早。Farmville 显然基于memcached使用了为此目的而制造的membase。这与MongoDB,CouchDB等共享许多功能。再次使用这些方法,您通常会滚动自己的存储格式,但会获得分发,缓存,冗余等优点。
有些人正在完全使用自己的NoSQL:Cryptic 说他们做了类似的事情,但也说他们没有在生产中使用它。(编辑:但请参阅下面的评论。)
然后,您遇到使用平面文本或二进制文件的人-据我了解,较早的游戏(如Ultima Online,Everquest等)都沿这条路线走了,对于一家拥有游戏开发经验但数据库经验很少的公司来说,这很好用太。
还要注意,您几乎永远不会在某种松散的意义上写自己的数据库-在游戏中,您总是拥有定制数据,而这些数据需要以不适合自己使用的方式来管理内存或磁盘中的数据通用软件。您无法每次都需要一些数据时执行SQL查询,因此无论使用什么后端,都需要在代码中镜像很多信息。
在《灼热的海盗》中,我们开始使用MySQL(尽管老实说我更喜欢Postgres),当它开始在负载下崩溃时,我们改用Microsoft SQL Server。不过,老实说,将来我可能不会再走那条路了。大部分PotBS数据在保留之前都已预先序列化,因此数据库中的大部分内容不过是密钥/值存储区的增长。最重要的是,为了在持久层中获得更好的性能,并更好地控制数据在内存中的缓存方式,我们最终编写了位于数据库前面的缓存服务器。
所以Kylotan说的很对,您不会在某种程度上绕开自己的脚步。SQL关系数据库服务器不是为游戏使用数据的方式而设计的。与其假设关系数据库服务器不是数据库的全部,不如说我们真的应该在选择工具之前更多地考虑我们在寻找什么好处。
下次,我将进一步研究BerkleyDB或其他一些NoSQL风格的DB。
要注意的另一件事是,如果您拥有(相对)静态的数据集,请不要将其存储在数据库中!没有真正好的理由将您的拼写定义,项目定义,地图等存储在数据库中。除名称外,您很少查询它们。我看到很多人进入游戏开发,将这些东西与持续的玩家数据一起存储,这是完全不同的一类。
您需要一个数据存储,例如文件系统。在开发之外,您不需要ACID,不需要CRUD,也不需要数据库来存储此类数据。在开发内部,您需要一个数据库,但无论如何您都还需要一个VCS,而选择VCS将会为您选择数据库。
(如果您正在玩的游戏中,玩家可以创建自定义咒语,物品或任务,那么该数据与玩家数据属于同一类,并且您确实需要一个数据库。)
MMORPG是密集型应用程序,是一项巨大的事业。如果您从游戏开发开始,我强烈建议您做一些较小的事情。
也就是说,您需要从设置中挤出两个最佳性能。显然,您将需要服务器场/配置单元。因为网络通信相对昂贵(并且大多数MMORPG是实时的),所以您可能希望将中央数据库复制到每个游戏服务器(等同于所选数据库中的实时低延迟复制)。
如果您的每台服务器都服务于游戏世界的特定部分(例如《魔兽世界》的作品);类似于分布式分区视图。DPV允许您在不同服务器之间划分数据库的行;根据每个服务器上列的约束。MSSQL和Oracle都足够聪明,只需要与包含WHERE或ON子句中的数据的服务器通信即可。我不确定任何开源产品是否具有DPV。
这一切的最终结果是,无论您使用什么数据库都无关紧要,只需使用一个具有良好名称的数据库:MSSQL,Oracle,MySQL,PostgreSQL。用ANSI SQL编写数据库,然后查看哪个系统运行最佳-这是找出答案的唯一方法。
NoSQL路由也可能是一个好主意,因为它是为高并发性而设计的。Pranny的建议可能会解决问题。
我想这很大程度上取决于您需要存储哪种数据以及以哪种格式存储。
我认为大多数人都使用“标准” SQL数据库来存储“动态”数据,例如播放器信息,例如SQL Server,MySQL,PostgreSQL。
但是,“内部”数据(世界状况,内容等)可以以任何形式存储,我的猜测是,大多数公司至少为此部分编写了部分定制的数据库系统,以满足他们的特定需求。
这个问题已经很老了,但是我关于如何处理它的想法和今天一样有效。
如果您使用的是关系数据库,则需要减少它的负载,因此该想法应会有所帮助。
将所有公共信息存储在每个客户端系统上的本地数据库以及服务器数据库中。
将所有包含项目的表存储在客户端数据库上。当您将鼠标悬停在该武器上以获得统计信息时,客户端无需查看服务器,而是仅检查本地数据库中的统计信息。服务器具有自己的数据库,用于在计算时提取统计信息,并且仅将剩余的损坏和健康状况转发给客户端。
这个想法最糟糕的情况是,如果每个人都能够进入客户数据库,那么每个人都可以看到所有武器的统计信息。不管是什么原因,即使它们更改了值也没关系,服务器上的数据库值就是游戏中的计算内容。