2009-03-03 26 views
2

我有一個快速的問題 - SQL表格設計中是否存在「或/或」數據的最佳做法?SQL表格 - 模式或數據

我有以下問題 - 我需要在SQL表中存儲模板數據(定義文件夾結構)。任何給定的文件夾可能都有一個靜態名稱(例如「電子郵件」),或者可能會爲每個實例動態生成,具體取決於與其關聯的對象(例如公司名稱)。

當實例化業務對象時,模板數據將用於創建實際的文件夾結構。

我想存儲這樣的數據:

 
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 
) 

因此,如果IsDynamic字段設置爲true,我知道會有一個規則(外鍵定義),但如果沒有我將使用存儲在文件夾名稱中的值。

但是,這對我來說似乎有點混亂 - 這種情況下是否存在「最佳實踐」模式?

回答

7

這對我來說並不難看。

您可能想要考慮不打擾「IsDynamic」字段,因爲這可以從DynamicFieldID爲空的事實派生。然後在你的SQL中,你可以從動態表中加入和合並字段。

但我不認爲上述模型是混亂的。

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

喜帕特里克 - 感謝。我正在考慮這個問題,但是在決定這是更好還是更糟的情況下被掛了。對於爲什麼這樣更好(或者你認爲是什麼利弊)你有什麼看法? – Chris 2009-03-03 14:38:54

+0

如果您擁有兩種以上的文件夾,或者兩列以上的文件夾受到影響,這種方法可能比試圖將所有內容保存在一張表中更清晰。 但是,我認爲Chris的COALESE建議更實用。我會接受他的回答。 :-) – 2009-03-03 17:57:24

-1

我不知道,我正好認識這個問題,但我認爲你所說的是你有一個可以有需要基於其他在運行時確定的靜態值,或者一個字段值。

我會創建自己的「變量」方案並將其存儲在數據庫中。我不知道你在用什麼語言,所以我會想出一些基於此的語言(使它與你的語言不同),並且我會用一些圍繞價值的東西 - 開始和結束。因此,例如:

值:/公司A /了projectA/

值/ @ companyVariable @/@ projectVariable @/

然後只寫一個程序找開閉@符號並將它們與適當的值進行交換。這是一個更多的工作,但我認爲這將是最容易理解的,最靈活的。再次,@符號正是我首先想到的,使用任何字符對你最有意義。

1

你只需在DynamicFieldIDNULL和查詢,像這樣:

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