2009-03-03 5 views
2

Ich habe eine kurze Frage - gibt es eine Best Practice in SQL-Tabellenentwurf für die Speicherung von "entweder/oder" Daten?SQL-Tabellen - Muster für entweder/oder Daten

Ich habe das folgende Problem - ich muss Vorlage Daten (Definieren von Ordnerstruktur) in einer SQL-Tabelle speichern. Jeder angegebene Ordner kann einen statischen Namen haben (zum Beispiel "E-Mails") oder er kann dynamisch für jede Instanz erzeugt werden, abhängig von den Objekten, die ihm zugeordnet sind (zB Firmenname).

Wenn ein Geschäftsobjekt instanziiert wird, werden die Vorlagendaten verwendet, um die tatsächliche Ordnerstruktur zu erstellen.

Ich denke, die Daten wie folgt zu speichern:

 
CREATE TABLE folder 
(
    ID INT IDENTITY PRIMARY KEY, 
    FolderName NVARCHAR(50), 
    IsDynamic BIT NOT NULL DEFAULT 0, 
    DynamicFieldID INT FOREIGN KEY REFERENCES dynamicField, 
    ParentID INT FOREIGN KEY REFERENCES folder 
) 

Also, wenn das IsDynamic Feld auf true gesetzt ist ich weiß, dass es eine Regel sein wird (definiert auf dem Fremdschlüssel), aber wenn nicht ich verwendet den im Ordnernamen gespeicherten Wert.

Aber das scheint ein bisschen chaotisch für mich - gibt es ein "Best-Practice" -Muster für diese Art von Szenario?

Antwort

7

Das sieht mir nicht schlecht aus.

Sie möchten vielleicht nicht mit dem Feld "IsDynamic" belästigen, da dies aus der Tatsache abgeleitet werden kann, dass die DynamicFieldID null ist. Dann könnten Sie in Ihrem SQL die Felder aus den Dynamischen Tabellen JOIN und COALESCE VERLASSEN.

Aber ich denke nicht, dass das obige Modell so unordentlich ist.

4
CREATE TABLE folder 
(
    ID INT IDENTITY PRIMARY KEY, 
    ParentID INT FOREIGN KEY REFERENCES folder 
) 

CREATE TABLE dynamic_folder (
    ID INT FOREIGN KEY REFERENCES folder (id), 
    DynamicFieldID INT FOREIGN KEY REFERENCES dynamicField 
) 

CREATE TABLE static_folder (
    ID INT FOREIGN KEY REFERENCES folder (id), 
    FolderName NVARCHAR(50) 
) 
+0

Hallo Patrick - Dank. Ich dachte darüber nach, aber war aufgelegt, um zu entscheiden, ob das besser oder schlechter war als mein Fall. Was ist Ihre Meinung darüber, warum dies besser ist (oder was halten Sie für die Vor- und Nachteile)? – Chris

+0

Wenn Sie mehr als zwei Arten von Ordnern hatten oder mehr als zwei Spalten betroffen waren, könnte dieser Ansatz sauberer sein als der Versuch, alles in einer Tabelle zu behalten. Jedoch, wie es aussieht, denke ich Chris COALESE Vorschlag ist praktischer.Ich würde seine Antwort akzeptieren. :-) –

-1

Ich bin nicht sicher, ob ich die Frage genau bin zu verstehen, aber ich denke, was Sie sagen, ist, dass Sie ein Feld haben, die entweder einen statischen Wert oder die man haben kann, die auf der Grundlage anderer zur Laufzeit festgelegt werden muss, Werte.

Ich würde Ihr eigenes "Variable" -Schema erstellen und das in der Datenbank speichern. Ich weiß nicht, welche Sprache Sie verwenden, und so würde ich etwas basierend darauf finden (machen Sie es anders als Ihre Sprache) und ich würde etwas verwenden, das den Wert umgibt - Anfang und Ende. So zum Beispiel:

Wert:/CompanyA/projectA/

oder

Wert/@ companyVariable @/@ projectVariable @/

dann schreiben Sie einfach eine Routine zum Öffnen suchen und Schließen @ Zeichen und tausche sie mit den entsprechenden Werten aus. Es ist ein bisschen mehr Arbeit, aber ich denke, es wäre am leichtesten zu verstehen und am flexibelsten. Wieder, @ Zeichen ist genau das, was ich zuerst dachte, verwenden Sie, welche Charaktere für Sie am sinnvollsten sind.

+0

Möchte jemand kommentieren, warum ich abgelehnt wurde? War meine Antwort irgendwie falsch? Wenn es eine schlechte Idee ist, warum nicht? –

1

können Sie müssen nur NULL in DynamicFieldID und Abfrage wie folgt:

SELECT COALESCE(dynamicName, folderName) 
FROM folder 
LEFT JOIN dynamicField ON (dynamicField.ID = folder.DynamicFieldID)