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。
订单类型。
我为一家 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。
订单类型。