我为DVD商店设计了一个ER图,只允许注册客户租用,而且任何人都可以购买。购买DVD后,显然无法租用DVD。
每张DVD都可以购买或购买。
问题:
在数据库中强制执行DVD购买后无法租用DVD的最佳方法是什么。
我的解决方案:
我在DVD中有一个Sold_flag是一个Char(1个字节)。如果出售则存储一个,如果可购买或出租,则存储零。所以,如果它是一个不能租用的。
同样,如果要租用DVD,它会有一个标志。如果租用则存储一个,如果可以租用或购买则存储零。
这两个标志是处理这些问题的最佳方法吗?
我将它们串作为char(1字节)这是存储它们的最佳方式吗?
情况:
会员( Member_Num ,姓名,地址,Telephone_Num,Join_Date)
DVD( DVD_ID ,Film_ID,Sold_Flag,Rented_Flag)
租借( Member_Num,DVD_Num,Rented_On ,Returnned_On,价格,罚款)
购买( DVD_ID ,Member_Num,Price,Sold_On)
电影( Film_ID ,导演,姓名,Rent_Price,Sale_Price)
答案 0 :(得分:1)
由于这两个州是相互排斥的,因此您不需要两个单独的标志用于出售和出租。如果出售DVD,则无法同时出租;反之亦然。也许一个更好的替代品是“状态”'一种列,可以说1-Available,2-Rented和3-Sold。也许是不同状态的查找表。
您必须以编程方式强制执行此规则,因为该规则适用于租赁"的过程,而不是代表有关DVD或租赁或客户的事实的静态数据。
你基本上是这样说的 - "租房时,如果有人选择已经售出的DVD,不要允许租赁交易"。
因此,在你的程序/功能中说
PROCEDURE RENT_DVD (member_num, dvd_id, rented_on, price)
在开头会有一个像
的检查FUNCTION is_dvd_rentable(dvd_id) return boolean
确认DVD的状态不是3。
你可能很想把逻辑置于触发器中,这可能会说“如果状态= 3”,那么就不允许这个租赁交易完成了#34;但是如果您经常访问此站点或其他与oracle相关的网站,例如asktom,您就会知道业务逻辑不应该放在触发器中。
答案 1 :(得分:1)
我建议您在图表中用单个订单实体替换实体购买和租赁。
在Orders实体上,您将orderType属性设置为“purchase”或“rental”。
简单的数据库约束可以强制DVD只能出现在单个订单行上。
所以:
客户已订购DVD。
订单属于Type。