Pregunta

Estoy trabajando en un MUD (Multi User Dungeon) en Python y estoy ahora moverse hasta el punto que tengo que añadir algunas habitaciones, enemigos, objetos, etc. Me podría codificar todo esto en, pero parece como esto es más de un trabajo para una base de datos.

Sin embargo, en realidad nunca he hecho ningún trabajo con bases de datos antes así que me preguntaba si tiene algún consejo sobre cómo configurar esto?

  • ¿En qué formato debo guardar los datos en?
    • Estaba pensando en el almacenamiento de un objeto Dictionary en la base de datos para cada entidad. En forma htis, podría simplemente añadir nuevos atributos a la base de datos sobre la marcha sin alterar las columnas de la base de datos. ¿Le suena razonable?
  • ¿Debo almacenar toda la información en la misma base de datos, pero en diferentes tablas o diferentes entidades (enemigos y habitaciones) en diferentes bases de datos.

  • Sé que esto va a ser una lata de gusanos, pero ¿cuáles son algunas sugerencias para una buena base de datos? MySQL es una buena opción?

¿Fue útil?

Solución

1) No hay casi nunca ningún motivo para tener datos para la misma aplicación en diferentes bases de datos. No a menos que usted es una empresa de tamaño Fortune500 (OK, estoy exaggregating).

2) Almacenar la información en tablas diferentes.

A modo de ejemplo:

  • T1: Las habitaciones

  • T2: propiedades habitación general (APLICABLE a cada habitación), con una fila por cada ** habitación *

  • T3: Sala de propiedades únicas (aplicables a minoría de habitaciones, con una fila por propiedad por habitación - Thos hace que sea fácil agregar propiedades personalizadas sin añadir nuevas columnas

  • T4: conexiones-sala

    Tener T2 y T3 es importante ya que permite combinar la eficiencia y la velocidad de la idea de fila-por-habitación en la que es aplicable con la flexibilidad / maintanability / ahorro de espacio de atributo-per-entidad-por-fila (o un objeto / atributo / valor como IIRC se llama en términos de fantasía) del esquema

buena discusión es aquí

3) La aplicación sabia, tratar de escribir algo re-utilizable, por ejemplo, disponer de métodos genéricos "Get_room", que acceden por debajo del DB -. = idealmente a través de Transact SQL o ANSI SQL para que pueda sobrevivir el cambio de base de datos back-end bastante sin dolor

En el trabajo inicial, se puede utilizar SQLite. Barato, fácil y SQL compatible (la mejor propiedad de todos). Instalación es casi nada, gestión de base de datos puede hacerse mediante herramientas de software libre o incluso FireFox IIRC plug-in (todos los almacenes de datos de Firefox 3 - historial, marcadores, lugares, etc ... - son todas las bases de datos SQLite).

Para más adelante, ya sea MySQL o PostgreSQL (no hago cualquiera profesionalmente por lo que no se puede recomendar uno). IIRC en algún momento tenía Sybase servidor db personal libre también, pero ni idea de si eso es todavía el caso.

Otros consejos

  • Esta técnica se llama modelo de entidad-atributo-valor . Normalmente es preferible tener esquema de base de datos que refleja la estructura de los objetos, y actualizar el esquema cuando su estructura de objetos cambios. Tal esquema estricto es más fácil de consultar y es más fácil de asegurarse de que los datos son correctos en el nivel de base de datos.
  • Una base de datos con varias tablas es la forma de hacerlo.
  • Si desea un servidor de base de datos, he recomiendo PostgreSQL. MySQL tiene algunas ventajas, como facilitar la réplica, pero PostgreSQL es generalmente más agradable para trabajar. Si quieres algo más pequeña que trabaja directamente con la aplicación, SQLite es una base de datos integrada buena.

El almacenamiento de todo un objeto (serializado / codificado) como un valor en la base de datos es malo para la consulta - Estoy seguro de que algunas consultas en el lodo no se necesita saber el 100% de los atributos, o pueden recuperar una lista de objetos por un valor de atributos.

  

parece que esto es más de un empleo   para una base de datos

Es cierto que, aunque 'base de datos' no tiene que significar 'base de datos relacional'. La mayoría de los fangos almacenar todos los datos existentes en la memoria, y lo leen desde archivo plano guardado en un formato de datos de texto sin formato. No estoy necesariamente de recomendar esta ruta, simplemente señalando que una base de datos tradicional no es en absoluto necesario. Si quieres ir a la ruta relacional, las versiones recientes de Python vienen con sqlite cuales es una base de datos relacional integrada ligero, con buen soporte de SQL.

El uso de bases de datos relacionales con su código puede ser incómodo. Cualquier cambio a una clase de lógica de juego puede requerir un cambio en paralelo a la base de datos, y los cambios en el código que leer y escribir en la base de datos. Por esta razón, una buena planificación le ayudará mucho, pero es difícil de planificar un buen esquema de base de datos sin experiencia. Al menos reciben sus clases de entidad planificadas en primer lugar, a continuación, construir un esquema de base de alrededor de ella. Leyendo sobre normalizador un base de datos y la comprensión de los principios no será de ayuda.

Es posible que desee utilizar un 'mapeador objeto-relacional' que puede simplificar mucho de esto para usted. Ejemplos en Python incluyen SQLObject , SQLAlchemy y otoño . Estos se esconden muchas de las complejidades para usted, pero como resultado se puede ocultar algunos de los detalles importantes también. Me gustaría recomendar el uso de la base de datos directamente hasta que esté más familiarizado con él, y considerar el uso de un ORM en el futuro.

  

Yo estaba pensando en almacenar un diccionario   objeto en la base de datos para cada   entidad. En forma htis, pude entonces   sólo tiene que añadir nuevos atributos a la   base de datos sobre la marcha sin alterar   las columnas de la base de datos. Hace eso   sonar razonable?

Desafortunadamente no - si lo hace, usted pierde el 99% de las capacidades de la base de datos y está utilizando con eficacia como un almacén de datos glorificado. Sin embargo, si usted no necesita capacidades de bases de datos antes mencionados, esto es una ruta válida si se utiliza la herramienta adecuada para el trabajo. El estantería módulo es bien vale la pena mirar para este propósito.

  

¿Debo almacenar toda la información en   la misma base de datos, pero en diferente   tablas o diferentes entidades (enemigos   y habitaciones) en diferentes bases de datos.

Una base de datos. Una tabla en la base de datos según el tipo de entidad. Ese es el enfoque típico cuando se utiliza una base de datos relacional (por ejemplo. MySQL, SQL Server, SQLite, etc).

  

Sé que esto va a ser una lata de gusanos,   pero ¿cuáles son algunas sugerencias para una   buena base de datos? MySQL es una buena opción?

Yo aconsejaría quedarse con SQLite hasta que esté más familiarizado con SQL. De lo contrario, MySQL es una opción razonable para una base de datos de juego libre, como es PostgreSQL.

Una base de datos. Cada tabla de base de datos debe referirse a un objeto de datos real.

Por ejemplo, crear una tabla para todos los elementos, todas las criaturas, todas las clases de personajes, todos los tesoros, etc.

Pasa algún tiempo y averiguar cómo los objetos se relacionan entre sí, ya que esto afectará a la estructura de su base de datos. Por ejemplo, un personaje puede tener más de una clase de caracteres? Pueden tener monstruos clases de personajes? Pueden llevar artículos monstruos? ¿Pueden las habitaciones tienen más de un monstruo?

Parece pedante, pero se ahorrará un montón de problemas al principio por averiguar qué base de datos de objetos "pertenecen" a la que otros objetos de base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top