database-design - 创建订单时处理引用完整性规则的正确方法

标签 database-design

我正在设计一个数据库,其中有一个订单表。 (显然这是一家网上商店)

Orders 表还包含一个 addressId,它指向 Saved Addresses 表(客户的已保存地址)。但是,客户可以编辑他的保存的地址,这意味着如果他这样做,订单中的地址也会更改,这是错误的,因为订单 已运送到旧地址(编辑前)。

我想知道社区处理此类事情的规范是什么?

我要硬录吗? (不是指向地址,而是简单地将地址详细信息写入订单)

我是否禁止客户编辑/删除已保存的地址? (这看起来像是糟糕的用户体验,我感觉法律允许客户从我的数据库中删除个人信息)

这里的“最佳实践”是什么?

最佳答案

最好对任何金融交易进行快照,包括交易完成后的相关引用数据。审核员希望看到您的数据准确地反射(reflect)了您的业务事件。

出于实际目的,这通常意味着制定如下规则:“交易数据(例如销售)一旦确认,不得更新或删除。”

更好的是,对金融交易数据使用复式记账方式。这使您能够保留可靠的金融交易记录,同时允许您记录对历史记录的更改(例如发出贷项通知单或取消订单),而不会破坏数据库中的历史记录。

对于维度数据(例如地址),最好保留所有记录地址(而不仅仅是当前地址)的历史记录表,然后将您的订单与地址历史记录表中的相应地址版本相关联。

关于database-design - 创建订单时处理引用完整性规则的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19623956/

相关文章:

nhibernate - 使用 NHibernate 映射分区数据的方法

asp.net - 数据库关系查询

mysql - mysql 中所有类型的数值应使用哪种数据类型

ios - 关于核心数据库设计

javascript - 夏令时废除 - 我是否正确保存日期时间?

mysql - 将 Blob 存储在另一个表中或使用 mysql barracuda

mysql - 每个客户端拆分 mysql 数据库

php - 合并用户图片和帖子以显示为用户条目的最佳方式

mysql - 从多个候选键中选择

sql - 父表和子表 - 确保子表完整