Buoni motivi per NON utilizzare un database relazionale?


139

Puoi indicare strumenti di archiviazione dei dati alternativi e fornire buone ragioni per usarli al posto di vecchi database relazionali? A mio avviso, la maggior parte delle applicazioni usa raramente tutta la potenza di SQL: sarebbe interessante vedere come creare un'applicazione senza SQL.

Risposte:


148

File di testo normale in un filesystem

  • Molto semplice da creare e modificare
  • Facile da manipolare per gli utenti con strumenti semplici (ad es. Editor di testo, grep, ecc.)
  • Archiviazione efficiente di documenti binari

File XML o JSON su disco

  • Come sopra, ma con un po 'più di capacità di validare la struttura.

Foglio di calcolo / file CSV

  • Modello molto semplice da comprendere per gli utenti aziendali

Subversion (o sistema di controllo della versione basato su disco simile)

  • Ottimo supporto per il versioning dei dati

Berkeley DB (Fondamentalmente, una tabella hash basata su disco)

  • Concettualmente molto semplice (solo chiave / valore non digitato)
  • Abbastanza veloce
  • Nessun sovraccarico amministrativo
  • Supporta transazioni credo

DB semplice di Amazon

  • Proprio come Berkeley DB, credo, ma ospitato

Datastore di Google App Engine

  • Ospitato e altamente scalabile
  • Memorizzazione dei valori-chiave per documento (ovvero modello di dati flessibile)

CouchDB

  • Focus sul documento
  • Semplice memorizzazione di dati semi-strutturati / basati su documenti

Collezioni di lingue native (archiviate in memoria o serializzate su disco)

  • Integrazione linguistica molto stretta

Motore di archiviazione personalizzato (scritto a mano)

  • Prestazioni potenzialmente molto elevate nei casi di utilizzo richiesti

Non posso dire di conoscere qualcosa di più su di loro, ma come si potrebbe anche guardare in sistemi di database oggetto .


10
Sarebbe bello se tu spiegassi anche gli svantaggi di ogni scelta, altrimenti come si dovrebbe scegliere? Grazie,
Sklivvz,

4
Anche scrivere milioni di righe in un DB può richiedere un giorno, mentre aggiungere un milione di righe di log a un file richiede solo pochi minuti. Non capirò mai perché le persone insistono nel mettere i dati di registro in un database.
Aaron Digulla,

33
Aaron: Ho un motivo: SELEZIONA i messaggi DAL registro DOVE (data TRA 2009-01-01 E 2009-03-01) E type = 'errore' AND system = 'windows' :) Come lo caricheresti da un file di testo ?
Tomáš Fejfar,

1
Sono fortemente a favore dei file di testo quando possibile. Non puoi sempre usarli ma quando puoi sono molto più facili da diagnosticare.
Loren Pechtel

berkeley db ha sicuramente delle transazioni. i file di testo e i file xml / json no, quindi le app multithreading possono calpestarli se non stai attento. I file CSV sono meravigliosi per le raccolte di parametri perché gli utenti aziendali possono semplicemente guardarli e modificarli senza strumenti aggiuntivi. I file di testo sono perfetti per le applicazioni write-once / read-quasi-never come la registrazione. Per scegliere un approccio devi capire cosa stai cercando di realizzare
O. Jones,

26

La risposta di Matt Sheppard è ottima (mod up), ma terrò conto di questi fattori quando penso a un fuso:

  1. Struttura: si rompe ovviamente in pezzi o stai facendo dei compromessi?
  2. Utilizzo: come verranno analizzati / recuperati / grokked i dati?
  3. Durata: quanto tempo sono utili i dati?
  4. Dimensione: quanti dati ci sono?

Un vantaggio particolare dei file CSV su RDBMS è che possono essere facili da condensare e spostarsi praticamente su qualsiasi altra macchina. Effettuiamo trasferimenti di dati di grandi dimensioni e tutto è abbastanza semplice, utilizziamo solo un grande file CSV e facile da eseguire script utilizzando strumenti come rsync. Per ridurre la ripetizione su file CSV di grandi dimensioni, è possibile utilizzare qualcosa come YAML . Non sono sicuro che memorizzerei qualcosa come JSON o XML, a meno che tu non abbia requisiti di relazione significativi.

