2015-01-09 54 views
0

我有一個數據庫表,例如:如何在表中執行數據庫級記錄之間的依賴關係

----[Statuses]---- 
StatusID 
Name 
------------------ 

與數據例如:

----[Statuses]---- 
1 
Quote created 

2 
Quote accepted 

3 
Quote sent 

4 
Quote confirmed 

5 
Quote declined 
------------------- 

現在我想顯示這在界面中是一個多項選擇,因此所有這些記錄下都有一個複選框 - 但是,有些選項不是多項選擇,如「報價已確認」和「報價已拒絕」都不能同時存在。

最大的問題是這個表是可變的 - 用戶可以添加更多的狀態 - 否則我可以創建觸發器。

我該如何在記錄級執行這種規則?有沒有辦法,通過在此表中添加1列或更多列來使其工作?

編輯: 我將添加關於我的問題更完整的設計:

還有一個表,如:

---[Projects]--- 
ProjectID 
Projectname 
Projectcode 
Projecttype 
---------------- 

爲了記錄用戶回升什麼,一個需要連接表:

------------------[Projects_Statuses]--------------- 
ProjectID 
StatusID 
DateChecked (date when the user clicked the status) 
UserChecked (user that clicked the status) 
----------------------------------------------------- 

以下可能是加入表

SELECT * 
FROM Projects_Statuses PS 
    INNER JOIN Statuses S ON PS.StatusID = S.StatusID 
    INNER JOIN Projects P ON PS.ProjectID = P.ProjectID 

結果:

--------------------[Project_Statuses]----------------- 
Project_StatusID: 1     | 2 
DateChecked:  1/9/2015   | 1/9/2015 
UserChecked:  User1    | User1 
ProjectID:  1     | 4 
Projectname:  Nameless Project | Nameless Project 
Projectcode:  P122-323   | P122-323 
Projecttype:  Type 3   | Type 3 
StatusID:   5     | 4 
StatusName:  Quote declined | Quote confirmed 
------------------------------------------------------- 

而這也正是我想避免的組合:報價無法確認,並在同一時間下降。這是一個任選項。

+0

因此,「狀態」表包含用戶實際選擇的內容,對嗎?那不是參考表?否則,爲什麼這是一個表變量? – jazzytomato

+0

實際上挑選了什麼,確實記錄在參考表中。例如:Projects_Statuses或Incidents_Statuses。最後,用戶想要查詢項目或突發事件,例如報價已被確認。但是,如果一個報價被確認並同時被拒絕,它會提供虛假信息,所以我試圖使其能夠克服這種結果 –

回答

1

'報價確認'和'報價下降'不能同時爲真。

通常,這是由維護數據庫的軟件檢查的那種情況。

但是,你可以嘗試這樣的事:

Status 
------ 
StatusID 
StatusType 
ExclusiveStatus 

,行是這樣的:

1 Quote created  0 
2 Quote accepted 0 
3 Quote sent  0 
4 Quote confirmed 1 
5 Quote declined 1 

然後,你可以寫一個觸發器,它會阻止多於一個非零被使用的狀態。

+1

這是一個很好的結果。我也想出了一個列添加水平。例如,created = lvl 1。Accepted = lvl 2. Sent = lvl 3. Confirmed = lvl 4,Declined也是lvl 4,但沒有比這更進一步。一個觸發器確實是一個好主意,強制一個關卡的出現不能被使用一次以上。 有了這個級別列,我也試着 - 我沒有提到 - 創建這個狀態列表的一種按時間順序排列的清單:必須從第1級開始,然後才能檢查任何高級別的複選框 –