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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top