Bene, questa è una domanda di design semplice che mi sono chiesto molte volte e non ho mai trovato una soluzione soddisfacente. Il mio esempio è con php-sql, ma questo vale certamente anche per altre lingue.Progettazione database: chiavi di database sql corrispondenti alle costanti php?
Ho una piccola tabella di database contenente solo pochissime voci e che non ha quasi mai bisogno di essere aggiornata. ad esempio questo usertype
tabella:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
Ora nel codice php, ho spesso devono verificare o confrontare il tipo di utente ho a che fare. Poiché i tipi di utente sono memorizzati nel database, posso:
1) Selezionare * dalla tabella di tipi di utente all'istanza di classe e memorizzarlo in una matrice.
Quindi tutti gli ID sono disponibili per il codice e posso fare una semplice selezione per ottenere le righe che mi servono. Questa soluzione richiede una matrice e una query db ogni volta che la classe viene istanziata.
$query = "SELECT info, foo FROM user WHERE usertype_id = ".$usertypes['admin'];
2) utilizzare la colonna name
per selezionare la corretta usertype_id
, in modo che possiamo efficacemente unirsi con altre tabelle. Questo è più o meno equivalente a 1), ma senza la necessità di memorizzare nella cache l'intera tabella usertype nell'oggetto php:
$query = "SELECT info, foo FROM user JOIN usertype USING (usertype_id) WHERE usertype.name = 'admin' ";
3) Definire costanti corrispondenti ai tasti nella tabella tipo utente:
// As defines
define("USERTYPE_ADMIN",1);
define("USERTYPE_REGUSER",2);
//Or as class constants
const USERTYPE_ADMIN = 1;
const USERTYPE_REGUSER = 2;
E poi fai una semplice selezione.
$query = "SELECT info, foo FROM user WHERE usertype_id = " . USERTYPE_ADMIN;
Questa è probabilmente la soluzione più efficiente delle risorse, ma è male per mantenere, come è necessario aggiornare sia la tabella e il codice, se è necessario modificare qualcosa nella tabella usertype ..
4) Elimina la tabella usertype
e mantieni i tipi solo nel codice php. Non mi piace molto perché consente a qualsiasi valore di entrare nel database e di essere assegnato al tipo di utente. Ma forse, tutto sommato, non è così male e sto solo complicando qualcosa che dovrebbe essere semplice ..
In ogni caso, per riassumere la soluzione che mi piace di più è # 2 perché è coerente e con un indice su usertype.name
, non può essere così male. Ma quello che ho finito per usare è # 3, per efficienza.
Come lo faresti? Qualche soluzione migliore?
(edit: interrogazione fisso a # 2)
Ciò funzionerà se la tabella di tipo sta per essere utilizzato da un solo tavolo (come nell'esempio). Ma cosa succede se più tabelle devono utilizzare lo stesso tipo di enumerazione? – Vincent
Bene, allora dovrai usare il metodo normalizzato. E poi sei bloccato o interrogando costantemente il DB per i valori. O quello, o mantenendolo in due posti (che non è divertente) ... – ircmaxell