Pergunta

Eu estou trabalhando em um MUD (Multi User Dungeon) em Python e só estou começando agora volta para o ponto onde eu preciso adicionar alguns quartos, inimigos, itens, etc.Eu poderia codificar tudo isso, mas parece que este é mais um trabalho para um banco de dados.

No entanto, eu realmente nunca fiz nenhum trabalho com bancos de dados antes, então eu queria saber se você tem algum conselho sobre como definir isso?

  • Em que formato devo armazenar os dados?
    • Eu estava pensando em armazenar um objeto de Dicionário no banco de dados de cada entidade.Em htis forma, eu poderia simplesmente adicionar novos atributos para o banco de dados na hora, sem alterar as colunas do banco de dados.Será que o som razoável?
  • Devo armazenar todas as informações no mesmo banco de dados, mas em tabelas diferentes ou diferentes entidades (os inimigos e quartos) em diferentes bancos de dados.

  • Eu sei que vai ser uma lata de vermes, mas o que são algumas sugestões para um bom banco de dados?É o MySQL é uma boa escolha?

Foi útil?

Solução

1) não Há quase nenhuma razão para ter dados para a mesma aplicação em bancos de dados diferentes.Não, a menos que você é um Fortune500 tamanho de empresa (OK, eu sou exaggregating).

2) Armazenar as informações em tabelas diferentes.

Como um exemplo:

  • T1:Quartos

  • T2:Sala de propriedades comuns (aplicável para cada quarto), com uma linha por **sala*

  • T3:Quarto propriedades únicas (aplicável a minoria dos quartos, com uma linha por propriedade por quarto - thos torna fácil adicionar propriedades personalizadas sem a adição de novas colunas

  • T4:Quarto-Sala de conexões

    Tendo T2 E T3 é importante, pois permite combinar a eficiência e a velocidade de linha-por-sala idéia de onde é aplicável, com flexibilidade/maintanability/economia de espaço de atributo-per-entidade-por-linha (ou Objeto/atributo/valor como IIRC é chamado na fantasia termos) esquema

Boa discussão é aqui

3) Implementação sábio, tente escrever algo re-utilizável, por exemplo,genérica "Get_room" métodos, que debaixo de acesso a banco de dados= idealmente através de transact SQL ANSI SQL ou então você pode sobreviver a alteração do banco de dados de back-end bastante indolor.

Para trabalho inicial, você pode usar o SQLite.Barato, fácil e SQL compatível (o melhor de propriedade de todos).Instalar é praticamente nada, banco de dados de gerenciamento pode ser feito por ferramentas freeware ou mesmo plugin do FireFox IIRC (todos do FireFox 3 armazenamentos de dados, a - histórico, favoritos, lugares, etc...- são todos os bancos de dados SQLite).

Para mais tarde, MySQL ou Postgres (eu não faço um profissional, então não posso recomendar um).IIRC em algum ponto Sybase tinha de higiene pessoal servidor de banco de dados bem, mas não faço ideia se esse ainda é o caso.

Outras dicas

  • Esta técnica é chamada Modelo de entidade-atributo-valor. Normalmente, é preferido ter esquema de banco de dados que reflete a estrutura dos objetos e atualize o esquema quando a estrutura do seu objeto mudar. Esse esquema rigoroso é mais fácil de consultar e é mais fácil garantir que os dados estejam corretos no nível do banco de dados.
  • Um banco de dados com várias tabelas é a maneira de fazer.
  • Se você deseja um servidor de banco de dados, recomendo o PostgreSQL. O MySQL tem algumas vantagens, como replicação fácil, mas o PostgreSQL geralmente é melhor trabalhar. Se você deseja algo menor que funcione diretamente com o aplicativo, o SQLite é um bom banco de dados incorporado.

Armazenar um objeto inteiro (serializado/codificado) como um valor no banco de dados é ruim para consultar - tenho certeza de que algumas consultas na sua lama não precisarão saber 100% dos atributos ou podem recuperar uma lista de objeto por um valor de valor de um valor de atributos.

parece que isso é mais um trabalho para um banco de dados

É verdade que, embora o 'banco de dados' não precise significar 'banco de dados relacional'. A maioria dos Muds existentes armazena todos os dados na memória e o leia em arquivo plano, salvo em um formato de dados de texto simples. Não estou necessariamente recomendando essa rota, apenas apontando que um banco de dados tradicional não é de forma alguma necessário. Se você quiser seguir o caminho relacional, versões recentes do Python vêm com sqlite que é um banco de dados relacional incorporado leve com um bom suporte ao SQL.

O uso de bancos de dados relacionais com seu código pode ser estranho. Qualquer alteração para uma classe de lógica de jogo pode exigir uma alteração paralela ao banco de dados e alterações no código que leu e grava no banco de dados. Por esse motivo, um bom planejamento o ajudará muito, mas é difícil planejar um bom esquema de banco de dados sem experiência. Pelo menos, planeje suas classes de entidade e depois crie um esquema de banco de dados em torno dele. Lendo normalizando um banco de dados e entender os princípios lá ajudará.

Você pode usar um 'mapeador de objetos' que pode simplificar muito disso para você. Exemplos em Python incluem Sqlobject, Sqlalchemy, e Outono. Eles escondem muitas das complexidades para você, mas, como resultado, também podem ocultar alguns dos detalhes importantes. Eu recomendo usar o banco de dados diretamente até que você esteja mais familiarizado com ele e considere usar um ORM no futuro.

Eu estava pensando em armazenar um objeto de dicionário no banco de dados para cada entidade. De maneira HTIS, eu poderia simplesmente adicionar novos atributos ao banco de dados em tempo real sem alterar as colunas do banco de dados. Isso soa razoável?

Infelizmente, não - se você fizer isso, você desperdiça 99% dos recursos do banco de dados e o está usando efetivamente como um armazenamento de dados glorificado. No entanto, se você não precisar de recursos de banco de dados mencionados acima, esta é uma rota válida se você usar a ferramenta correta para o trabalho. O padrão Shelve Vale a pena procurar módulo para esse fim.

Devo armazenar todas as informações no mesmo banco de dados, mas em diferentes tabelas ou entidades diferentes (inimigos e salas) em diferentes bancos de dados.

Um banco de dados. Uma tabela no banco de dados por tipo de entidade. Essa é a abordagem típica ao usar um banco de dados relacional (por exemplo, MySQL, SQL Server, SQLite, etc).

Eu sei que isso será uma lata de vermes, mas quais são algumas sugestões para um bom banco de dados? O MySQL é uma boa escolha?

Eu aconselho a manter o SQLite até que você esteja mais familiarizado com o SQL. Caso contrário, o MySQL é uma opção razoável para um banco de dados de jogos gratuito, assim como o PostgreSQL.

Um banco de dados. Cada tabela de banco de dados deve se referir a um objeto de dados real.

Por exemplo, crie uma tabela para todos os itens, todas as criaturas, todas as classes de personagens, todos os tesouros, etc.

Passe algum tempo agora e descubra como os objetos se relacionam, pois isso afetará sua estrutura de banco de dados. Por exemplo, um personagem pode ter mais de uma classe de personagem? Os monstros podem ter classes de personagens? Os monstros podem carregar itens? Os quartos podem ter mais de um monstro?

Parece pedante, mas você economizará muitos problemas com antecedência, descobrindo quais objetos de banco de dados "pertencem" aos outros objetos do banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top