Avere un tipo di dati generico per una colonna della tabella del database, è una pratica "buona"?

5

Sto lavorando su un progetto PHP in cui alcuni oggetti (membri della classe) possono contenere diversi tipi di dati. Ad esempio:

class Property {
    private $_id;     // (PK)
    private $_ref_id; // the object reference id (FK)
    private $_name;   // the name of the property
    private $_type;   // 'string', 'int', 'float(n,m)', 'datetime', etc.
    private $_data;   // ...

    // ..snip.. public getters/setters
}

Ora, ho bisogno di perseverare su questi oggetti. Alcune proprietà possono essere un tipo di dati di testo, ma nulla di più grande di ciò che un varchar può contenere. Inoltre, più avanti, devo essere in grado di eseguire ricerche e ordinamento.

È una buona pratica usare una sola tabella di database per questo (cioè c'è un impatto sulle prestazioni non trascurabile)? Se è "accettabile", quale potrebbe essere il tipo di dati per la colonna data ?

    
posta Yanick Rochon 12.10.2012 - 01:42
fonte

2 risposte

3

Is it a good practice to use a single database table for this

Se hai bisogno di 1 o più tabelle è un fattore della dipendenza delle colonne appartenenti alla tabella al PK, come da regola di normalizzazione. L'esempio che mostri suggerisce, anche se non molto chiaro, che questo è il caso.

È possibile scomporre una singola tabella logica in due tabelle fisiche se si dispone di un numero molto elevato di colonne o se i dati possono essere partizionati in modo logico per ottenere prestazioni, tuttavia non è più necessario con i nuovi sistemi di database poiché è possibile utilizzare il database caratteristiche come le partizioni per occuparsene.

Per ottenere prestazioni, è necessario definire gli indici e decidere quali colonne devono partecipare a ciascun indice e la sequenza di colonne in ciascuna. Questo è il caso se si dispone di dati di grandi dimensioni con accesso frequente. Gli indici sono più lenti per le colonne di grandi dimensioni rispetto ad altri tipi di colonne come int. Inoltre, un indice può essere ignorato se si eseguono determinate query LIKE.

what could be the data type for the data column?

Non è chiaro quale sarà la colonna di dati nel tuo esempio. Tuttavia, può fare un tipo di dati VARCHAR o TEXT. Per un confronto delle prestazioni tra i due tipi, ti consigliamo di controllare Testo vs Varchar e < a href="https://dba.stackexchange.com/questions/386/what-is-the-difference-between-mysql-varchar-and-text-data-types"> dba.stackexchange-Text vs Varchar .

    
risposta data 12.10.2012 - 02:27
fonte
1

No, in realtà è la peggiore pratica possibile. Sto esagerando.

Dovresti utilizzare colonne separate per ogni elemento in $ data per massimizzare la potenza del database. Scrivere query di ricerca, ordinare query, ecc., Contro una colonna data sarebbe un incubo di complessità, mentre questi tipi di query sono facili su una tabella di database 'normalizzata'.

Se la tua proprietà $ data potrebbe potenzialmente contenere tutti i tipi di coppie chiave = > valore che non puoi prevedere, allora dovresti esaminare una struttura di tabella EAV per la tabella del tuo database. Se le chiavi (le proprietà) nella variabile $ data sono abbastanza costanti, puoi utilizzare una normale tabella di database flat.

In ogni caso, ti consiglio vivamente di non mettere $ dati in una singola colonna data in un database. In primo luogo, distruggerebbe quasi completamente tutti i vantaggi dell'utilizzo di un database. Potresti anche memorizzare i tuoi dati in un file di testo.

Per quanto riguarda le prestazioni ... di nuovo, hai negato tutto ciò che è utile su un database, quindi le tue prestazioni saranno terribili. E passerai ore a scrivere query convolute che richiederebbero un minuto per scrivere se hai un database normalizzato. Spero che tu non abbia proceduto con la tua colonna data . L'intero punto di una data base è rendere più facile la ricerca e la manipolazione dei dati!

    
risposta data 24.08.2013 - 02:34
fonte

Leggi altre domande sui tag