Respostas:
Sim, esperamos que Ben Z dê uma explicação melhor dos motivos do que eu, uma vez que ele era realmente o autor original do nosso banco de dados. A versão curta é que os bancos de dados relacionais não são muito úteis para jogos porque não podem armazenar com eficiência dados hierárquicos fortemente estruturados, o que compõe a grande maioria dos dados que um MMO precisa para operar normalmente. Optamos por criar um banco de dados de objetos personalizados e parte de um sistema de processamento de transações distribuídas, que agora está em produção e alimentando nossos dois jogos ao vivo.
Quanto a se você deveria fazer o mesmo? Provavelmente não, pelo menos não a princípio. Eu ainda advogaria evitar o SQL, mas agora existem muito mais opções no mundo "NoSQL" que não existiam há alguns anos atrás.
Dito isto, a maioria dos MMOs são executados em bancos de dados SQL (relacionais). Sei que Eve é executada em uma instalação do SQL Server em cima de alguns RAMSANs com vários TB (provavelmente nunca na minha vida terei tanto dinheiro quanto essas coisas custam).
EDIT: Espero que ele não se importe de eu postar isso aqui, mas esta é uma entrada de blog com alguns links e comentários sobre a apresentação que fizemos no GDC'08 sobre nosso banco de dados.
Ok, esta resposta é mais uma observação.
Divulgação completa Não trabalhei no MMORPG. Eu trabalhei em um dos 10 sites mais visitados em 2009, e trabalhei em uma empresa de motores de jogos que pensava estar desenvolvendo tecnologia MMORPG (não sei se foi lançada).
Se você olhar para empresas que alcançaram uma escala maciça (Google, Facebook, Twitter etc.), sei que não são empresas de jogos, mas vale a pena olhar neste espaço), há duas coisas que considero importantes.
Um grande erro é pegar alguma coisa cara na mão e esperar que ela seja magicamente escalável para você. Não é assim que funciona. A chave para expandir é lidar com cada novo desafio adequadamente. Você precisa de soluções flexíveis e fáceis de usar, nas quais possa entrar e sair facilmente.
Então, meu conselho para você seria se você estivesse começando, apenas tenha o que parece menos dor de cabeça para lidar.
Basicamente, há toda uma gama de abordagens, e acho que elas são escolhidas com base mais nas experiências de seus desenvolvedores e nas propriedades do banco de dados. Em uma extremidade, muitos MMOs estão usando bancos de dados relacionais padrão - por exemplo. Dark Ages of Camelot usou / usa (eles ainda estão indo?) MySQL , FreeRealms usam um Postgresql modificado , etc.
Movendo-se ao longo da escala, você tem Guild Wars: eles usam o SQL Server , mas colam seus dados como um único BLOB. Isso significa que eles obtêm os benefícios de seus formatos binários usuais com alguns dos benefícios que um banco de dados fornece. Escusado será dizer que você provavelmente também pode ver algumas desvantagens dessa abordagem, mas para uma empresa acostumada a trabalhar com arquivos simples, provavelmente ainda é um avanço.
Provavelmente existem alguns lugares usando as várias abordagens formalizadas do NoSQL, embora ainda seja cedo. Farmville usa o membase , que eles criaram para esse fim, aparentemente baseado no memcached. Isso compartilha muitos recursos com o MongoDB, CouchDB, etc. Novamente, com essas abordagens, você normalmente lança seus próprios formatos de armazenamento, mas obtém os benefícios de distribuição, armazenamento em cache, redundância etc.
Alguns estão lançando seu próprio NoSQL inteiramente: a Cryptic disse que fez algo semelhante, mas também disse que não o estava usando na produção. ( EDIT : mas veja os comentários abaixo.)
E você chega a pessoas que usam texto simples ou arquivos binários - como eu entendo, os jogos mais antigos, como Ultima Online, Everquest, etc, seguiram esse caminho e, para uma empresa com experiência em desenvolvimento de jogos, mas pouca experiência em banco de dados, isso funciona bem também.
Observe também que você quase nunca escreve seu próprio banco de dados em algum sentido genérico do termo - em jogos, você sempre terá dados personalizados que você precisa gerenciar na memória ou no disco de maneiras que não se prestam para software genérico. Você não pode fazer consultas SQL toda vez que quiser alguns dados, portanto, você deve espelhar muitas informações no código, independentemente do backend usado.
Em Pirates of the Burning Sea, observamos o MySQL (embora honestamente eu preferisse o Postgres) e, quando começou a cair sob carga, mudamos para o Microsoft SQL Server. Honestamente, porém, provavelmente não vou seguir esse caminho novamente no futuro. A maioria dos dados do PotBS é pré-serializada antes de persistir, de modo que uma grande parte do que está no banco de dados nada mais é do que um armazenamento de chave / valor super crescido. Além disso, para obter melhor desempenho de nossa camada de persistência e melhor controle de como os dados foram armazenados em cache na memória, acabamos escrevendo um servidor de cache que ficava na frente do banco de dados.
Então, Kylotan está muito certo, você não vai se dar bem em algum nível. Os servidores de banco de dados relacional SQL não foram projetados para a maneira como os jogos usam dados. Em vez de assumir que os servidores de banco de dados relacional eram o final de todos os bancos de dados, realmente deveríamos ter pensado mais sobre quais benefícios estávamos procurando antes de escolher uma ferramenta.
Na próxima vez, examinarei mais coisas como o BerkleyDB ou alguns dos outros bancos de dados no estilo NoSQL.
Outra coisa a observar é que, se você tiver um conjunto de dados (relativamente) estático, não o armazene em um banco de dados! Não há realmente uma boa razão para armazenar suas definições de feitiços, definições de itens, mapas etc. em um banco de dados. Você raramente os consulta, exceto pelo nome. Vejo muitas pessoas entrando no desenvolvimento de jogos armazenando essas coisas junto com os dados persistentes dos jogadores, e é uma classe de coisas totalmente diferente.
Você precisa de um armazenamento de dados, como um sistema de arquivos, para isso. Fora do desenvolvimento, você não precisa de ACID, não precisa de CRUD, não precisa de um banco de dados para esse tipo de dados. Dentro do desenvolvimento, você precisa de um banco de dados, mas também precisa de um VCS, e sua escolha do VCS fará essa escolha de banco de dados para você.
(Se você está trabalhando em um jogo em que os jogadores podem criar magias, itens ou missões personalizados, bem, esses dados são do mesmo tipo que os dados dos jogadores e você precisa de um banco de dados novamente.)
Os MMORPGs são aplicativos intensivos e são um grande empreendimento. Se você está começando com o desenvolvimento de jogos, eu recomendo fortemente que você faça algo menor.
Dito isto, você precisará de dois desempenho squeeze superior fora da sua configuração. Obviamente, você precisará de um farm / seção de servidores. Como a comunicação em rede é relativamente cara (e a maioria dos MMORPGs é em tempo real), convém replicar o banco de dados central para cada servidor de jogo (o equivalente à replicação de baixa latência em tempo real no banco de dados de sua escolha).
Se cada um de seus servidores estiver atendendo a um segmento específico do mundo do jogo (como o WoW funciona); algo como Exibições Particionadas Distribuídas . Os DPVs permitem segmentar linhas do seu banco de dados em diferentes servidores; de acordo com as restrições nas colunas em cada servidor. O MSSQL e o Oracle são inteligentes o suficiente para conversar apenas com o servidor que contém os dados que se enquadram na sua cláusula WHERE ou ON. Não tenho certeza se alguma das ofertas de código aberto tem DPVs.
O resultado final de tudo isso é que não importa qual banco de dados você usa , basta usar um com um bom nome: MSSQL, Oracle, MySQL, PostgreSQL. Escreva seu banco de dados em ANSI SQL e veja qual sistema funciona melhor - essa é a única maneira de descobrir.
A rota NoSQL também pode ser uma boa ideia, pois foi projetada para alta simultaneidade. A sugestão de Pranny pode ajudar.
Eu usei o MongoDB (NoSQL), é um armazenamento de documentos muito rápido que pode ser acessado através de TCP. De uma chance! É incrivel!
Escrever seu próprio banco de dados é uma tarefa assustadora. Sugiro que você primeiro explore o que já existe e, se não conseguir encontrar algo que atenda ao seu conjunto específico de critérios, crie seu próprio. Ah, e não se esqueça de abrir o código-fonte. :)
Eu acho que depende muito do tipo de dados que você precisa armazenar e sob qual formulário.
Eu acho que a maioria das pessoas por aí usa bancos de dados SQL "padrão" para dados "dinâmicos", como informações sobre jogadores, seja SQL Server, MySQL, PostgreSQL.
No entanto, dados "internos" (estado do mundo, conteúdo, ....) podem ser armazenados de qualquer forma, e acho que a maioria das empresas escreve pelo menos parcialmente sistemas de bancos de dados personalizados para essa parte, adequados às suas necessidades específicas .
Esta questão é bastante antiga, mas minha idéia de como lidar com isso é tão válida quanto foi solicitada hoje.
Se você estiver usando um banco de dados relacional, precisará reduzir a carga nele, para que essa ideia ajude.
Armazene todas as informações públicas em um banco de dados local em cada sistema cliente, bem como no banco de dados do servidor.
Armazene todas as tabelas com itens no banco de dados do cliente. Em vez de o cliente procurar no servidor quando você passa o mouse sobre essa arma por estatísticas, o cliente apenas verifica o banco de dados local quanto a estatísticas. O servidor possui seu próprio banco de dados para obter estatísticas ao calcular e encaminhar os danos e a saúde restantes para os clientes.
O pior caso com essa idéia é que todos podem ver as estatísticas de todas as armas se conseguirem entrar no banco de dados de clientes. não importa o que causa, mesmo que eles alterem os valores, os valores do banco de dados no servidor são os que calculam no jogo.