0

在更新时维护链接数据实体完整性的最佳实践是什么?

我的场景

  1. 我有两个实体“客户和发票”。[客户是定义,发票是交易]。
  2. 在向客户开具多张发票后,客户信息需要更改,例如“他的帐单地址/位置已更改或公司名称……等”。
  3. 用户必须能够更新客户端信息以保持系统中数据的完整性,这是正常的。
  4. 在发票“交易实体”中,我不仅存储客户 ID,还存储与发票相关的所有客户信息,例如“客户姓名、地址、联系人”,这是在交易实体中存储数据的众所周知的方法。
  5. 如果用户创建了新发票,新的客户信息将与相同的客户 ID 一起存储在发票记录中(非常明显!)。

我的问题

  1. 可以为插入和更新绑定来自不同位置的数据实体“客户端”吗?[说明:如果我遵循步骤 1-4 中的方法,我必须在创建新发票的情况下绑定客户表中的客户实体,但在更新/打印发票的情况下,我必须从发票表中绑定客户实体否则数据将不一致或整数......那么我如何保持数据完整性而不在 DAL 中创建意大利面条代码来处理数据绑定的这种自定义要求??]
  2. 我通过了一个系统,该系统在更新“保留所有版本的历史记录”之前保存了实体数据的所有先前版本。如果我想使用相同的方法来避免自定义绑定,我该如何在数据库设计“使用 MYSQL”方面做到这一点?[解释:一些发票是用客户的 1.0 版本创建的,然后客户信息更新,它的版本变成了 1.1,新的发票是用上一个版本创建的......那么遵循这种方法是否很好?以及我应该如何设计我的实体/表来满足实体版本控制和绑定的要求?
  3. 请提供任何可以让我朝着正确方向发展的书籍或参考资料?

谢谢,

4

3 回答 3

1

你需要做的是让桌子保持原样。您是对的,您应该将客户信息存储在发票中,以了解物品运往何处的历史记录。当它发生变化时,您不应更新此信息,但尚未发货的任何发票除外。要维护此类信息,您需要在客户表上使用触发器来查找尚未发货的发票并自动更新这些地址。

如果要保存客户端信息的历史版本,正确的过程是创建一个审计表并通过触发器填充它。

在这种情况下,数据完整性只是通过客户 ID 的外键来实现。id 本身不应该改变或被用户允许改变,它应该是一个代理数字,例如一个整数。因为您不应该更改实际发票中的地址信息(除非它尚未发货,在这种情况下您最好更改它,否则产品将被运送到错误的地方),这足以保持数据完整性。这也允许您查看这些东西的实际发货地点,但仍然可以通过使用外键查找有关客户端的当前信息。

如果您有更改的客户(被其他公司收购的公司),您可以在服务器上运行一个进程来更新旧记录的客户 ID,或者创建一个表结构来显示哪些客户 ID 属于当前父 ID。如果您不是在谈论更改数百万条记录,则第一个更容易做到。

于 2010-01-25T16:15:04.020 回答
0

“这是一个商业案例,其中必须对数据进行非规范化以保留运送到哪里的历史记录。他的设计没有错误。”

很抱歉将此添加为新回复,但“添加评论”按钮仍未显示。

“他的设计”确实不正确......因为它是规范化的!

这是规范化的,因为与发票对应的地址在功能上仅依赖于客户 ID 并不总是正确的。

所以:标准化,是的,我确实这么认为。不是标准化是这里涉及的唯一问题。

于 2010-01-26T19:01:29.787 回答
-3

我不完全清楚你在做什么,但我认为你想阅读规范化,在许多关于关系数据库和 SQL 的书籍中都可以找到。我想你最终会得到两个由外键连接的表,但也许对上一句进行一些反省会帮助你澄清你的想法。

于 2010-01-24T16:23:46.733 回答