2012-06-09 10 views
13

estoy haciendo un poco de complemento para un juego, y que necesita para almacenar información sobre un jugador:Cuando es apropiado utilizar una base de datos, en Python

  • nombre de usuario
  • dirección IP
  • ubicación en juego
  • una lista de nombres de usuario alternativos que han llegó desde esa IP o direcciones IP alternativa que provienen de ese nombre de usuario

leí un artículo Hace un tiempo que dije que a menos que esté almacenando una gran cantidad de información que no puede ser almacenada en RAM, no debería usar una base de datos. Así que traté de usar el módulo shelve en python, pero no estoy seguro de si es una buena idea.

Cuando piensan que es una buena idea usar una base de datos, y cuándo es mejor almacenar información de otra manera, también hay otras formas de almacenar información además de las bases de datos y las bases de datos sin formato.

+1

piensa en esto: necesitas almacenar algo que va a ser "persistente"? – xvatar

+0

Lo almacenaría en un archivo de configuración, lo leería en la memoria mientras duraba el programa y luego lo escribiría de nuevo en el archivo de configuración si se realizaran cambios. –

+3

@xvatar: Y si respondió esa pregunta con un "sí", la siguiente pregunta sería "¿realmente necesito algo más pesado que un archivo de texto?" –

Respuesta

8

Lo que es más importante, a menos que necesite específicamente un rendimiento o una alta confiabilidad, haga lo que sea que su código sea más simple/fácil de escribir.


Si los datos está muy estructurado (SQL y usted sabe o están dispuestos a aprender) a continuación, utilizando una base de datos como sqlite3 podría ser apropiada. (Debe ignorar el comentario sobre el tamaño de la base de datos y la RAM: hay ocasiones en que las bases de datos son apropiadas incluso para conjuntos de datos muy pequeños, debido a la estructura de los datos)

Si los datos son relativamente simples y no necesita la confiabilidad que una base de datos (normalmente) tiene para luego almacenarla en uno de los tipos de datos incorporados mientras el programa se está ejecutando, probablemente sea correcto.

Si desea que los datos almacenados en el disco sean legibles (y editables, con un poco de esfuerzo), entonces un formato como JSON (hay un módulo json integrado) es agradable, ya que los objetos básicos de Python se serializan sin ningún esfuerzo. Si los datos no son tan simples, entonces YAML es esencialmente una versión extendida de JSON (PyYAML es muy buena).Del mismo modo, puede usar archivos CSV (los módulos csv), aunque esto no es tan bueno como JSON o YAML, o simplemente un formato de texto personalizado (pero esto implica un gran esfuerzo para lograr el manejo de errores y así sucesivamente) .

Por último, si los datos contienen objetos más avanzados (por ejemplo, diccionarios recursivos, o tipos de datos personalizados complicados) a continuación, utilizando una de las técnicas de serialización binarios incorporados (pickle, shelve etc.) podría ser apropiado, sin embargo, YAML puede manejar muchas de estas cosas (incluidas las estructuras de datos recursivas).

Algunos puntos generales:

  • formatos de texto plano son agradables, ya que permiten a los valores a ser ajustados fácilmente y depuración/pruebas es fácil
  • formatos binarios son agradables, ya que significa que los valores no se ser ajustado sin un poco de esfuerzo extra (esto no quiere decir que no se puedan ajustar), y el tamaño del archivo es más pequeño (probablemente no relevante)
6

Asumiendo por 'base de datos' se quiere decir 'base de datos relacional' - incluso las bases de datos incrustadas como SQLite incluyen cierta sobrecarga en comparación con un archivo de texto sin formato. Pero, a veces, los gastos generales valen la pena en comparación con los tuyos.

La pregunta más importante que debe hacerse es si está almacenando datos relacionales, si cosas como la normalización y las consultas SQL tienen algún sentido. Si necesita buscar datos en varias tablas mediante combinaciones, seguramente debería usar una base de datos relacional, eso es lo que son para. Por otro lado, si todo lo que necesita hacer es buscar en una tabla basada en su clave principal, es probable que desee un archivo CSV. Pickle y shelve son útiles si lo que persiste son los objetos que usas en tu programa, si solo puedes agregar los métodos mágicos relevantes a tus clases existentes y esperar que todo tenga sentido.

Ciertamente "no debe usar bases de datos a menos que tenga muchos datos" no es el mejor consejo: la cantidad de datos va más a qué base de datos puede usar si está utilizando una. SQLite, por ejemplo, no sería adecuado para algo del tamaño de Stackoverflow, pero, MySQL o Postgres casi con seguridad serían excesivos para algo con cinco usuarios.

Cuestiones relacionadas