Campo del database di array a dimensione fissa
-
04-07-2019 - |
Domanda
Devo memorizzare diversi valori di data in un campo di database. Questi valori saranno associati a un "Utente" in modo tale che ciascun utente disponga di un proprio set univoco di questi diversi valori di data.
Potrei usare una relazione uno-a-molti qui, ma ogni utente avrà esattamente 4 valori di data associati a loro, quindi ritengo che una tabella uno-a-molti sarebbe eccessiva (in molti modi ad esempio velocità) ma se io avevo bisogno di interrogare contro di loro avrei bisogno che quei 4 valori si trovino in campi diversi, ad es MyDate1 MyDate2 ... ecc. Ma poi il comando SQL per recuperarlo dovrebbe controllare ogni volta 4 valori.
Quindi la relazione uno-a-molti sarebbe probabilmente la soluzione migliore, ma esiste un modo migliore / più pulito / più veloce / qualunque altra cosa? Lo sto progettando correttamente?
La piattaforma è MS SQL 2005 ma la soluzione su qualsiasi piattaforma lo farà, cerco principalmente tecniche di progettazione db adeguate.
EDIT: I 4 campi rappresentano 4 istanze della stessa cosa.
Soluzione
Se lo fai come quattro campi separati, non devi unirti. Per salvare la sintassi della query dall'essere troppo orribile, puoi scrivere:
SELECT * FROM MyTable WHERE 'DateLiteral' IN (MyDate1, MyDate2, MyDate3, MyDate4);
Come menzionato nei commenti, l'operatore IN è piuttosto specifico quando si tratta di campi di data (fino all'ultimo (milli) secondo). Puoi sempre utilizzare le funzioni di data e ora nella sottoquery, ma TRA è inutilizzabile:
SELECT * FROM MyTable WHERE date_trunc('hour', 'DateLiteral')
IN (date_trunc('hour', MyDate1), date_trunc('hour', MyDate2), date_trunc('hour', MyDate3), date_trunc('hour', MyDate4));
Altri suggerimenti
Alcuni database come Firebird hanno un tipo di dati array, che fa esattamente ciò che hai descritto. È dichiarato qualcosa del genere:
alter table t1 add MyDate[4] date;
Per quello che vale, il design normalizzato sarebbe quello di memorizzare le date come righe in una tabella dipendente.
La memorizzazione di più valori in una singola colonna non è un disegno normalizzato; la normalizzazione indica esplicitamente che ogni colonna ha esattamente un valore.
Puoi assicurarti che non più di quattro righe siano inserite nella tabella dipendente in questo modo:
CREATE TABLE ThisManyDates (n INT PRIMARY KEY);
INSERT INTO ThisManyDates VALUES (1), (2), (3), (4);
CREATE TABLE UserDates (
User_ID INT REFERENCES Users,
n INT REFERENCES ThisManyDates,
Date_Value DATE NOT NULL,
PRIMARY KEY (User_ID, n)
);
Tuttavia, questo design non ti consente di rendere obbligatori i valori della data.
Che ne dici di avere 4 campi insieme all'ID utente (se sei sicuro, non supererà quello)?
Crea quattro campi data e archivia le date nei campi. I campi data potrebbero far parte della tabella utente oppure potrebbero trovarsi in un'altra tabella unita alla tabella utente in una relazione uno a uno. È la tua chiamata.