2012-12-16 21 views
3

如果我們在U​​ML是這樣的:T-SQL多重多到五或更多的/多(0 ... * - > 5 ... *)

|冠軍| ---------------> |團隊|

多重性:* -------> 5 ... *

每一個冠軍有5個人以上的團隊,我們如何能夠控制這個 '五個人以上的團隊' 在T- SQL?

由於我們有多對多的關係,我們將有中間表:從兩側的id(例如tbl_champ_team)。但是,如何控制每個冠軍應該有5個或更多的球隊?

一些CHECK創建表時?一些觸發器?

+0

你想什麼時候執行這個約束?如果因爲目前還沒有五支球隊而不能加入一支球隊,那麼你就會面臨一些挑戰。觸發器可以幫助,例如以確保通過單個語句添加的團隊數量大於或等於5. – HABO

回答

1

簡短的回答是,你不能通過檢查約束來做到這一點。是的,你可以在交叉表上應用一個觸發器,以確保插入的行數是5或更多,儘管我會強烈反駁這一點。

在我看來,正是你追求的是一個業務規則的執行,而不是一個數據規則,如果是的話那麼這個驗證應該在那裏進行。

+0

@ user1907954 - 要添加到Ralph的答案,在存儲過程中實現業務規則通常很有用,例如報告違規行爲。例如,向'GetAllChampionships()'添加一個'IsValid'列,該列指示是否所有業務規則都已滿足每行。應用程序可以使用該位以紅色顯示冠軍,禁用某些功能,...。我發現它比讓用戶試圖找到一條讓他們瀏覽所有規則以實現其最終結果而沒有任何中間違規的痛苦路徑要好得多。 – HABO

+0

@Ralph Shillington - 我有一個商業規則,說「冠軍必須至少有5支球隊,而且一支球隊可以參加多個冠軍賽」。這個數據規則是什麼?你的意思是實施水平? 「...如果是的話,那麼這個驗證應該在那裏完成」,你的意思是觸發權? 我的主要問題是:如果我在UML中有這個模型,我該如何實現這個模型是一致的? – Bugdr0id

+0

其他人可能不同意,但我認爲數據規則是不可改變的,牢不可破的。例如,出生日期必須是DateTime類型。這是一個數據規則,如果你說它不能爲空,那是另一個數據規則。沒有任何管理人員將會改變該規則。 冠軍賽至少有5支球隊,這是一個很好的例子,可能會被重新配置爲一個不同的聯賽,或者在某個時間點被忽略,因爲有奇數的球隊或者這樣的球隊。企業需要能夠適應這些可能性,這就是爲什麼業務規則更加靈活的原因。 –

0

單程(這有點複雜)是爲了實現這個約束而有一個單獨的表。它將擁有冠軍PK專欄,TeamA,TeamB,TeamC,TeamD和TeamE都是不可空的FK,而另一個表中包含所有的團隊,就像你在你的問題中設想的那樣。在{Championship和TeamA}之間添加5個FK約束到多對多表格,{Championship,TeamB}添加到同一個表格等等。

然後,如果不填充五個團隊屬性,則無法創建錦標賽。這本身仍然不是100%準確的,因爲它可以讓你以兩支或更多的球隊作爲同一支球隊進入冠軍,我想你不會想要......我不能拿出一個消除這種可能性的方法。