我有一个表来维护特定的业务交易,我们称之为LOANS
。每个记录可以在任何给定时间具有几个“状态”中的一个,例如“在重新支付/开放”,“默认”,“无效”或“支付”中。如何表示当前状态或状态并保持数据/参照完整性? - 数据库设计
记录的状态只能由于应用程序用户采取的“事件”或行动而改变(某些事件不会导致状态改变,例如付款会修改记录但不会改变状态) 。在跟踪当前状态的同时,我们还可以轻松跟踪将事务置于此状态的“事件”。
我看过其他数据库的设置,使得LOANS
包含一个状态列,并且使用一个字母(或者甚至是一个可能状态表的外键)来指定当前状态。然后EVENTS
表的列有一个FK
到LOANS
。
该解决方案有效,但我担心这会导致数据完整性可能丢失。换句话说,没有什么可以阻止状态被设置为“默认”,没有EVENT
来支持这种改变。它将完全留给应用程序来确保永远不会发生(在我看来,这个解决方案没有参照完整性)。
我的替代解决方案是取消LOANS
中的状态列,而是使用lastEvent
列,该列是FK到EVENTS
。然后表格将保持事件的“类型”,这将反过来描述状态变化(例如,如果lastEvent
是“付款”类型,那么自然状态是“付费”)。
我的问题是:
- 应我甚是关心数据的完整性(这是这样做的,因为它是确定做一个平常的事)?
- 是我提出的解决方案,还是有更好的解决方案?
- 我应该知道我的解决方案中是否有任何缺陷?
在它的事项的情况下,我使用MS SQL Server 2005的
有些事件不会改变状态,这是我选择反观刚看到最后一个事件的一个原因(但也许我可以推断出不改变状态的事件需要开始的初始状态)。另一个原因是,我想可能在lastEvent中存储它会比每次我想要某个特定状态的所有项目(这种类型的调用将会发生很多)时调用MAX(日期)更快。 – LittleTreeX
将更新答案以解决这些问题... –