Quando si dovrebbe preferire l'uso del database rispetto all'analisi dei dati da un file di testo?


13

Stavo realizzando un programma Python per misurare la crescita di codereview.SE . Il mio approccio era quello di ottenere le "Statistiche del sito" mostrate in prima pagina e memorizzarle sul mio disco rigido. Ho intenzione di farlo una volta al giorno. Finora ho fatto abbastanza per ottenere le statistiche e aggiungerle a un file di testo. Lo script python può essere visualizzato su github . Il formato che sto usando è il seguente

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

Ho appena eseguito lo script due volte per ottenere il formato che avrei usato nel file. Inizialmente questo mi è sembrato buono perché lo avrei archiviato da solo e il formato sarebbe lo stesso, quindi sarebbe facilmente analizzabile, ma non ne sono sicuro. Sembra che l'uso di un database dovrebbe essere migliore qui perché in questo modo il recupero dei dati dovrebbe essere più semplice. Solo una nota, non ho mai usato alcun database e non ho alcuna conoscenza di SQL, MySQL o altre varianti di RDBMS.

Quindi questo mi porta alla domanda. Quando si dovrebbe preferire un database per l'archiviazione dei dati rispetto all'archiviazione dei dati in un file di testo? Ci sono alcuni suggerimenti che posso cercare quando prendo decisioni sull'opportunità di un database o di semplici file di testo?

PS: se è possibile aggiungere tag migliori, si prega di farlo. Avevo dei dubbi sui tag che potevano essere aggiunti.


"Ogni strumento è una responsabilità fino a quando non impari come usarlo."
JeffO,

1
Un database può essere o non essere appropriato per il tuo progetto. Tuttavia, potresti scoprire che sarebbe utile usare un formato più semplice. C'è un modulo CSV standard con Python che potresti prendere in considerazione di usare. Avere un CSV semplificherebbe l'esportazione dei dati in altri programmi (ad es. - in un foglio di calcolo in modo da poterli rappresentare graficamente).
Sean McSomething il

Risposte:


13

Quando si dovrebbe preferire un database per l'archiviazione dei dati rispetto all'archiviazione dei dati in un file di testo?

Wikipedia ci dice che un database è una raccolta organizzata di dati . Con questa misura, il tuo file di testo è un database. Continua dicendo:

I dati sono in genere organizzati per modellare gli aspetti rilevanti della realtà in modo da supportare i processi che richiedono queste informazioni. Ad esempio, modellare la disponibilità di camere negli hotel in modo da supportare la ricerca di un hotel con posti vacanti.

Quella parte è soggettiva - non ci dice in modo specifico come i dati dovrebbero essere modellati o quali operazioni debbano essere ottimizzate. Il tuo file di testo è composto da un numero di record distinti, uno per ogni giorno, quindi stai modellando un aspetto della realtà in un modo che sia rilevante per il tuo problema.

Mi rendo conto che quando dici "database" probabilmente stai pensando a una sorta di sistema di gestione di database relazionali, ma pensare al tuo file di testo come a un database cambia la tua domanda da "quando dovrei usare un database?" a "che tipo di database dovrei usare?" Vedere le cose alla luce rende la risposta più facile da vedere: usa un database migliore quando quello che hai non soddisfa più le tue esigenze.

Se il tuo script Python e il tuo semplice file di testo funzionano abbastanza bene, non c'è bisogno di cambiare. Con solo un nuovo record al giorno e i computer che diventano più veloci ogni anno, sospetto che la tua soluzione attuale potrebbe essere praticabile per molto tempo. Un decennio di dati ti darebbe solo 3650 record che, una volta analizzati, richiederebbero probabilmente meno di 75 kilobyte.

Immagina che invece di un piccolo record al giorno, hai deciso di registrare ogni domanda posta su CodeReview, chi l'ha fatto e quando. Inoltre, raccogli anche tutte le risposte e i metadati pertinenti. Si potrebbe memorizzare tutti che in un file di testo, ma un file flat renderebbe difficile trovare informazioni quando ne avevi bisogno. Ci sarebbero troppi dati per leggere tutto in memoria, quindi ogni volta che vuoi trovare una domanda o una risposta, dovresti scansionare il file fino a quando non trovi quello che stavi cercando. Quando volevi trovare tutte le domande poste da un determinato utente, dovresti scansionare l'intero file. Se volessi trovare tutte le domande che hanno "bug" come tag, dovresti scansionare il file.

Sarebbe terribilmente lento, quindi potresti decidere di accelerare le cose costruendo alcuni indici che ti dicono dove cercare nel file per trovare un dato record. Potresti avere un indice per le domande, un altro per gli utenti, un terzo per le risposte e così via. Quando volevi trovare una domanda, cercavi l'indice (molto più piccolo) della domanda, prendevi la posizione della domanda nel file di dati principale e salta rapidamente al punto giusto nel file. Sarebbe un grande miglioramento delle prestazioni. In effetti, è praticamente quello che è un sistema di gestione di database.

Quindi, utilizzare un DBMS quando è quello che ti serve. Usalo quando hai molti dati, quando devi essere in grado di accedervi rapidamente e forse in modi che non puoi prevedere completamente all'inizio. Se si dispone di diversi tipi di dati, diversi tipi di record, collegati tra loro, utilizzare un RDBMS in modo da poter collegare i vari record in modo appropriato.