Per quanto riguarda le alternative non menzionate, non scartare Hadoop , che è un'implementazione open source di MapReduce. Questo dovrebbe funzionare bene se hai una tonnellata di dati vagamente strutturati che devono essere analizzati e vuoi essere in uno scenario in cui puoi semplicemente aggiungere altre 10 macchine per gestire l'elaborazione dei dati.

Ad esempio, ho iniziato a provare ad analizzare prestazioni che erano essenzialmente tutti i numeri di temporizzazione di diverse funzioni registrate su circa 20 macchine. Dopo aver provato a inserire tutto in un RDBMS, mi sono reso conto che non ho davvero bisogno di interrogare nuovamente i dati dopo averli aggregati. E per me è utile solo nel suo formato aggregato. Quindi, tengo i file di registro in giro, compressi e quindi lascio i dati aggregati in un DB.

Nota che sono più abituato a pensare con dimensioni "grandi".


5
Un pericolo per i file CSV è che la fuga deve essere eseguita correttamente; è 'facile da implementare un lettore o scrittore CSV che non segue davvero le specifiche poiché sembra così ingannevolmente semplice e ci sono alcune sottigliezze: en.wikipedia.org/wiki/Comma-separated_values#Specification
Jared Updike

10

Prety del filesystem utile per la memorizzazione di dati binari, che non funziona mai incredibilmente bene nei database relazionali.



6

Se non è necessario ACID , probabilmente non è necessario l'overhead di un RDBMS. Quindi, determinare se ne hai bisogno prima. La maggior parte delle risposte non RDBMS fornite qui non fornisce ACID.


1
Puoi fare un esempio del perché / quando ACID non è necessario?
Ivan Voroshilin,

