¿Buenas razones para NO usar una base de datos relacional?


139

¿Puede señalar herramientas alternativas de almacenamiento de datos y dar buenas razones para usarlas en lugar de bases de datos relacionales antiguas? En mi opinión, la mayoría de las aplicaciones rara vez usan todo el poder de SQL; sería interesante ver cómo construir una aplicación libre de SQL.

Respuestas:


148

Archivos de texto sin formato en un sistema de archivos

  • Muy simple de crear y editar
  • Fácil de manipular para los usuarios con herramientas simples (es decir, editores de texto, grep, etc.)
  • Almacenamiento eficiente de documentos binarios.

Archivos XML o JSON en disco

  • Como arriba, pero con un poco más de capacidad para validar la estructura.

Hoja de cálculo / archivo CSV

  • Modelo muy fácil de entender para los usuarios de negocios.

Subversion (o un sistema de control de versiones basado en disco similar)

  • Muy buen soporte para versionar datos

Berkeley DB (Básicamente, una tabla hash basada en disco)

  • Muy simple conceptualmente (solo clave / valor sin escribir)
  • Bastante rapido
  • Sin gastos generales de administración
  • Admite transacciones que creo

DB simple de Amazon

  • Al igual que Berkeley DB, creo, pero alojado

Almacén de datos de Google App Engine

  • Hospedado y altamente escalable
  • Por documento de almacenamiento de valores clave (es decir, modelo de datos flexible)

CouchDB

  • Foco del documento
  • Almacenamiento simple de datos semiestructurados / basados ​​en documentos

Colecciones de idiomas nativos (almacenados en memoria o serializados en disco)

  • Integración lingüística muy ajustada

Motor de almacenamiento personalizado (escrito a mano)

  • Potencialmente muy alto rendimiento en casos de uso requeridos

No puedo afirmar que sepa mucho sobre ellos, pero también te gustaría mirar en los sistemas de bases de datos de objetos .


10
Sería genial si también explicaras los inconvenientes de cada opción, de lo contrario, ¿cómo se supone que debes elegir? Gracias,
Sklivvz

44
También escribir millones de filas en una base de datos puede llevar un día, mientras que agregar un millón de líneas de registro a un archivo lleva solo unos minutos. Nunca entenderé por qué la gente insiste en poner datos de registro en una base de datos.
Aaron Digulla

33
Aaron: Tengo una razón: SELECCIONAR mensajes desde el registro DONDE (fecha ENTRE 2009-01-01 Y 2009-03-01) Y type = 'error' AND system = 'windows' :) ¿Cómo cargaría eso desde un archivo de texto? ?
Tomáš Fejfar

1
Estoy totalmente a favor de los archivos de texto siempre que sea posible. No siempre se puede usar, pero cuando puede que son mucho más fáciles de diagnosticar problemas en.
Loren Pechtel

berkeley db definitivamente tiene transacciones. los archivos de texto y los archivos xml / json no lo hacen, por lo que las aplicaciones multiproceso pueden pisotearlos si no tienes cuidado. Los archivos CSV son maravillosos para colecciones de parámetros porque los usuarios de negocios simplemente pueden mirarlos y editarlos sin herramientas adicionales. Los archivos de texto son excelentes para aplicaciones de escritura única / lectura casi nunca como el registro. Para elegir un enfoque, debe descubrir lo que está tratando de lograr
O. Jones

26

La respuesta de Matt Sheppard es excelente (mod up), pero tendría en cuenta estos factores al pensar en un huso:

  1. Estructura: ¿obviamente se rompe en pedazos, o estás haciendo compensaciones?
  2. Uso: ¿cómo serán analizados / recuperados / procesados ​​los datos?
  3. Vida útil: ¿durante cuánto tiempo son útiles los datos?
  4. Tamaño: ¿cuántos datos hay?

Una ventaja particular de los archivos CSV sobre los RDBMS es que pueden ser fáciles de condensar y moverse prácticamente a cualquier otra máquina. Hacemos grandes transferencias de datos, y todo es lo suficientemente simple, solo usamos un gran archivo CSV y fácil de escribir usando herramientas como rsync. Para reducir la repetición en grandes archivos CSV, puede usar algo como YAML . No estoy seguro de que almacene algo como JSON o XML, a menos que tenga requisitos de relación significativos.

