Ich denke, diese Art von Fragen sind interessant, denn jedes Mal, wenn Sie eine Datenbank entwerfen, ist es wichtig zu wissen, die Anforderungen der Anwendung, die mit Ihrer Datenbank interagieren wird.
Dass gesagt wird, solange die Anwendung mehrere Tabellen verweisen kann, denke ich, Chris Steele Antwort ein guter Start ist, dass ich auf bauen ...
würde ich 2 Tabellen wollen. Die erste Tabelle unterteilt einen Tag in Teile (Slices), abhängig von den Geschäftsanforderungen der Organisation. Jede Scheibe wäre der Primärschlüssel dieser Tabelle. Ich persönlich würde 15-Minuten-Scheiben wählen, die in 96 Tage-Teile gleich sind. Jeder Tag-Teil in dieser Tabelle würde eine "Block-Start" - und eine "Block-Ende" -Zeit aufweisen, auf die die Scheduling-Anwendung Bezug nehmen würde, wenn ein Benutzer eine tatsächliche Startzeit und eine tatsächliche Endzeit für die Besprechung ausgewählt hat. Die Anwendung müßte Logik anwenden wie zwei „OR“ Operatoren zwischen 3 „und“ Anweisungen, um zu sehen, ob ein bestimmte blockID wird in Ihre Terminen Tabelle eingefügt:
- eigentlichen Start> = Satzanfang und tatsächlichen Start < Blockende
- tatsächliches Ende> Satzanfang und tatsächliche Ende < Blockende
- eigentlicher Start < Satzanfang und tatsächliches Ende> Blockende
die von Chris Steele variiert leicht Antwort in th Bei ihr benutzt man zwei Tabellen. Die tatsächlichen Zeitstempel können weiterhin in Ihre Anwendungstabelle eingefügt werden, aber die Logik wird nur auf sie angewendet, wenn sie mit der Tabelle TimeBlocks verglichen wird. In meinem Termin Tabelle, ziehe ich Bruchdaten in Bestandteile für plattformübergreifende Analyse (unsere Organisation verwendet mehrere RDBMS sowie SAS für Analytik):
CREATE TABLE TimeBlocks (
blockID Number(X) NOT NULL,
blockStart DateTime NOT NULL,
blockEnd DateTime NOT NULL,
primary key (blockID)
);
CREATE TABLE Appointments (
mgrID INT NOT NULL,
yr INT NOT NULL,
mnth INT NOT NULL,
day INT NOT NULL,
blockID INT NOT NULL,
ApptStart DateTime NOT NULL,
ApptEnd DateTime NOT NULL
empID INT NOT NULL,
primary key (mgrID, yr, mnth, day, blockID),
CONSTRAINT timecheck
check (ApptStart < ApptEnd)
);
diese Einschränkung erzwingen Sie einen Trigger oder benutzerdefinierte Funktion benötigen (zumindest in den meisten Datenbanken). –
Wenn es sich wirklich um eine SQL-Interview-Frage handelt, könnte man einfach antworten, dass dies zur Entwurfszeit nicht möglich ist. –
Sie können dies in SQL Server tun, wenn Sie auch die Zeiträume der Freizeit modellieren, Querverweise auf Fremdschlüssel haben, die jeden Zeitraum mit seinem Vorgänger und Nachfolger verknüpfen, und wirklich schreckliche 'MERGE'-Anweisungen schreiben, um Einfügen/Löschen zu verhindern (In den meisten Fällen müssen Sie eine freie Periode aufteilen, indem Sie eine aktualisieren, eine neue Zeile einfügen und den neuen Termin einfügen, alles in einer einzigen Anweisung, damit die Fremdschlüssel erfüllt bleiben). Es ist machbar, aber oft sind die Kosten höher als der Wert. –