3
"pensando al tuo file di testo come cambia un database" Molto perspicace. Anche la parte su di me con solo 3650 voci è stata utile. Ha aiutato a ottenere una prospettiva reale del problema.
Aseem Bansal,

1
Risposta altamente sottovalutata, questa è la seconda volta che ci torno.
Hashim,

6

I database hanno molti vantaggi, ma rendere l'accesso più semplice non è uno di questi. Più veloce, più standardizzato, interpretabile come sublanguage di comando incorporato, più sicuro, sì, ma non più facile. Indipendentemente dalla quantità di zucchero sintattico fornita dalla tua lingua e dalla libreria standard, devi innanzitutto disporre di una base di dati, aprire una connessione e instradare i dati dal tuo programma in modo completamente diverso e viceversa. Finché non ci sono problemi con ciò che fai e la facilità di programmazione è la tua priorità, non passare mai a un database solo perché pensi che sia "buona pratica".

La mia opinione su quando fare il passaggio è seguire lo sviluppo storico. Dopotutto, le persone hanno archiviato i dati in file per molto tempo prima che fosse inventato il DB relazionale, e in effetti un intero gruppo di modelli di database inferiori (DB gerarchico, DB di rete ...) sono stati inventati prima. Hanno iniziato a scrivere basi di dati e le hanno utilizzate quando è diventato chiaro che questo avrebbe risparmiato grandi sforzi di elaborazione, aumentato l'affidabilità ecc. Nel complesso e nel lungo periodo . Fintanto che non è così per te e non prevedi che diventerà presto il caso, il passaggio sarebbe troppo ingegneristico.


La coesione non è migliore in base al design complessivo? ad es. nel mio caso sto memorizzando 5 valori corrispondenti a ciascuna data. Allo stato attuale non c'è coesione tra i dati.
Aseem Bansal,

Hai ragione, assicurarti che tutti i record abbiano una serie coerente di campi e valori è un altro di questi vantaggi. (In senso stretto è solo relazionali banche dati che devono garantire che chi è abituato basi di dati non relazionali in produzione per un lungo periodo di tempo, e attualmente stanno guadagnando ancora una volta la trazione con il movimento "NoSQL"..)
Kilian Foth

3

Ovviamente si tratterà di un giudizio, ma i tre criteri principali che prenderei in considerazione sono: deve essere conforme all'ACID , quanto sono complessi i dati e, infine, quante cose devono essere letti / scritti. Finché stai semplicemente leggendo e scrivendo una riga per e la tua app è l'unica app che legge o scrive, puoi probabilmente saltare il database. Una volta che inizi ad avere più app in lettura o scrittura o la struttura dei tuoi dati diventa complessa (in particolare se ha relazioni tra linee separate), un DB inizia a sembrare davvero attraente.


"quante cose hanno bisogno di leggerlo / scriverlo" - Ciò ha aiutato.
Aseem Bansal,

2

I database vengono utilizzati non solo per l'archiviazione, ma anche per la manipolazione e l'interrogazione dei dati, pertanto è necessario prendere una decisione ponderata:

Un grande fattore è il vantaggio che si ottiene dall'installazione di un database sulla macchina rispetto alla funzionalità che offre

Ovviamente se hai bisogno di interrogare e manipolare i dati, e vuoi che l'accesso sia veloce - e inoltre potresti pensare di usare un database per altre funzioni, allora potrebbe essere una buona idea. I modelli di archiviazione dei database consentono di cercare i dati in base ai valori chiave molto rapidamente e posso immaginare che l'analisi di un file potrebbe essere lenta (a seconda di come lo stai facendo)

Se vuoi giocare con SQL e cosa può fare, SQLFiddle.com ha alcuni diversi modelli RDBMS con cui puoi giocare (eseguire query, creare schemi ecc.)


Python ha un'interfaccia di libreria standard integrata per sqlite3. Quindi l'installazione di un database non è un problema. La mia considerazione è che se continuo a conservare i dati, a meno che non abbia una sorta di indicizzazione, potrebbe rallentare. Un database può occuparsene, credo. Ho scaricato sqlite3 separatamente per apprenderlo, ho scoperto che avevo bisogno di conoscere i modelli di database prima di utilizzare un database, l'ho provato. Posso imparare sqlite3 usando esempi basati su Internet ma attualmente sto riscontrando problemi nell'apprendimento dei modelli di database. Poi mi è venuto in mente se ne è valsa la pena?
Aseem Bansal,

2

Come sempre usare un database o meno dipende da cosa devi fare. Se disponi di un'enorme quantità di dati e devi eseguire molte query diverse su di essa, probabilmente un database potrebbe aiutarti.

Nel tuo caso, terrei l'archiviazione in un file di test fino a quando le prestazioni non saranno accettabili. Di solito la lettura di un file di testo (anche di grandi dimensioni) non richiede così tanto tempo. Se hai bisogno di più, puoi sempre aggiungere il database in un secondo momento.

Per la mia esperienza, se sei completamente nuovo nei database potresti trovare più facile usare qualcosa come couchdb: http://couchdb.apache.org/ che è no-sql e puoi usare direttamente javascript o python, ecc. Per le query.

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.