|
|
1
0
如果您有statementHeader,那么它应该有AccountID来保持引用的完整性。 不过,最好完全删除statementHeader并将statementDate移到语句记录中。这将使事情更清楚,使模型更好地描述您想要的。 |
|
|
2
0
由于语句是历史性的,而且通常是只读的,所以某些冗余数据是可以的。我同意Richard Harrison的观点,我会把[AccountID]和[StatementDate]都移到[Statement]表中;我的理由是你说一个账户有很多分支,所以你将为一个账户生成一个报表。 将所有这些数据存储在同一个位置将减少连接并加快报告速度,我认为这是该数据库的原因。 |
|
|
3
0
有时,(真实的或感知的)冗余是业务规则的结果。在这种情况下,业务规则是:“向账户发出的报表应仅包含属于该特定账户的分行的交易。” 要强制执行该规则,可以尝试创建一个数据库架构,使其不可能违反该规则,或者使用约束或触发器显式强制执行该规则。使用statementHeader.accountID似乎更容易。在Oracle中,您可以这样写:
如果statementHeader中没有accountID,则必须与共享同一statementID的所有其他语句中的所有其他accountID进行比较,从而生成更复杂的语句序列。 因此,我将accountid作为外键保留在statementHeader中,并使用触发器显式地强制执行业务规则。 |