在表中维护外部约束,引用具有公共引用表的两个表

时间:2014-09-21 10:32:21

标签: sql sql-server

我在MSSQL 2012数据库中有四个表,我不知道是否需要更改设计或坚持我制作的约束,我认为虽然有效,但我觉得有点麻烦。考虑以下玩具示例:

考虑一个图书馆借出书籍和杂志,并希望跟踪贷款。问题是杂志和贷款有不同的状态,所以我最终得到了这些表格:

  • MediaType(ID,Name)例如。 {" Book"," Magazine"}
  • 媒体(ID,名称,媒体类型),例如。 {("飘风",1),(时间,2)}
  • MediaState(ID,State,MediaType),例如。 {(" Loaned",1),("保留",1),("可用",2),(" Stockout", 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 

1 个答案:

答案 0 :(得分:0)

我建议有一个表来保存每个单元的数量(媒体,媒体类型)。然后使用存储过程来发布单位

检查是否

的存储过程
currentStock - Loaned - Reserved - [Ordered Units] >= 0

如果满足以上条件,则会在Log表中插入一个条目。否则,它会返回一条用户友好的消息,说Out of stock ... bla bla ..

还在您的日志表中添加一个名为BIT的{​​{1}}列,默认情况下将其设置为Returned,当返回Item时将其设置为1。