2012-03-21 7 views
8

Qual è la procedura migliore per la memorizzazione dei dati in un database che richiede sempre una sola voce. Un esempio potrebbe essere dati di configurazione relativi all'intera applicazione/sito Web. È comune creare una tabella per questo che ha solo una singola voce?Qual è il modo migliore per memorizzare singoli dati non ripetibili in un database?

Sto chiedendo nel contesto di un database MongoDB anche se penso che la domanda sia valida anche per i database SQL.

+1

Wouldn è meglio essere gestiti dal livello dell'applicazione? Potrebbe essere solo un singolo file di testo in cui è possibile leggere/scrivere coppie di valori chiave. C'è una ragione particolare per usare i database? – cctan

risposta

0

Per i database MongoDB, di solito faccio solo una nuova "tabella", ma, per i database SQL, che richiede molto di più (specialmente quando altri stanno lavorando sullo stesso database, SQL non è malleabile), quindi , potresti voler essere un po 'più attento con esso.

1

Se si utilizza un DB SQL, probabilmente si avranno colonne come il nome della chiave e il valore e ogni attributo verrà memorizzato come una riga. In MongoDB, puoi archiviare tutte le configurazioni correlate come un singolo documento JSON

+0

Bene, suppongo che tutti i tuoi valori siano dello stesso tipo, o non ti dispiace digitare conversioni ... –

5

Un esempio di una tabella ausiliaria comunemente trovata nei database si chiamerebbe Constants e può contenere tali valori di pi, l'idea inizia che tutte le applicazioni utilizzano il database sono tenuti ad usare la stessa scala e precisione. In SQL standard, per assicurarsi che siano al massimo una riga, ad es. (from Joe Celko):

CREATE TABLE Constants 
(
lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY, 
CHECK (lock = 'X'), 
pi FLOAT DEFAULT 3.142592653 NOT NULL, 
e FLOAT DEFAULT 2.71828182 NOT NULL, 
phi FLOAT DEFAULT 1.6180339887 NOT NULL, 
... 
); 

Perché MySql non supporta CHECK vincolo quindi un trigger è necessaria per ottenere lo stesso.

0

Uso una tabella di configurazione con un nome (nome_config) e un valore (valore_config). Aggiungo persino un campo di aiuto in modo che gli utenti possano vedere a cosa serve la coppia nome/valore, o dove è usata.

CREATE TABLE config (
    config_id bigint unsigned NOT NULL auto_increment, 
    config_name varchar(128) NOT NULL, 
    config_value text NOT NULL, 
    config_help text COMMENT 'help', 
    PRIMARY KEY (config_id), 
    UNIQUE KEY ix_config_name (config_name), 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

Quindi il seguente codice php recupera il valore di una chiave o restituisce una stringa vuota. Suppone che $ db sia una connessione di database aperta. Tutte le voci sono forzate in lettere minuscole.

function getConfigValue($name) { 
    $retval=''; 
    $db = $this->db; 
    $sql = 'select config_value from config where LOWER(config_name)="'.strtolower($name).'"'; 
    $result = $db->Query($sql); 
    if ($result) { 
     $row = $db->FetchAssoc($result); 
     $retval = $row['config_value']; 
    } 
    return $retval; 
} 

Tutti mysql/php in questo caso, ma il principio generale rimane.

0

Vorrei solo creare una tabella per le configurazioni, come ha detto rainecc, e usare la cache per prendere tutta la tabella in memoria :) e usarla da lì (cache). Sarà il migliore

2

Un tavolo andrebbe bene, nessun motivo per non usarlo solo perché avrà solo una riga.

Ho appena avuto l'idea più strana (non l'avrei implementata ma per qualche ragione ci ho pensato). È possibile creare una vista hard-coded come questo:

create view myConfigView 
as 
select 'myConfigvalue1' as configValue1, 'myConfigvalue2' as configValue2 

e fare select * from myConfigView :)

ma ancora una volta, non c'è ragione perché non utilizzare un tavolo solo perché avrà solo una riga

Problemi correlati