2009-09-17 16 views
9

Ho bisogno di memorizzare stringhe lunghe in un database. la stringa può essere lunga 5 o 6 frasi. pensi che questa sia una buona strategia di design. o dovrei memorizzare un ID per quella stringa e quindi creare una relazione con un'altra tabella che contiene il percorso del file che memorizza la stringa. potresti per favore dare vantaggi e svantaggi a entrambi.È buono memorizzare stringhe lunghe in un database?

le stringhe sono state pre-elaborate e memorizzate nel database. qualsiasi modifica dovrebbe leggere l'intera stringa e sostituirla completamente. quindi puoi presumere che la stringa sia indivisibile.

+1

Questo è, infatti, perché SQL ha il tipo di TESTO (oh, e CLOB) – Powerlord

risposta

11

Dovrebbe va bene per memorizzare la stringa nel database. Se invece si memorizza un puntatore di file, ciò significa che è necessario eseguire I/O su file ogni volta che si desidera leggere la stringa. Alcune frasi non sono eccessivamente lunghe e puoi sempre utilizzare un campo dati longtext se necessario. Ovviamente il tuo database sarà un po 'più grande perché hai il testo, ma va bene. È sicuramente un'alternativa migliore rispetto a dover archiviare i file.

3

Cinque o sei frasi non sono niente per un moderno DBMS! Memorizza il testo direttamente nel database.

(L'altra tecnica lei ha citato - la memorizzazione di un ref a un altro tavolo, che a sua volta ha un ref in un file esterno che tiene il testo - sarebbe molto più complicato da usare e hanno prestazioni molto più povera.)

+0

"Cinque o sei * miliardi di frasi * non sono nulla per un DBMS moderno!" – Xeoncross

4

L'unica ragione per cui creerei una tabella separata è se quelle lunghe stringhe saranno uguali per molti record. Altrimenti è solo una complicazione extra che non è in grado di fornire alcun rimborso.

+0

no queste lunghe stringhe sono diverse. Capisco il tuo punto, non dovrebbe essere usato un tavolo separato. ma dovrei memorizzare la stringa nel file system e tenere solo un puntatore al file nel database o memorizzare la stringa nel database stesso. qualsiasi suggerimento basato sulla prestazione. –

+0

@iamrohitbanga: Quindi, per quanto tempo * sono esattamente? Qualsiasi cosa fino a un paio di kilobyte (che è abbastanza per il testo) è OK da memorizzare nel database. Qualunque cosa al di sopra di questo limite è * ancora * okay, ma è necessario utilizzare i tipi di dati TEXT forniti dal DBMS. L'idea di metterli sul file system per motivi di prestazioni ha molto senso per me. – Tomalak

+0

@iamrohitbanga: Queste stringhe hanno davvero bisogno di essere di dimensioni significative, stiamo parlando di multipli di 10K prima che (se mai) diventino fattibili per memorizzarli nel file system con tutte le complicazioni che ciò comporta. – AnthonyWJones

2

La risposta dipende in realtà dal volume di stringhe che si intende memorizzare e dal DB che si intende utilizzare per memorizzarlo. Se non si memorizzano molte stringhe, è consigliabile prendere in considerazione la possibilità di archiviarle in un file XML o di risorse e caricarle nell'applicazione in anticipo. Se si hanno molti dati sulle stringhe, probabilmente starai meglio a leggere a memoria la stringa come e quando ne hai bisogno, piuttosto che prendere in mano la possibilità di leggere una stringa che non usi.

2

Il database stesso non presenta problemi reali con l'archiviazione di stringhe lunghe. Alcune restrizioni si applicano (come il limite della dimensione del record di 8k su SQL Server), ma anche in questo caso è possibile memorizzare testo di lunghezza arbitraria in un database, poiché tutti i tipi appropriati supportano tipi di dati BLOB/TEXT praticamente senza limite superiore.

Cinque o sei frasi non sono molto lunghe. Se appartengono insieme e sono pensati per essere recuperati e manipolati nel loro complesso, puoi andare avanti e memorizzarli in un campo di tipo di dati CHAR di dimensioni appropriate.

La questione se separarli e associarvi un ID si pone solo se il modello di applicazione/dati beneficia direttamente da questo approccio, cioè in realtà sono cose separate. Nel tuo caso non sembra esserci alcuna ragione per andare in quel modo.

0

Tranne casi speciali, vorrei lasciare il campo dov'è.

L'unica altra opzione sarebbe quella di mettere le stringhe in una tabella diversa (mettendo le stringhe effettive lì dentro) ... metterle in file separati ucciderà le tue prestazioni.

8

Le stringhe che hai citato non sono affatto lunghe.

Quando ci si riferiva a stringhe "lunghe", stavo pensando a 32kB e oltre - alcune frasi sono < 1kb - questo non è niente oggi.

Il tuo trucco, la memorizzazione di un ID rende le cose più lente poiché devi fare un accesso indiretto.

L'unica cosa che consiglierei, quando sono necessarie le massime prestazioni, dovresti selezionare solo le colonne di cui hai bisogno (ometti SELECT *) - quindi omettere la colonna di testo, quando non è necessario, dato che il trasporto della stringa da il server per l'applicazione costa la maggior parte del tempo. È una buona prassi, non toccare le colonne non necessarie (specialmente quando potrebbero contenere molti dati).

1

Tutti hanno menzionato le prestazioni, ma nessuno ha sollevato l'altro motivo principale per cui l'archiviazione dei puntatori ai file del sistema operativo è una cattiva idea: backup e ripristino. Se tutto è nel database, abbiamo un singolo meccanismo per il backup dei dati e un singolo meccanismo per il recupero. Mentre con i file sul sistema operativo abbiamo due diversi meccanismi di backup, probabilmente con due diverse granularità, e il recupero diventa un incubo di sincronizzazione.

Ci sono alcuni casi in cui questo non si applica, come i data warehouse, che hanno transazioni poco frequenti e quindi possono sopravvivere senza i log di redo o delle transazioni.

Problemi correlati