Kon*_*rad 7 schema database-design denormalization
我想存储发票数据,如人员地址。但问题是地址会随着时间的推移而改变——例如,有人会搬出去改变他的地址。存储此类数据的问题出现了,因为我们无法更改某些发票上引用的数据。
我有 3 个表:(AddressInfo
包含 StreetAddress 等),Person
它们与AddressInfo
, 和Invoice
表具有一对多关系。
我有两个解决方案,但我不确定哪个方向是正确的方法:
创建AddressInfo
并使其可软删除,添加一些类似的列IsActive
,IsDeleted
以便我的Invoice
表可以通过其 ID 引用此地址信息,并且保证保持不变,除非有人在不使用我的应用程序的情况下直接更改此数据。
因此,当有人更改他的地址时,我会软删除(也许应该称为软更新?)当前地址并添加新地址,而根本不会触及旧记录。最好先检查一下发票上是否引用了它以防止污染。
我的Invoice
桌子看起来有点像:
| InvoiceId | AddressInfoId |
将所需的列添加AddressInfo
到我的Invoice
表中。每次创建新发票时,我都必须复制数据,地址不会经常更改,重复记录会稍微污染我的数据库。
我的Invoice
表看起来有点像(大大简化):
| InvoiceId | StreetAddress |
您是否有使用解决此特定问题的数据库(可能是某些 ERP 软件)的经验?
有趣的朗读:
我看到的解决方案是将地址数据复制到InvoiceHeader
表中。这是冗余,但无害*。不会发生更新异常,因为发票上的地址以后不应更改。
关于将产品价格数据复制到InvoiceDetail
表格中,可以提出类似的观点。
* 更新异常仅在有害冗余时发生。尽管如此,如果客户地址在稍后时间点在客户表中发生变化,但在InvoiceHeader
表中保持不变,那么它们将不再是多余的。