Perché usare un database invece di salvare i dati sul disco?


193

Invece di un database, ho appena serializzato i miei dati su JSON, salvandoli e caricandoli su disco quando necessario. Tutta la gestione dei dati viene effettuata sul programma stesso, che è più veloce E più facile rispetto all'utilizzo di query SQL. Per questo motivo non ho mai capito perché i database siano assolutamente necessari.

Perché si dovrebbe usare un database invece di salvare semplicemente i dati su disco?


61
Se la gestione delle relazioni dei dati nell'applicazione è in realtà più rapida rispetto a quella in un database (che trovo estremamente difficile da credere), è necessario leggere su SQL e la normalizzazione del database. Quello che stai vivendo è probabilmente l'effetto collaterale di un database progettato in modo orribile.
yannis

68
Non è necessario un database nello scenario che stai descrivendo perché il tuo set di dati è banale. I database sono pensati per set di dati più complessi, se tutto ciò che fai è leggere e mostrare un elenco, il tuo approccio funziona.
yannis

16
Quali condizioni di gara potresti incontrare e sei pronto per questo? Vuoi ridimensionare un singolo server web? Qual è il piano di backup in caso di errore del server? È probabile che la tua risposta a tutte queste domande sia migliore se disponi di un database piuttosto che in caso contrario. Inoltre, se hai mai superato la gobba di imparare a usare i database, la mia ipotesi è che potresti trovare il tuo "più facile che usare le query SQL" dovrebbe essere modificato in "più facile che usare le query SQL se non capisci SQL".
btilly

37
Il database archivia comunque i dati su disco. È solo il risultato finale di una naturale evoluzione dei sistemi per l'archiviazione di dati strutturati su file. È probabile che se decidi di utilizzare i file per archiviare i dati strutturati, ti ritroverai a reinventare le funzionalità che sono già state sviluppate nei database. Quindi perché non usare un database dall'inizio?
Benedetto

13
A seconda dell'evoluzione del tuo progetto, potresti trovarti a dover affrontare cose come l'accesso simultaneo e i rollback. Sembrano banali, ma non lo sono. Quando avrai finito di risolverli, scoprirai di aver praticamente scritto un database. Vuoi davvero essere nel business del database o in un'altra attività?
jwernerny,

Risposte:


280
  1. È possibile eseguire query sui dati in un database (porre domande).
  2. È possibile cercare i dati da un database in modo relativamente rapido.
  3. È possibile mettere in relazione i dati di due diverse tabelle insieme utilizzando JOIN.
  4. È possibile creare report significativi dai dati in un database.
  5. I tuoi dati hanno una struttura integrata.
  6. Le informazioni di un determinato tipo vengono sempre memorizzate una sola volta.
  7. I database sono ACID .
  8. I database sono tolleranti agli errori.
  9. I database possono gestire set di dati molto grandi.
  10. I database sono simultanei; più utenti possono usarli contemporaneamente senza corrompere i dati.
  11. I database si ridimensionano bene.

In breve, beneficiate di una vasta gamma di tecnologie ben note e comprovate sviluppate nel corso di molti anni da un'ampia varietà di persone molto intelligenti.

Se sei preoccupato che un database sia eccessivo, controlla SQLite.


21
6. Normalizzazione, 7. Vedi link, 8. Leggi sulla tolleranza d'errore. Oh, e prima di essere risucchiato dalla mania di NoSQL, scopri i database SQL; conoscerli alle loro condizioni. Capirai. Se stai solo parlando di semplici dati di configurazione, JSON potrebbe essere tutto ciò di cui hai bisogno. Ma ci sono molti altri tipi di dati là fuori oltre alle impostazioni del programma.
Robert Harvey,

25
Per quanto non sia sicuro avere due programmi che modificano i dati contemporaneamente, beh, questo è in parte il motivo per cui esistono database. Se hai mai avuto questa necessità (e alcune o tutte le altre esigenze che ho menzionato), sarai molto contento di non dover reinventare tutto questo.
Robert Harvey,

23
@Dokkat Non è necessario, niente lo è. Se il tuo approccio funziona per te, sicuramente. Devo dire tuttavia che la maggior parte dei rdbms mezzo decenti supportano gli archivi basati sulla memoria, puoi caricare tutto ciò di cui hai bisogno in memoria quando la tua app si sveglia (come già fai) e interrogarli come faresti con un database tipico (mantenendo tutti i vantaggi menzionati da Robert ).
yannis

28
Per dirla in un altro modo, a volte hai bisogno di una tenda, ma a volte hai bisogno di una casa, e costruire una casa è un gioco con la palla completamente diverso rispetto al lancio di una tenda.
Robert Harvey,