En cuanto a las alternativas no mencionadas, no descarte Hadoop , que es una implementación de código abierto de MapReduce. Esto debería funcionar bien si tiene una TONELADA de datos poco estructurados que necesitan ser analizados, y desea estar en un escenario en el que simplemente puede agregar 10 máquinas más para manejar el procesamiento de datos.

Por ejemplo, comencé a tratar de analizar el rendimiento que era esencialmente todos los números de tiempo de diferentes funciones registradas en alrededor de 20 máquinas. Después de intentar pegar todo en un RDBMS, me di cuenta de que realmente no necesito consultar los datos nuevamente una vez que los agregué. Y, solo es útil en su formato agregado para mí. Por lo tanto, mantengo los archivos de registro comprimidos y luego dejo los datos agregados en una base de datos.

Tenga en cuenta que estoy más acostumbrado a pensar con tamaños "grandes".


55
Un peligro de los archivos CSV es que el escape debe hacerse correctamente; es 'fácil de implementar un lector o escritor de CSV que realmente no sigue las especificaciones, ya que se ve engañosamente simple y hay algunas sutilezas: en.wikipedia.org/wiki/Comma-separated_values#Specification
Jared Updike

10

El sistema de archivos es útil para almacenar datos binarios, que nunca funcionan increíblemente bien en bases de datos relacionales.



6

Si no necesita ACID , probablemente no necesite la sobrecarga de un RDBMS. Entonces, determina si necesitas eso primero. La mayoría de las respuestas que no son RDBMS proporcionadas aquí no proporcionan ACID.


1
¿Puede dar un ejemplo de por qué / cuándo no se necesita ACID?
Ivan Voroshilin

1
@vibneiro, si la base de datos tiene un solo usuario que solo realiza operaciones secuenciales, o el riesgo de inconsistencias de la base de datos en caso de una falla de energía es aceptable, o el concepto de transacciones de la base de datos no se aplica, o no hay necesidad de restricciones, cascadas, disparadores o similares, entonces un proveedor no ACID no RDBMS (por ejemplo, un archivo de texto con una API similar a RDBMS) puede ser suficiente. Por ejemplo, su aplicación puede mantener una base de datos de mensajes de diagnóstico históricos para los cuales ACID es completamente irrelevante y "log.txt" será suficiente.
bzlm

Resulta que ACID no es necesario en casos muy raros. Me pregunto por qué las bases de datos NoSQL son tan populares. La mayoría de ellos no son compatibles con ACIDity.
Ivan Voroshilin

@vibneiro, NoSQL suele ser más fácil, más ligero, más incrustable, más autohospedable, más intuitivo, más flexible y, por lo general, con algo de ACID. Si no tiene datos relacionales, un RDBMS probablemente no sea lo que necesita.
bzlm

6

Motor de almacenamiento personalizado (escrito a mano) / Potencialmente muy alto rendimiento en casos de uso requeridos

http://www.hdfgroup.org/

Si tiene enormes conjuntos de datos, en lugar de crear los suyos, puede usar HDF, el formato de datos jerárquicos.

http://en.wikipedia.org/wiki/Hierarchical_Data_Format :

HDF admite varios modelos de datos diferentes, incluidas matrices multidimensionales, imágenes ráster y tablas.

También es jerárquico como un sistema de archivos, pero los datos se almacenan en un archivo binario mágico.

HDF5 es un conjunto que hace posible la gestión de colecciones de datos extremadamente grandes y complejas.

Piense en petabytes de datos de teledetección de la NASA / JPL.


4

G'day

Un caso en el que puedo pensar es cuando los datos que está modelando no se pueden representar fácilmente en una base de datos relacional.

Una vez, tal ejemplo es la base de datos utilizada por los operadores de telefonía móvil para monitorear y controlar estaciones base para redes de telefonía móvil.

Casi todos estos casos, un OO DB se utiliza , ya sea un producto comercial o un sistema auto-enrollado que permite jerarquías de objetos.

