【发布时间】:2016-01-09 05:45:02
【问题描述】:
所以给定一个看起来像这样的表结构:
Order_date DATE
Order_id NUMBER
State VARCHAR2(16)
...
other properties/attributes
请记住,我可以在此处使用整数序列并生成 PK,但由于我在主应用程序中使用此表的方式,我对此并不感兴趣。
所以复合键由 Order_date、Order_id 和 State 组成。这种组合的问题在于它不一定是唯一的,但它在某种程度上受到了限制。
例如:
Order_date | Order_id | State
21-09-2014 7218821 Pending
22-09-2014 2771272 Pending
20-09-2014 3277127 Approved
13-08-2014 2218765 Done
13-08-2014 2218765 Cancelled
约束:
- 无法将相同的 order_date 和 order_id 和状态 Done 在此重复
- 可以有任意数量的相同 order_date 和 order_id 具有任何其他状态而不是 Done
- 您不能添加状态为 DONE 或 ERROR 的记录
- 您无法通过绕过其自然顺序(已注册 -> 待处理 -> 已批准 -> 完成 | 取消 | 错误)从一种状态跳到另一种状态
对我来说,为 Oracle 数据库实现这些约束的最佳方式是什么?
【问题讨论】:
-
我会考虑业务规则是否应该作为约束来实现
-
为什么不呢?这是我将应用程序逻辑与一些基本的已知约束分开的一种方式。很适合测试。
-
我发现很难理解这个表代表什么实体。是否会更改订单状态?或者客户是否在不同日期向订单添加额外说明,并跟踪每个添加的状态?
标签: sql oracle database-design data-modeling