49
@Dokkat quando le persone si riferiscono ad arresti anomali, significano cose come ... la tua CPU è esplosa a metà scrivendo il tuo file "database". Che succede ora? Molto probabilmente il tuo file è corrotto / illeggibile (almeno, potrebbe non essere più conforme al tuo formato) e devi ripristinare un backup (mentre la maggior parte dei DB "reali" perderebbe solo l'ultima transazione). Certo, puoi scrivere codice per farlo gestire. Quindi puoi scrivere il codice per tutte le altre cose. E poi ti rendi conto di aver trascorso 6 mesi a scrivere un DB, che avresti potuto usare dall'inizio, con pochissimo sforzo.
Daniel B

200

Mentre sono d'accordo con tutto ciò che Robert ha detto, non ti ha detto quando dovresti usare un database invece di salvare semplicemente i dati su disco.

Quindi prendi questo in aggiunta a ciò che Robert ha detto su scalabilità, affidabilità, tolleranza agli errori, ecc.

Per quando usare un RDBMS, ecco alcuni punti da considerare:

  • Hai dati relazionali, cioè hai un cliente che acquista i tuoi prodotti e quei prodotti hanno un fornitore e un produttore
  • Hai una grande quantità di dati e devi essere in grado di individuare rapidamente le informazioni pertinenti
  • È necessario iniziare a preoccuparsi dei problemi precedenti identificati: scalabilità, affidabilità, conformità ACID
  • È necessario utilizzare strumenti di reporting o intelligence per risolvere i problemi aziendali

Per quanto riguarda quando utilizzare un NoSQL

  • Hai molti dati che devono essere archiviati e che non sono strutturati
  • Scalabilità e velocità richieste
  • In genere non è necessario definire lo schema in anticipo, quindi se si hanno esigenze di modifica questo potrebbe essere un buon punto

Infine, quando utilizzare i file

  • Hai dati non strutturati in quantità ragionevoli che il file system può gestire
  • Non ti importa di struttura, relazioni
  • Non ti interessa la scalabilità o l'affidabilità (anche se questi possono essere fatti, a seconda del file system)
  • Non si desidera o non è possibile gestire l'overhead che verrà aggiunto da un database
  • Hai a che fare con dati binari strutturati che appartengono al file system, ad esempio: immagini, PDF, documenti, ecc.

14
+1, penso sia importante che tu abbia sottolineato che ci sono momenti in cui i file sono effettivamente adatti per la memorizzazione.
GrandmasterB

15
Si potrebbe aggiungere un altro esempio, alla propria terza lista: Quando i dati in realtà sono file, ad esempio immagini, documenti PDF e tale caricato. Può sembrare ovvio, ma ho visto casi in cui le immagini sono state archiviate in un BLOB di database senza una buona ragione.
Goran Jovic

5
Bene, non è mai stato fatto alcun riferimento esplicito al fatto che si tratta di un'app Web, ma l'ho dedotto dal commento JSON. Tuttavia, a volte qualcosa verrà utilizzato solo da poche persone e si può giustificare l'ambito dell'applicazione per non preoccuparsi di scalabilità e affidabilità. Con questo voglio dire, non preoccuparsi di cose come il clustering e la ridondanza.
Sam

8
@GoranJovic a volte ha senso. Archivia oltre 10.000 immagini in una directory e alcuni filesystem si fermeranno - un DB potrebbe essere più semplice di uno schema di partizione manuale di una sottodirectory.
Martin Beckett,

2
@MartinBeckett: quale filesystem dell'ultimo decennio lo fa?
Eamon Nerbonne,

55

Una cosa che nessuno sembra aver menzionato è l'indicizzazione dei record. Il tuo approccio al momento va bene, e presumo che tu abbia un set di dati molto piccolo e pochissime persone vi accedono.

Man mano che diventi più complesso, stai effettivamente creando un database. Qualunque cosa tu voglia chiamarlo, un database è solo un insieme di record memorizzati su disco. Sia che tu stia creando il file, o MySQL , SQLite o qualunque cosa stia creando i file, sono entrambi database.

Ciò che manca è la complessa funzionalità che è stata integrata nei sistemi di database per renderli più facili da usare.

La cosa principale che mi viene in mente è l'indicizzazione. OK, quindi puoi archiviare 10 o 20 o anche 100 o 1000 record in un array serializzato o una stringa JSON ed estrarlo dal tuo file e iterarlo relativamente rapidamente.

Ora, immagina di avere 10.000, 100.000 o persino 1.000.000 di record. Quando qualcuno tenta di accedere, dovrai aprire un file che è ora di diverse centinaia di megabyte, caricarlo nella memoria del tuo programma, estrarre un array di informazioni di dimensioni simili e quindi scorrere centinaia di migliaia di record solo per trova l'unico record a cui vuoi accedere.

Un database adeguato ti permetterà di impostare indici su determinati campi nei record, permettendoti di interrogare il database e ricevere una risposta molto rapidamente, anche con enormi set di dati. Combinalo con qualcosa come Memcached , o anche un sistema di memorizzazione nella cache di home brew (ad esempio, archivia i risultati di una ricerca in una tabella separata per 10 minuti e carica quei risultati nel caso in cui qualcun altro cerchi la stessa cosa subito dopo), e avrai query incredibilmente veloci, qualcosa che non otterrai con un set di dati così grande quando stai leggendo / scrivendo manualmente su file.

Un'altra cosa vagamente correlata all'indicizzazione è il trasferimento di informazioni. Come ho detto sopra, quando hai file di centinaia o migliaia di megabyte devi caricare tutte queste informazioni in memoria, iterarle manualmente (probabilmente sullo stesso thread) e quindi manipolare i tuoi dati.

Con un sistema di database verrà eseguito sul proprio thread (s), o anche sul proprio server. Tutto ciò che viene trasmesso tra il programma e il server di database è una query SQL e tutto ciò che viene ritrasmesso sono i dati a cui si desidera accedere. Non stai caricando l'intero set di dati in memoria, tutto ciò che invii e ricevi è una piccola frazione del tuo set di dati totale.


1
1. Non caricare mai tutte le informazioni dell'utente nel codice lato client! (Sono sicuro che fosse solo un esempio) 2. Il caricamento in primo luogo da un file di dimensioni pari a 100 MB di MB richiederà un po 'di tempo. 3. Il tuo esempio è corretto, tuttavia si presuppone che si cercherà sempre e solo per nome utente. Cosa succede se si desidera archiviare più dati su un utente? ad es. Età. Ora vuoi cercare tutti gli utenti di età compresa tra 20-30 anni. O ancora più semplice, trova un utente per indirizzo quando il tuo json è simile al seguente: {login: {pass: pass, add1: "123 sasd", città: "Wherever"}}.
Thomas Clayson,

2
Il tuo ultimo punto è potenzialmente corretto, ma poi potrei lavorare da vecchi dati - in particolare, se apro il programma, carico il database corrente, quindi dopo 5 minuti qualcun altro accede e modifica qualcosa, il mio database è ora una versione successiva fino a quando chiudere il programma e riavviarlo. Se poi modifico il mio database e lo salvo di nuovo, sovrascriverò tutte le modifiche apportate dall'altro utente. Quando hai il database di un utente questo potrebbe essere qualsiasi cosa, semplicemente cambiando la tua password. Se due utenti cambiano la loro password durante le altre sessioni, un utente avrà la modifica invertita.
Thomas Clayson,

4
Ho imparato molto dopo aver cercato alcune cose sull'indicizzazione. È stato davvero illuminante. I database ora hanno un po 'più senso. Ci sono ancora alcune cose che non capisco, ma questo è un grande progresso. Grazie per la risposta!
MaiaVictor

4
A proposito di indici, no, il database non indicizza tutto automaticamente. Solo poche cose vengono automaticamente indicizzate, mentre il resto richiede esplicito "si prega di indicizzare". E gli indici riducono la ricerca al tempo logaritmico, O (log (n)) che è leggermente più lento della costante.
Imperatore Orionii

1
Preoccuparsi della differenza tra un'implementazione basata su hash e b-tree è un'ottimizzazione prematura. Se i dati sono nell'indice, saranno ancora una dozzina di volte più veloci della lettura dal disco.
SilverbackNet,

14

Quando hai dati semplici, come un elenco di cose come descrivi nei commenti della tua domanda, un database SQL non ti darà molto. Molte persone li usano ancora, perché sanno che i loro dati possono diventare più complicati nel tempo e ci sono molte librerie che rendono banale lavorare con il database.

Ma anche con un semplice elenco che carichi, tieni in memoria, quindi scrivi quando necessario, può soffrire di una serie di problemi:

La chiusura anomala del programma può perdere dati o durante la scrittura dei dati su disco qualcosa va storto e si può finire per uccidere l'intero file. Puoi gestire i tuoi meccanismi per gestirlo, ma i database gestiscono questo per te usando tecniche comprovate.

Se i tuoi dati iniziano a crescere troppo e si aggiornano troppo spesso, la serializzazione di tutti i tuoi dati e il salvataggio diventeranno un grosso ostacolo per le risorse e rallenteranno tutto. Dovresti iniziare a capire come dividere le cose, quindi non sarà così costoso. I database sono ottimizzati per salvare solo le cose che cambiano su disco in modo tollerante agli errori. Inoltre sono progettati, in modo da poter caricare rapidamente i pezzetti di dati necessari in qualsiasi momento.

Inoltre, non è necessario utilizzare database SQL. Puoi usare i "database" NoSQL che molti fanno, basta usare JSON per archiviare i dati. Ma viene fatto in modo tollerante ai guasti e in un modo in cui i dati possono essere suddivisi, interrogati e suddivisi in modo intelligente tra più computer.

Inoltre, alcune persone mescolano le cose. Potrebbero utilizzare un archivio dati NoSQL come Redis per archiviare le informazioni di accesso. Quindi utilizzare database relazionali per archiviare dati più complessi dove devono fare query più interessanti.


12

Vedo molte risposte incentrate sul problema della concorrenza e dell'affidabilità. I database offrono altri vantaggi oltre a concorrenza, affidabilità e prestazioni. Consentono di non disturbare il modo in cui byte e caratteri sono rappresentati nella memoria. In altre parole, i database consentono al programmatore di concentrarsi su "cosa" piuttosto che su "come".

Una delle risposte menziona le domande. "Chiedere una domanda al database SQL" si adatta bene alla complessità di una domanda. Man mano che il codice si evolve durante lo sviluppo, semplici query come "recupera tutto" possono facilmente espandersi fino a "recuperare tutto dove proprietà1 è uguale a questo valore e quindi ordinare per proprietà2" senza preoccuparsi del programmatore di ottimizzare la struttura dei dati per tale query. Le prestazioni della maggior parte delle query possono essere accelerate creando un indice per una determinata proprietà.

Altro vantaggio sono le relazioni. Con le query è più semplice eseguire il riferimento incrociato di dati provenienti da set di dati diversi, quindi con loop nidificati. Ad esempio, la ricerca di tutti i post dei forum degli utenti con meno di 3 post in un sistema in cui utenti e post sono set di dati diversi (o tabelle DB o oggetti JSON) può essere eseguita con una singola query senza sacrificare la leggibilità.

Tutto sommato, i database SQL sono meglio degli array semplici se il volume dei dati può essere grande (diciamo più di 1000 oggetti), l'accesso ai dati in parti non banali e diverse parti dell'accesso al codice a diversi sottogruppi di dati.


Sono un po 'diffidente sull'idea che puoi semplicemente ignorare come sono rappresentate le cose. Mentre puoi ignorarlo, se lo fai, ed esp. se si scrive una query leggermente più complessa, è estremamente probabile che l'applicazione non possa più ridimensionare. "L'aggiunta di un indice" non è sempre possibile: hai a che fare con le scritture e semplicemente non aiuta molto con le query la cui complessità si estende su più tabelle. Quando sono necessari indici che implicano che hai perso il vantaggio della queryabilità interattiva poiché solo le query strutturate in modo specifico sono rispondibili in tempi ragionevoli.
Eamon Nerbonne,

12

TLDR

Sembra che tu abbia preso una decisione tecnica essenzialmente valida, a breve termine per l'archivio dati per la tua applicazione: hai scelto di scrivere uno strumento di gestione dell'archivio dati personalizzato.

Sei seduto su un continuum, con opzioni per spostarti in entrambe le direzioni.

A lungo termine, probabilmente (quasi, ma certamente non al 100%) vi troverete a trovarvi nei guai e potrebbe essere meglio passare all'utilizzo delle soluzioni di archivio dati esistenti. Esistono problemi prestazionali specifici, molto comuni, prevedibili, che sarai costretto a gestire e che stai meglio utilizzando gli strumenti esistenti invece di implementare i tuoi.


Sembra che tu abbia scritto un (piccolo) database personalizzato, integrato e utilizzato direttamente dalla tua applicazione. Suppongo che ti affidi a un sistema operativo e un file system per gestire la scrittura e la lettura del disco e trattare la combinazione come un archivio dati.

Quando fare quello che hai fatto

Sei seduto in un punto debole per l'archiviazione dei dati. Un archivio dati di sistemi operativi e file system è incredibilmente conveniente, accessibile e portatile multipiattaforma. La combinazione esiste da così tanto tempo che sei certo di essere supportato e far funzionare la tua applicazione su quasi tutte le configurazioni di distribuzione standard.

È anche una combinazione facile per cui scrivere codice: l' API è abbastanza semplice e di base e ci vogliono relativamente poche righe di codice per farlo funzionare.

In generale, è l'ideale per fare ciò che hai fatto quando:

  • Prototipazione di nuove idee
  • Creazione di applicazioni che è altamente improbabile che debbano essere ridimensionate, per quanto riguarda le prestazioni
  • Vincolato da circostanze insolite, come la mancanza di risorse per l'installazione di un database

alternative

Sei su un continuum di opzioni e ci sono due "direzioni" che puoi seguire da qui, quello che io penso come "giù" e "su":

Giù

Questa è l'opzione meno probabile da applicare, ma è qui per completezza:

Puoi, se vuoi, andare giù , cioè bypassare completamente il sistema operativo e il file system e davvero scrivere e leggere direttamente dal disco. Questa scelta è generalmente pertinente solo nei casi in cui è richiesta un'estrema efficienza: pensate, ad esempio, a un dispositivo lettore MP3 minimale / minuscolo , senza RAM sufficiente per un sistema operativo completamente funzionante o a qualcosa come la Wayback Machine , che richiede una massa incredibilmente efficiente operazioni di scrittura dei dati (la maggior parte degli archivi di dati scambia scritture più lente per letture più veloci, poiché questo è il caso di utilizzo più comune per quasi tutte le applicazioni).

Su

Esistono diverse sottocategorie qui, ma non sono esattamente esclusive. Alcuni strumenti si estendono su entrambi, fornendo alcune funzionalità in ciascuno, alcuni possono passare completamente dal lavorare in una modalità all'altra e alcuni possono essere sovrapposti l'uno sull'altro, fornendo funzionalità diverse a diverse parti dell'applicazione.

Archivi di dati più potenti

Potrebbe essere necessario archiviare volumi sempre più elevati di dati, pur facendo affidamento sulla propria applicazione per gestire la complessità della manipolazione dei dati. È disponibile una vasta gamma di negozi di valori-chiave, con diverse dimensioni di supporto per le funzioni correlate. Gli strumenti NoSQL rientrano in questa categoria, così come in altri.

Questo è l'ovvio percorso su cui scalare quando quanto segue descrive la tua applicazione:

  • È insolitamente pesante da leggere
  • Stai bene negoziando prestazioni più elevate per garanzie di coerenza inferiori (a breve termine) (molte offrono "eventuale coerenza").
  • Gestisce "direttamente" la maggior parte della manipolazione dei dati e la mancanza di coerenza (in pratica, probabilmente finirai per utilizzare inizialmente uno strumento di terze parti, anche se alla fine lo porterai nella tua applicazione o in un livello intermedio scritto personalizzato) .
  • Stai cercando di ridimensionare in modo massiccio la quantità di dati che stai memorizzando e / o la tua capacità di cercarli, con requisiti di manipolazione dei dati "relativamente semplici".

C'è un po 'di spazio qui: puoi forzare una migliore coerenza della lettura, per letture più lente. Vari strumenti e opzioni forniscono API di manipolazione dei dati, indicizzazione e altre opzioni, che possono essere più o meno adatte per scrivere facilmente l'applicazione specifica. Quindi, se i punti sopra descritti descrivono quasi completamente la tua applicazione, potresti essere "abbastanza vicino" per lavorare con una soluzione di archiviazione dati più potente.

Esempi noti: CouchDB , MongoDB , Redis , soluzioni di archiviazione cloud come Microsoft Azure , Google App Data Store e Amazon ECE.

Motori di manipolazione dei dati più complessi

La famiglia di applicazioni di archiviazione dei dati "SQL", così come una serie di altre, sono meglio descritte come strumenti di manipolazione dei dati, piuttosto che motori di archiviazione puri. Forniscono una vasta gamma di funzionalità aggiuntive, oltre alla memorizzazione dei dati e spesso al di là di ciò che è disponibile nel lato archivio valori chiave delle cose. Ti consigliamo di seguire questo percorso quando:

  • Devi assolutamente leggere la coerenza, anche se ciò significa che subirai un colpo di performance.
  • Stai cercando di eseguire in modo efficiente manipolazioni di dati molto complessi - pensa a operazioni JOIN e UPDATE molto complesse, cubi di dati e slicing, ecc ...
  • Stai bene scambiando la rigidità per le prestazioni (pensa a formati di archiviazione dati forzati e fissi, come le tabelle, che non possono essere modificati facilmente e / o in modo efficiente).
  • Hai le risorse per gestire un insieme di strumenti e interfacce spesso più complessi.

Questo è il modo più "tradizionale" di pensare a un database o un archivio dati, ed è in circolazione da molto più tempo - quindi qui c'è molto che è disponibile e spesso c'è molta complessità da affrontare. È possibile, anche se richiede un po 'di esperienza e conoscenza e crea soluzioni semplici / evita gran parte della complessità - molto probabilmente finirai per utilizzare strumenti e librerie di terze parti per gestirne la maggior parte, però.

Esempi ben noti sono MySQL , SQL Server , Oracle's Database e DB2 .

Esternalizzare il lavoro

Esistono diversi e moderni strumenti e librerie di terze parti, che si interpongono tra gli strumenti di archiviazione dei dati e l'applicazione, per aiutarti a gestire la complessità.

Tentano inizialmente di eliminare la maggior parte o tutto il lavoro di gestione e manipolazione degli archivi di dati e, idealmente, consentono di effettuare una transizione graduale alla complessità solo quando e se necessario. Questa è un'area attiva di imprenditoria e ricerca, con alcuni risultati recenti che sono immediatamente accessibili e utilizzabili.

Esempi ben noti sono gli strumenti MVC ( Django , Yii ), Ruby on Rails e Datomic . È difficile essere onesti qui perché ci sono letteralmente dozzine di strumenti e librerie che fungono da involucri attorno alle API di vari archivi di dati.


PS: se preferisci i video al testo, potresti voler guardare alcuni dei video relativi al database di Rich Hickey; fa un buon lavoro nel chiarire la maggior parte del pensiero che va nella scelta, nella progettazione e nell'uso di un archivio dati.


11

Un file system si adatta alla descrizione di un database NoSQL, quindi direi che dovresti assolutamente considerare di usarlo quando decidi come archiviare i tuoi dati e non semplicemente scartarli a favore di RDBMS, come alcune risposte sembrano suggerire qui.

Un problema con i file system (e NoSQL in generale) è la gestione delle relazioni tra i dati. Se questo non è un grosso blocco qui, direi per ora saltare l'RDBMS. Ricorda anche i lati positivi dell'utilizzo di un file system come memoria:

  • Amministrazione zero
  • Bassa complessità, facile da configurare
  • Funziona con qualsiasi sistema operativo, lingua, piattaforma, librerie ecc
  • L'unica impostazione di configurazione è la directory
  • Triviale da testare
  • Triviale da esaminare con strumenti esistenti, backup, modifica ecc
  • Buone caratteristiche prestazionali e ottimizzate dal sistema operativo
  • Facile da capire per qualsiasi sviluppatore
  • Nessuna dipendenza, nessun driver aggiuntivo
  • Il modello di sicurezza è banale da capire ed è una parte base del sistema operativo
  • I dati non sono accessibili dall'esterno

( fonte )


10

I file system sono un tipo di database. Forse non un RDBMS come tutti gli altri stanno parlando, ma sicuramente un DB nel senso più stretto. Fornisci le chiavi (nome del file) per cercare i dati (contenuto del file), che ha una memoria astratta e un'API con cui comunica il tuo programma.

Quindi, stai utilizzando un database. Gli altri post possono discutere delle virtù di diversi tipi di database ...


1
il database e l'archiviazione non possono essere realmente utilizzati in modo intercambiabile. Un database è un tipo di archiviazione, ma un file system non è certamente un tipo di database
Gaz_Edge

3
"storage" è dove vengono conservati bit e byte. Un database non utilizza necessariamente file su un file system. Un file system è sicuramente un tipo di database nel senso più stretto del termine.
Chris S,

6
Per qualcuno che sta sostenendo che non è utile nei database quando sono alternativi è usare un database ; sì. Sembra utile spiegare loro che il loro argomento si basa su una nozione preconcetta che è sbagliata. Una volta che avranno una migliore comprensione della loro situazione iniziale, possiamo aiutarli ad andare avanti con una comprensione più completa delle tecnologie disponibili. I file system sono database gerarchici, ci sono buone ragioni per cui i sistemi di database di relazioni e oggetti li hanno soppiantati come archiviazione / recupero dei dati più veloci, meglio organizzati e più efficienti.
Chris S,

2
@Gaz_Edge I dati sono già in una sorta di "database" inefficiente perché sono archiviati in un mucchio di file la cui struttura e contenuto sono entrambi gestiti dall'applicazione del PO. Cercando di ottenere il PO di comprendere e accettare che è un utile primo passo per ottenere loro di comprendere il caso d'uso di un sistema di database "reale"; una volta compreso che sta succedendo un "database" di qualche tipo, è più facile iniziare a parlare di dove un servizio adeguatamente strutturato e gestito è più efficiente che lasciare che l'app faccia il proprio. Suggerirei che questa risposta sia di grande aiuto.
Rob Moir,

8

È necessario un database se si dispone di più processi (utenti / server) che modificano i dati. Quindi il database serve per impedire loro di sovrascrivere a vicenda le modifiche.

È inoltre necessario un database quando i dati sono più grandi della memoria. Oggi con la memoria che abbiamo a disposizione, ciò rende davvero obsoleto l'uso dei database in molte applicazioni.

Il tuo approccio è decisamente migliore dell'assurdità dei "database in memoria". Quali sono essenzialmente i tuoi approcci, ma con un sacco di spese generali aggiunte.


Ad essere sincero, adoro questa risposta e vorrei che fosse vera, ma non sono sicuro che sia così. Ad esempio, alcuni utenti (e te) hanno espresso preoccupazione per la memoria. Ovviamente, se sto memorizzando dati di GB, non posso tenerli tutti in memoria. Ma cosa succede se sono sicuro che i dati non sarebbero mai così grandi, dovrei usare solo la memoria? Bene, ci sono anche altre cose. Ad esempio, ho imparato a conoscere le viste incrementali di CouchDB. Questo è certamente qualcosa che, diversamente dall'indicizzazione, NON sarebbe banale da implementare, ed è certamente un enorme aumento di velocità quando si utilizza un modello di visualizzazione,
MaiaVictor

che immagino di essere. Ad esempio, quando trasformo i dati da "elenco giocatori" a "classifica", questa non è altro che una mappa per ridurre l'operazione. Quando crei un gioco o un sito interattivo, praticamente tutto ciò che presenti è un'operazione mapReduce dai tuoi dati principali! Quindi avere quel tipo di ottimizzazione potrebbe essere davvero desiderabile. Bene, non ho idea se qualcosa di cui sto parlando procede, ma ha senso. Imparare molto oggi e mi piacciono molto i concetti NoSQL. Grazie per la risposta (:
MaiaVictor

7

Dovresti sempre chiederti se una particolare applicazione necessita di un RDBMS. Troppe applicazioni sono costruite con un processo di progettazione che presuppone automaticamente tutti gli strumenti e i framework richiesti all'inizio. I database relazionali sono così comuni e molti sviluppatori hanno lavorato su applicazioni simili come prima, che vengono automaticamente inclusi prima dell'inizio del progetto. Molti progetti possono cavarsela, quindi non giudicare troppo duramente.

Hai iniziato il tuo progetto senza uno e funziona. È stato più facile per te farlo funzionare senza aspettare fino a quando non hai SQL. Non c'è niente di sbagliato in questo.

Man mano che questo progetto si espande e i requisiti diventano più complicati, alcune cose diventeranno difficili da costruire. Fino a quando non effettui ricerche e test su metodi alternativi, come fai a sapere qual è la migliore? Puoi chiedere ai programmatori ed eliminare le fiamme e "dipende" per rispondere a questa domanda. Una volta appreso, puoi considerare quante righe di codice sei disposto a scrivere nella tua lingua per gestire alcuni dei vantaggi di un database. Ad un certo punto, stai reinventando la ruota.

Facile è spesso relativo. Esistono alcuni framework in grado di creare una pagina Web e collegare un modulo a una tabella di database senza richiedere all'utente di scrivere alcun codice. Immagino che se si lotta con il mouse, questo potrebbe essere un problema. Tutti lo sanno, questo non è scalabile o flessibile perché Dio vieta di aver strettamente accoppiato tutto alla GUI. Un non programmatore ha appena costruito un prototipo; molti YAGNI possono essere trovati qui.

Se preferisci imparare un ORM manipolato dalla tua lingua preferita invece di apprendere l'SQL, provalo, ma prova a installare, crea una tabella ed estrai alcuni dati da un database popolare con SQL (Seleziona * Da; non è roba da capogiro). È facile da fare. Ecco perché qualcuno li ha creati in primo luogo. Non sembra un investimento così grande per prendere una decisione informata. Probabilmente potresti anche fare un test delle prestazioni.


Solo per notare, ho usato mysql per anni quando ho ospitato un "otserv". Indovina un po? Tutto ciò ha comportato problemi. Le persone potevano "clonare" gli oggetti usando un trucco sporco dopo aver realizzato che i loro personaggi erano stati salvati quando si sono disconnessi ma non quando il server si è bloccato. Questo è un problema serio per otservs. E la comunità otserv è ENORME. Ciò non accadrebbe se avessero semplicemente archiviato i dati in memoria e li serializzassero periodicamente. Così ho modificato il sorgente da solo, quei lunghi file C ++ e ho iniziato a salvare periodicamente su mysql, anziché quando i personaggi si sono disconnessi. Indovina un po? È stato LENTO!
MaiaVictor

Mysql semplicemente non poteva gestire lo stato di salvataggio completo ogni 2 minuti circa. Era abbastanza chiaro quando è avvenuto il salvataggio: l'intero server è "in ritardo" per un secondo. Ora apprezzerei molto se le persone che pubblicano qui avessero una risposta per quella!
MaiaVictor

1
Non giudicare i RDBMS da quello che è successo con una singola applicazione che è stata probabilmente codificata male. Soprattutto quando le modifiche a supporto di un database sono state apportate da qualcuno senza esperienza nel database.
alroc,

1
@Dokkat, spero che nessuno stacchi il cavo di alimentazione tra il deposito di fondi sul tuo conto bancario e la "periodica" scrittura del saldo del conto sul disco. Hai descritto un'architettura di perdita di dati garantita. Questo va bene per alcune applicazioni, ma la maggior parte delle applicazioni di database offre agli utenti il ​​potere di scegliere. È possibile eseguire un singolo nodo del database con backup e rischiare una perdita di dati o utilizzare la replica per eliminare la perdita di dati in caso di errore di un singolo nodo.
mikerobi,

@Dokkat in modo da non utilizzare MySql o qualsiasi altro DB stile server "full optional". Usi Sqlite (o simile) e persisterà sul disco ogni volta, dandoti un DB incorporato nella tua app (quindi non è necessaria un'installazione separata) e ti darà comunque accesso sql, integrità transazionale e persistenza del disco.
gbjbaanb,

6

Il salvataggio dei dati su disco IS sta scrivendo su un database, soprattutto se si inserisce ciascun oggetto nel proprio file con il nome del file come chiave per il record. E per ridurre al minimo i tempi di ricerca per la lettura del file, creare sottodirectory basate sui primi caratteri della chiave.

Ad esempio key = ghostwriter andrebbe in g / ho / stwriter.json o g / h / o / stwriter.json o g / ho / ghostwriter.json o g / h / o / ghostwriter.json. Scegli il tuo schema di denominazione in base alla distribuzione delle tue chiavi. Se sono numeri di sequenza, il 5/4/3 / 12345.json è migliore del contrario.

Questo è un database e se fa tutto ciò di cui hai bisogno, fallo in quel modo. Oggi sarebbe chiamato un database NoSQL come GDBM o Berkeley db. Così tante scelte Per prima cosa scopri di cosa hai bisogno, quindi crea una libreria di interfaccia per gestire i dettagli, magari un'interfaccia get / set come memcached o un'interfaccia CRUD, e poi sarai in grado di scambiare le librerie se devi cambiare il formato del database per uno con caratteristiche diverse.

Nota che alcuni database SQL come PostgreSQL e Apache Derby DB ti permetteranno di eseguire query SQL su molti formati NoSQL, inclusi i tuoi database nostrani. Non sono sicuro di MyBatis ma potrebbe essere simile.

Evitare l'hype NoSQL. Leggi le caratteristiche, testa le prestazioni e le capacità e poi scegli in base al grado di adattamento alle esigenze della tua applicazione.

http://www.hdfgroup.org/HDF5/ è ancora un altro formato di archivio dati interessante e ampiamente usato che le persone spesso non considerano.


4

Non appena i dati vengono aggiornati contemporaneamente, l'approccio che utilizza un database (potrebbe essere un database in memoria) sarà probabilmente più corretto e più performante, mentre allo stesso tempo il tuo codice rimarrà facile, perché semplicemente non hai preoccuparsi di aggiornamenti, transazioni, cache, I / O asincroni simultanei e tutto il resto.


Le modifiche simultanee all'interno di un processo saranno più efficienti usando i blocchi in-process piuttosto che IPC su un demone del database che acquisisce un sacco di blocchi. Ma stai presumibilmente parlando di più processi che modificano i dati.
dhasenan,

@dhasenan - Questo è un altro vantaggio di buoni sistemi di database. Ottieni la concorrenza e funziona in tutti i casi: multi-thread, multi-processo, più client su server diversi o qualsiasi combinazione di questi. Il tuo benché multi-thread programma potrebbe essere "più efficiente" in alcuni casi, ma semplicemente non si ridimensionerà.
Ingo,

-5

È necessario un database per archiviare / recuperare i QA come quelli che pubblichiamo qui! Un semplice file non è in grado di organizzare i dati relativi a diversi argomenti.


3
No, gli "argomenti" potrebbero essere cartelle e i "post" sul sito potrebbero essere file. È sicuramente possibile eseguire un sito come questo da un filesystem. Non è efficiente: sviluppo lento e complicato, esecuzione di query, inserimento di nuovi dati, ecc.
Chris S

lento + complicato = impossibile?
joe

Lento e complicato da costruire! = Lento e complicato da funzionare
joe

1
@joe, non è proprio vero che un file (forse non un file "semplice", ma cosa significa?) non può essere utilizzato per organizzare i dati relativi a diversi argomenti. Potresti usare JSON, come suggerisce Dokkat, o XML, o file a record misti come facevamo prima nei giorni pre-XML, o qualunque formato di file tu possa immaginare. Non consiglierei nessuno di questi approcci per la maggior parte degli scenari, ma ciò non significa che non possano essere fatti.
John M Gant,

@John M Gant: totalmente d'accordo con te, i database non possono sostituire singoli file (poiché non ti piacciono i semplici) e viceversa, per l'unica ragione che un'auto non può sostituire una bicicletta. parlo 3 lingue "umane", e la mia scelta di parole e vocabolario è il motivo per cui sono stato frainteso ... credo
joe
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.