Trabajé en una aplicación de monitoreo 3G para una gran empresa que permanecerá sin nombre, pero cuyo logotipo es una mancha de vino tinto (-:, y utilizaron un DB OO para realizar un seguimiento de todos los diversos atributos para las celdas individuales dentro del red.

La interrogación de tales bases de datos se realiza utilizando técnicas patentadas que, por lo general, están completamente libres de SQL.

HTH

salud,

Robar


44
¿Por qué los datos de la estación base no se prestan bien al modelo relacional?
kaybenleroll

3

Las bases de datos de objetos no son bases de datos relacionales. Pueden ser realmente útiles si solo desea rellenar algunos objetos en una base de datos. También admiten versiones y clases de modificación para objetos que ya existen en la base de datos. db4o es el primero que me viene a la mente.


3

En algunos casos (datos del mercado financiero y control de procesos, por ejemplo), es posible que deba usar una base de datos en tiempo real en lugar de un RDBMS. Ver enlace wiki


3

Había una herramienta RAD llamada JADE escrita hace unos años que tiene un OODBMS incorporado. Las encarnaciones anteriores del motor DB también eran compatibles con Digitalk Smalltalk. Si desea probar la creación de aplicaciones utilizando un paradigma que no sea RDBMS, esto podría ser un comienzo.

Otros productos OODBMS incluyen Objectivity , GemStone (necesitará obtener VisualWorks Smalltalk para ejecutar la versión Smalltalk, pero también hay una versión java). También hubo algunos proyectos de investigación de código abierto en este espacio: EXODUS y su descendiente SHORE vienen a la mente.

Lamentablemente, el concepto parecía morir, probablemente debido a la falta de un estándar claramente visible y una capacidad de consulta ad-hoc relativamente pobre en relación con los sistemas RDMBS basados ​​en SQL.

Un OODBMS es más adecuado para aplicaciones con estructuras de datos centrales que se representan mejor como un gráfico de nodos interconectados. Solía ​​decir que la aplicación OODBMS por excelencia era una mazmorra multiusuario (MUD) donde las habitaciones contendrían los avatares de los jugadores y otros objetos.


2
Solía ​​ser cierto que necesitabas un cliente Smalltalk para usar GemStone / S (para aplicaciones de escritorio) pero con los marcos web Aida ( aidaweb.si ), y Seaside ( seaside.st ) GemStone / S se puede usar directamente como una aplicación servidor. Ver la información en GLASS ( seaside.gemstone.com )
Dale Henrichs

Otra razón sería si te importa la calidad de los datos. En un OODB como Gemstone, es mucho más fácil aplicar reglas de validez complejas.
Stephan Eggermont

Las capacidades de consulta ad hoc de OODBMS son mucho mejores que las de los RDBMS basados ​​en SQL
Stephan Eggermont

1

Puede recorrer un largo camino simplemente usando archivos almacenados en el sistema de archivos. Los RDBMS están mejorando en el manejo de blobs, pero esta puede ser una forma natural de manejar datos de imágenes y similares, particularmente si las consultas son simples (enumerar y seleccionar elementos individuales).

Otras cosas que no encajan muy bien en un RDBMS son las estructuras de datos jerárquicas y supongo que los datos geoespaciales y los modelos 3D tampoco son tan fáciles de trabajar.

Servicios como Amazon S3 proporcionan modelos de almacenamiento más simples (clave-> valor) que no admiten SQL. La escalabilidad es la clave allí.

Los archivos de Excel también pueden ser útiles, especialmente si los usuarios necesitan poder manipular los datos en un entorno familiar y crear una aplicación completa para hacerlo no es factible.


1

Hay una gran cantidad de formas de almacenar datos, incluso "databse relacional" cubre una gama de alternativas desde una simple biblioteca de código que manipula un archivo local (o archivos) como si fuera una base de datos relacional en una base de usuario único, a través de sistemas basados ​​en archivos que pueden manejar múltiples usuarios para una generosa selección de sistemas serios basados ​​en "servidor".

Usamos mucho los archivos XML: obtienes datos bien estructurados, buenas herramientas para consultar la posibilidad de realizar ediciones, si es apropiado, algo que sea legible para los humanos y que no tengas que preocuparte por el funcionamiento del motor db (o el funcionamiento del motor db). Esto funciona bien para cosas que son esencialmente de solo lectura (en nuestro caso la mayoría de las veces generadas a partir de una base de datos en otro lugar) y también para sistemas de un solo usuario donde solo puede cargar los datos y guardarlos según sea necesario, pero está creando oportunidades para problemas si desea la edición multiusuario, al menos de un solo archivo.

Para nosotros, eso es todo: vamos a usar algo que hará SQL (MS ofrece un conjunto de herramientas que se ejecutan desde un .DLL para hacer cosas de un solo usuario hasta el servidor de la empresa y todos hablan el mismo SQL (con limitaciones en el extremo inferior)) o vamos a utilizar XML como formato porque (para nosotros) la verbosidad rara vez es un problema.

Actualmente no tenemos que manipular datos binarios en nuestras aplicaciones para que esa pregunta no surja.

Murph


1

Uno podría considerar el uso de un servidor LDAP en lugar de una base de datos SQL tradicional si los datos de la aplicación están fuertemente orientados a valores / claves y de naturaleza jerárquica.


1

Los archivos BTree suelen ser mucho más rápidos que las bases de datos relacionales. SQLite contiene dentro de ella una biblioteca BTree que está en el dominio público (como en 'dominio público', sin usar el término libremente).

Francamente, si quisiera un sistema multiusuario, necesitaría mucha persuasión para no usar una base de datos relacional de servidor decente.


Los BTrees son la implementación básica de índices normales. Oracle admite tablas organizadas por índice que son solo una tabla implementada como índice. Son más rápidos de leer, más lentos de escribir y usan un árbol B. Ver: < oracle.com/technology/products/oracle9i/datasheets/iots/… >
borjab

1

Bases de datos de texto completo, que pueden consultarse con operadores de proximidad como "dentro de 10 palabras de", etc.

Las bases de datos relacionales son una herramienta empresarial ideal para muchos propósitos: lo suficientemente fácil de entender y diseñar, lo suficientemente rápido, adecuado incluso cuando no están diseñadas y optimizadas por un genio que podría "usar toda la potencia", etc.

Pero algunos propósitos comerciales requieren indexación de texto completo, que los motores relacionales no proporcionan o agregan como una ocurrencia tardía. En particular, los campos legal y médico tienen grandes extensiones de texto no estructurado para almacenar y caminar.


1

También: * Escenarios integrados: donde generalmente se requiere usar algo más pequeño que un RDBMS completo. Db4o es un ODB que puede usarse fácilmente en tal caso. * Desarrollo rápido o de prueba de concepto: donde desea centrarse en el negocio y no preocuparse por la capa de persistencia



1

BESO: Mantenlo pequeño y simple


1
Esa es la versión educada ... He escuchado más a menudo "Mantenlo simple, estúpido" ... o, trago, ¡tal vez eso es lo que la gente me dice! :-(
GreenMatt

1

Ofrecería RDBMS :) Si no tiene problemas con la configuración / administración, vaya a SQLite. Construido en RDBMS con soporte completo de SQL. Incluso le permite almacenar cualquier tipo de datos en cualquier columna.

Ventaja principal contra, por ejemplo, el archivo de registro: si tiene uno enorme, ¿cómo va a buscar en él? Con el motor SQL, solo crea índices y acelera la operación dramáticamente.

Acerca de la búsqueda de texto completo: SQLite también tiene módulos para la búsqueda de texto completo.

Simplemente disfrute de una agradable interfaz estándar para sus datos :)



