我为一家 DVD 商店设计了一个 ER 图,该图只允许向注册客户出租,任何人都可以购买。 DVD 购买后显然不能再出租。
每张 DVD 都可以购买或购买。
问题:
在数据库中强制执行购买 DVD 后不能出租的最佳方法是什么。
我的解决方案:
我在 DVD 中有一个 Sold_flag,它是一个 Char(1 字节)。如果已售出,则存储为 1;如果可以购买或出租,则存储为 0。因此,如果它是一个,则无法出租。
同样,如果正在租用 DVD,它也会有一个标志。如果已出租,则存储 1 个;如果可租用或购买,则存储 0 个。
这两个标志是处理这些问题的最佳方法吗?
我将它们字符串化为 char(1 字节),这是存储它们的最佳方式吗?
情况:
成员(member)(Member_Num、姓名、地址、电话号码、加入日期)
DVD(DVD_ID、Film_ID、Sold_Flag、Rented_Flag)
租赁(Member_Num、DVD_Num、Rented_On、Returned_On、价格、罚款)
购买(DVD_ID、Member_Num、价格、Sold_On)
电影(Film_ID、导演、姓名、Rent_Price、Sale_Price)
最佳答案
您不需要两个单独的标志来表示出售和出租,因为这两个状态是互斥的。如果 DVD 已出售,则不能同时出租;反之亦然。也许更好的替代品是“状态”类型的列,其中显示 1-可用、2-已租和 3-已售出。也许是不同状态的查找表。
但是,您必须以编程方式强制执行此规则,因为该规则适用于“租赁过程”,而不是代表有关 DVD 或租赁或客户的事实的静态数据。
您基本上是在说 - “在租赁时,如果有人选择了已售出的 DVD,则不允许进行租赁交易”。
因此,在您的程序/函数中表示
PROCEDURE RENT_DVD (member_num, dvd_id, rented_on, price)
一开始会有一个类似的检查
FUNCTION is_dvd_rentable(dvd_id) return boolean
确认 DVD 的状态不是 3。
您可能会想将逻辑放入触发器中,该触发器可能会说“如果状态 = 3,则不允许完成此租赁交易”。但是如果您经常访问此网站或其他与 Oracle 相关的网站(例如 Asktom),您会知道业务逻辑永远不应该放入触发器中。
关于database - Oracle:处理 Flag 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29017980/