Oracle:处理 Flag 的最佳实践

Oracle: Best practice to handle Flag

我为一家 DVD 商店设计了一个 ER 图,它只允许向注册客户出租,而任何人都可以购买。 DVD购买后显然不能租

每张DVD都可以购买或购买。

问题:

在数据库中强制执行 DVD 购买后不能租借的最佳方法是什么。

我的解决方案:

我在 DVD 中有一个 Sold_flag,它是一个字符(1 字节)。如果它被出售,它存储一个 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、Returned_On、价格、罚款)

购买(DVD_ID,Member_Num,价格,Sold_On)

电影(Film_ID,导演,姓名,Rent_Price,Sale_Price)

您不需要为出售和出租两个单独的标志,因为这两个状态是相互排斥的。如果出售了 DVD,则不能同时租用;反之亦然。也许更好的替代品是 'Status' 类型的列,其中会显示 1-Available、2-Rented 和 3-Sold。可能需要查找 table 以了解不同的状态。

不过,您必须以编程方式强制执行此规则,因为该规则适用于 "process of Renting",而不适用于表示有关 DVD、租赁或客户的事实的静态数据。

你基本上是在说 - "While renting, if someone chooses a DVD that is already sold, don't allow the rental transaction"。

因此,在您的 procedure/function 中显示

PROCEDURE RENT_DVD (member_num, dvd_id, rented_on, price) 

开始时会有一个检查,例如

FUNCTION is_dvd_rentable(dvd_id) return boolean

确认DVD的状态不是3。

您可能想将逻辑放在触发器中,触发器可能会说“如果状态=3,则不允许完成此租赁交易”。但是如果您经常访问此站点或其他与 Oracle 相关的网站,例如asktom,你会知道业务逻辑永远不应该放在触发器中。

我建议您在图表中将实体 Purchases 和 Rentals 替换为单个 Orders 实体。

在 Orders 实体上,您放置 "purchase" 或 "rental" 的 orderType 属性。

简单的数据库约束可以强制 DVD 只能出现在一个订单行上。

所以:

客户订购了 DVD。

订单类型。