database - Oracle:处理 Flag 的最佳实践

标签 database oracle database-design relational-database

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

enter image description here

最佳答案

您不需要两个单独的标志来表示出售和出租,因为这两个状态是互斥的。如果 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/

相关文章:

python - 如何使用 Python 合并 CSV 字符串中的字段?

mysql - 如何优化 MySQL 的变更历史数据

sql - 嵌套的物化 View 找出提交时的操作?

sql-server - 使用 float 还是小数来计算会计应用程序的美元金额?

java - 我的 php 代码连接到 android 数据库

mysql - 将 MATLAB 绘图以 PNG、JPG 格式写入 MySQL 数据库

xml - 甲骨文 PL/SQL : Loop through XMLTYPE nodes

c# - 执行延迟查询来识别所有后代?

java - 使用 Oracle CachedRowSet 获取时间戳

java - JDBC 中的正则表达式