2014-09-21 42 views
0

我有四個表在MSSQL 2012數據庫,我找不到了,如果我需要改變設計或與我所做的約束,我認爲堅持是有點麻煩儘管它有效。請看下面的玩具,例如:維持表外部約束引用具有共同的參考表兩張表

考慮到貸款了書籍和雜誌,想跟蹤貸款的庫。值得注意的是雜誌和貸款有不同的狀態,所以我最終得到這些表格:

  • MediaType(ID,Name)例如: {「Book」,「Magazine」}
  • Media(ID,Name,MediaType) {(「飄」,1),(時間,2)}
  • MediaState(ID,State,MediaType) {( 「行貸款」,1),( 「保留」,1),( 「可用」,2),( 「脫銷」,2)}
  • 日誌(ID,時間,媒體,MediaState)

我如何確保不會出現狀態缺貨的書籍?

我目前的解決方案是讓一個檢查約束的日誌調用函數checkStates()來檢查,如果下面的計數大於0:

SELECT count(*) FROM Logs l INNER JOIN Media m ON l.Media = m.ID INNER JOIN MediaState ms ON ms.ID = m.MediaState WHERE m.MediaType != ms.MediaType 
+0

表格中每個單元的數量在哪裏? – 2014-09-21 11:05:18

+0

它是一個玩具的例子,所以不需要數量 – 2014-09-21 19:53:56

回答

0

我建議有一個表保持每個單位(媒體,媒體類型)的數量。然後使用存儲的過程來發出單位

存儲過程,其檢查是否

currentStock - Loaned - Reserved - [Ordered Units] >= 0 

如果以上爲真,則它插入進入日誌表。否則它返回一個用戶友好的消息說Out of stock ......喇嘛喇嘛..

還添加BIT列到你叫Returned日誌表的東西默認情況下它凝固爲0和返回項目時將其設置爲'1。

+0

對不起,我的例子可能不是最好的。問題是枚舉狀態必須適合媒體的類型。沒有數量,只是有效的狀態 – 2014-09-21 19:57:14

+0

你的''玩具例子''太玩弄了,給你一個現實的解決方案。用更真實的數據更新你的問題也許有人可以幫助你,歡呼 – 2014-09-21 19:59:39

+0

我做了一個關係圖,使其更清晰:[鏈接](http://s30.postimg.org/8im1rkzyp/download.png)。這個例子是我能做的最好的例子,因爲真正的例子非常複雜。 – 2014-09-23 11:28:39

相關問題