2014-09-21 45 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

相关问题