1
@vibneiro, se il database ha un solo utente che esegue solo operazioni sequenziali o il rischio di incoerenze del database in caso di interruzione di corrente è accettabile o il concetto di transazioni di database non si applica o non sono necessari vincoli, cascate, trigger o simili, quindi può essere sufficiente un provider non ACID non RDBMS (ad esempio un file di testo con un'API simile a RDBMS). Ad esempio, l'applicazione potrebbe conservare un database di messaggi diagnostici storici per i quali ACID è completamente irrilevante e "log.txt" sarà sufficiente.
bzlm,

Si scopre che ACID non è necessario in casi molto rari. Mi chiedo perché allora i database NoSQL siano così popolari? La maggior parte di essi non supporta la piena ACIDITÀ.
Ivan Voroshilin,

@vibneiro, NoSQL è di solito più facile, più leggero, più integrabile, più auto-hostable, più intuitivo, più flessibile e di solito con qualche ACID. Se non si dispone di dati relazionali, probabilmente un RDBMS non è quello che serve.
bzlm,

6

Motore di archiviazione personalizzato (scritto a mano) / Prestazioni potenzialmente molto elevate nei casi di utilizzo richiesti

http://www.hdfgroup.org/

Se disponi di enormi set di dati, anziché crearne uno tuo, potresti utilizzare HDF, il formato di dati gerarchico.

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

HDF supporta diversi modelli di dati, tra cui array multidimensionali, immagini raster e tabelle.

È anche gerarchico come un file system, ma i dati sono memorizzati in un file binario magico.

HDF5 è una suite che rende possibile la gestione di raccolte dati estremamente grandi e complesse.

Pensa ai petabyte di dati di telerilevamento della NASA / JPL.


4

Buongiorno,

Un caso a cui riesco a pensare è quando i dati che stai modellando non possono essere facilmente rappresentati in un database relazionale.

Una volta tale esempio è il database utilizzato dagli operatori di telefonia mobile per monitorare e controllare le stazioni base per le reti di telefonia mobile.

In quasi tutti questi casi, viene utilizzato un DB OO , un prodotto commerciale o un sistema a rotazione automatica che consente l'erarchia di oggetti.

Ho lavorato su un'applicazione di monitoraggio 3G per una grande azienda che rimarrà senza nome, ma il cui logo è una macchia di vino rosso (-: e hanno usato un tale OO DB per tenere traccia di tutti i vari attributi per le singole celle all'interno del Rete.

L'interrogazione di tali DB viene eseguita utilizzando tecniche proprietarie che, di solito, sono completamente prive di SQL.

HTH.

Saluti,

rapinare


4
Perché i dati sulla base non si prestano bene al modello relazionale?
kaybenleroll,

3

I database di oggetti non sono database relazionali. Possono essere davvero utili se si desidera semplicemente inserire alcuni oggetti in un database. Supportano inoltre il controllo delle versioni e la modifica delle classi per gli oggetti già esistenti nel database. db4o è il primo che viene in mente.


3

In alcuni casi (ad esempio dati sui mercati finanziari e controllo dei processi) potrebbe essere necessario utilizzare un database in tempo reale anziché un RDBMS. Vedi link wiki


3

C'era uno strumento RAD chiamato JADE scritto alcuni anni fa che ha un OODBMS integrato. Anche le precedenti incarnazioni del motore DB supportavano Digitalk Smalltalk. Se si desidera campionare la creazione di applicazioni utilizzando un paradigma non RDBMS, questo potrebbe essere un inizio.

Altri prodotti OODBMS includono Objectivity , GemStone (è necessario ottenere VisualWorks Smalltalk per eseguire la versione Smalltalk ma esiste anche una versione java). Ci sono stati anche alcuni progetti di ricerca open source in questo spazio: EXODUS e il suo discendente SHORE vengono in mente.

Purtroppo, il concetto sembrava morire, probabilmente a causa della mancanza di uno standard chiaramente visibile e di una capacità di query ad hoc relativamente scarsa rispetto ai sistemi RDMBS basati su SQL.

Un OODBMS è più adatto per le applicazioni con strutture di dati di base che sono meglio rappresentate come un grafico di nodi interconnessi. Dicevo che l'applicazione OODBMS per antonomasia era un Dungeon multiutente (MUD) in cui le stanze contenevano gli avatar dei giocatori e altri oggetti.


2
Era vero che era necessario un client Smalltalk per utilizzare GemStone / S (per le app desktop) ma con i framework Web Aida ( aidaweb.si ) e Seaside ( seaside.st ) GemStone / S può essere utilizzato direttamente come applicazione server. Vedi le informazioni su GLASS ( seaside.gemstone.com )
Dale Henrichs

Un altro motivo sarebbe se ti interessa la qualità dei dati. In un OODB come la pietra preziosa è molto più semplice applicare regole di validità complesse.
Stephan Eggermont,

Le funzionalità di query ad hoc di OODBMS sono molto migliori di quelle degli RDBMS basati su SQL
Stephan Eggermont,

1

Puoi fare molto, semplicemente usando i file memorizzati nel file system. Gli RDBMS stanno migliorando nella gestione dei BLOB, ma questo può essere un modo naturale per gestire i dati di immagine e simili, in particolare se le query sono semplici (elencando e selezionando singoli elementi).

Altre cose che non si adattano molto bene in un RDBMS sono le strutture di dati gerarchiche e suppongo che i dati geospaziali e i modelli 3D non siano così facili da lavorare con entrambi.

Servizi come Amazon S3 forniscono modelli di archiviazione più semplici (chiave-> valore) che non supportano SQL. La scalabilità è la chiave lì.

Anche i file Excel possono essere utili, in particolare se gli utenti devono essere in grado di manipolare i dati in un ambiente familiare e creare un'applicazione completa per farlo non è fattibile.


1

Esistono molti modi per archiviare i dati - anche "database relazionale" copre una gamma di alternative da una semplice libreria di codice che manipola un file locale (o file) come se fosse un database relazionale su un singolo utente, attraverso sistemi basati su file che possono gestire più utenti per una generosa selezione di seri sistemi basati su "server".

Usiamo molto i file XML: ottieni dati ben strutturati, strumenti utili per interrogare la stessa capacità di apportare modifiche, se del caso, qualcosa che è leggibile dall'uomo e non devi quindi preoccuparti del funzionamento del motore db (o del funzionamento del motore db). Questo funziona bene per cose che sono essenzialmente di sola lettura (nel nostro caso il più delle volte generate da un db altrove) e anche per sistemi a utente singolo in cui è possibile caricare e salvare i dati secondo necessità - ma si stanno creando opportunità per problemi se si desidera la modifica multiutente - almeno di un singolo file.

Per noi questo è tutto: o useremo qualcosa che farà SQL (MS offre un set di strumenti che vanno da un .DLL per fare cose da singolo utente fino al server aziendale e parlano tutti lo stesso SQL (con limitazioni all'estremità inferiore)) o useremo XML come formato perché (per noi) la verbosità è raramente un problema.

Al momento non è necessario manipolare i dati binari nelle nostre app in modo che non sorgano domande.

Murph


1

Si potrebbe voler considerare l'uso di un server LDAP al posto di un database SQL tradizionale se i dati dell'applicazione sono fortemente orientati al valore / chiave e di natura gerarchica.


1

I file BTree sono spesso molto più veloci dei database relazionali. SQLite contiene al suo interno una libreria BTree che è di dominio pubblico (come in "pubblico dominio", senza usare il termine in senso lato).

Francamente, se volessi un sistema multiutente, avrei bisogno di molte convinzioni per non usare un database relazionale di server decente.


I BTree sono l'implementazione di base degli indici normali. Oracle supporta tabelle organizzate per indice che sono solo una tabella implementata come indice. Sono più veloci da leggere, più lenti da scrivere e utilizzare un albero a B. Vedi: < oracle.com/technology/products/oracle9i/datasheets/iots/… >
borjab

1

Database full-text, che possono essere interrogati con operatori di prossimità come "entro 10 parole da", ecc.

I database relazionali sono uno strumento di business ideale per molti scopi: abbastanza facili da capire e progettare, abbastanza veloci, adeguati anche quando non sono progettati e ottimizzati da un genio che potrebbe "sfruttare tutta la potenza", ecc.

Ma alcuni scopi aziendali richiedono l'indicizzazione full-text, che i motori relazionali non forniscono o considerano come ripensamento. In particolare, i campi legali e medici hanno ampie strisce di testo non strutturato da archiviare e guadare.


1

Inoltre: * Scenari incorporati: dove di solito è necessario utilizzare qualcosa di più piccolo di un RDBMS completo. Db4o è un ODB che può essere facilmente utilizzato in tal caso. * Sviluppo rapido o proof-of-concept - in cui si desidera concentrarsi sul business e non preoccuparsi del livello di persistenza


1

Il teorema di CAP lo spiega in modo succinto. SQL fornisce principalmente "Solida coerenza: tutti i client vedono la stessa vista, anche in presenza di aggiornamenti".


1

KISS: Keep It Small and Simple


1
Questa è la versione educata ... Ho sentito più spesso "Keep it simple, stupid" ... o, sorso, forse è proprio quello che la gente mi dice! :-(
GreenMatt,

1

Vorrei offrire RDBMS :) Se non vuoi avere problemi con la configurazione / amministrazione vai su SQLite. RDBMS integrato con supporto SQL completo. Ti consente persino di archiviare qualsiasi tipo di dati in qualsiasi colonna.

Vantaggio principale rispetto ad esempio al file di registro: se ne hai uno enorme, come hai intenzione di cercarlo? Con il motore SQL è sufficiente creare indice e velocizzare notevolmente le operazioni.

Informazioni sulla ricerca full-text: SQLite dispone anche di moduli per la ricerca full-text.

Goditi semplicemente una bella interfaccia standard per i tuoi dati :)


0

Un buon motivo per non utilizzare un database relazionale sarebbe quando si dispone di un enorme set di dati e si desidera eseguire un'elaborazione massicciamente parallela e distribuita sui dati. L'indice Web di Google sarebbe un perfetto esempio di un caso del genere.

Hadoop ha anche un'implementazione del file system di Google chiamato Hadoop Distributed File System .


0

Consiglio vivamente Lua come alternativa al tipo di archiviazione dei dati di tipo SQLite.

Perché:

  • La lingua è stata progettata come lingua di descrizione dei dati per cominciare
  • La sintassi è leggibile dall'uomo (XML non lo è )
  • È possibile compilare blocchi Lua in binari, per prestazioni aggiuntive

Questa è l'opzione "raccolta della lingua madre" della risposta accettata. Se stai usando C / C ++ come livello di applicazione, è perfettamente ragionevole inserire il motore Lua (100kB di binario) solo per leggere config / dati o scriverli.


Lua è un linguaggio di programmazione. Questo suggerimento potrebbe essere generalizzato per suggerire eventuali caratteristiche di persistenza / serializzazione di qualsiasi linguaggio di programmazione (ad esempio pickle / shelve in Python o JSON / YAML per Perl et al, e così via). Questo non riguarda affatto l'accesso simultaneo e le garanzie ACID.
Jim Dennis,

Hai ragione. Ciò che mancava nella mia iscrizione era la natura implicita di sola lettura di tale utilizzo. In tale scenario tengo al mio testo. Per l'uso in lettura e scrittura di Lua in questo modo non ha assolutamente senso. Molte cose, i metadati del filesystem sono per lo più di sola lettura, quindi un tale approccio non significa requisiti di ro completi.
akauppi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.