Frage

Ich brauche mehrere Datumswerte in einem Datenbankfeld zu speichern. Diese Werte werden an einen „User“ gebunden werden, so dass jeder Benutzer seinen eigenen einzigartigen Satz von diesen verschiedenen Datumswerten haben.

Ich konnte eine Beziehung Eins-zu-viele verwenden hier aber jeder Benutzer genau 4 Datumswerte gebunden, sie haben, so glaube ich, dass eine Eins-zu-viele-Tabelle (in vielerlei Hinsicht zB Geschwindigkeit) zu viel des Guten wäre, aber wenn ich benötigt, um sie fragen gegen ich würde diese vier Werte müssen in verschiedenen Bereichen sein zB MyDate1 MyDate2 ... usw. aber dann der SQL-Befehl um es zu holen würde für 4 Werte jeder Zeit überprüfen.

So ist die Eins-zu-viele-Beziehung wahrscheinlich die beste Lösung wäre, aber gibt es eine bessere / Reinigungsmittel / schneller / was auch immer eine andere Art und Weise um? Bin ich es richtig entwerfen?

Die Plattform ist MS SQL 2005, aber Lösung auf jeder Plattform tun, ich bin auf der Suche vor allem für die richtigen db-Design-Techniken.

EDIT:. Die 4 Felder repräsentieren 4 Instanzen derselben Sache

War es hilfreich?

Lösung

Wenn Sie es als vier separate Felder zu tun, dann müssen Sie nicht beitreten. Um die Abfragesyntax Speichern von zu schrecklich ist, könnten Sie schreiben:

SELECT * FROM MyTable WHERE 'DateLiteral' IN (MyDate1, MyDate2, MyDate3, MyDate4);

Wie in den Kommentaren erwähnt, ist die IN-Operator ziemlich spezifisch, wenn es um Datumsfelder kommt (bis auf den letzten (Milli) Sekunden). Sie können jederzeit Datum Zeitfunktionen auf der Unterabfrage verwenden, sondern zwischen unbrauchbar ist:

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));

Andere Tipps

Einige Datenbanken wie Firebird Array-Datentyp haben, das ist genau das tut, was Sie beschrieben. Es ist so etwas wie folgt deklariert:

alter table t1 add MyDate[4] date;

Für das, was es wert ist, das normalisierte Design wäre die Daten als Zeilen in einer abhängigen Tabelle zu speichern.

mehr Werte in einer einzigen Spalte zu speichern ist nicht eine normalisierte Design; Normalisierung explizit bedeutet jede Spalte genau einen Wert.

Sie können sicherstellen, dass nicht mehr als vier Zeilen in der abhängigen Tabelle auf diese Weise eingesetzt werden:

 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)
 );

Allerdings ist dieser Entwurf nicht zulassen, dass Sie die Datumswerte obligatorisch machen.

Wie etwa 4 Felder alongwith User-ID mit (wenn Sie sicher sind, es wird nicht übersteigt das)?

Erstellen Sie vier Datumsfelder und speichern die Daten in den Feldern. Die Datumsfelder könnten Teil Ihrer Benutzertabelle sein, oder sie könnten in einer anderen Tabelle auf die Benutzertabelle in einer Eins-zu-Eins-Beziehung verbunden sein. Es ist Ihre Entscheidung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top