Oracle:处理Flag的最佳实践

时间:2015-03-12 18:52:59

标签: database oracle database-design relational-database

我为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)

enter image description here

2 个答案:

答案 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。