0

Recomiendo encarecidamente Lua como alternativa al almacenamiento de datos de tipo SQLite.

Porque:

  • El lenguaje fue diseñado como un lenguaje de descripción de datos para comenzar
  • La sintaxis es legible por humanos (XML no lo es )
  • Uno puede compilar fragmentos Lua en binario, para un mayor rendimiento

Esta es la opción de "colección de idiomas nativos" de la respuesta aceptada. Si está utilizando C / C ++ como nivel de aplicación, es perfectamente razonable incluir el motor Lua (100kB de binario) solo por leer configuraciones / datos o escribirlos.


Lua es un lenguaje de programación. Esta sugerencia podría generalizarse para sugerir cualquier característica de persistencia / serialización de cualquier lenguaje de programación (por ejemplo, pickle / shelve en Python, o JSON / YAML para Perl et al, y así sucesivamente). Esto no aborda el acceso concurrente y las garantías ACID en absoluto.
Jim Dennis

Tienes razón. Lo que faltaba en mi entrada era la naturaleza implícita de solo lectura de dicho uso. En tal escenario me aferro a mi texto. Para el uso de lectura y escritura de Lua de esta manera no tiene absolutamente ningún sentido. Muchas cosas, los metadatos de un sistema de archivos son en su mayoría de solo lectura, por lo que este enfoque no significa un requisito completo de ro.
akauppi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.