更新时链接数据实体的完整性

时间:2010-01-24 15:26:26

标签: mysql database-design data-binding transactions definitions

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

我的方案

  1. 我有两个实体“客户端和 发票“。[客户是定义和 发票是交易]。
  2. 发出许多发票后     客户端它发生在客户端     信息需要改变     例如“他的账单地址/位置     更改或商业名称......等“。
  3. 用户必须是正常的 能够更新客户端 保持信息完整性的信息 系统中的数据。
  4. 在发票“交易实体”中 我不存储客户端ID但是 还有与之相关的所有客户信息 发票如“客户名称,地址, 联系“,这是众所周知的 存储数据的方法 交易实体。
  5. 如果用户创建了新发票     新的客户信息将是     存储在发票记录中     具有相同的客户端ID(非常     显而易见的)。
  6. 我的问题

    1. 绑定数据实体是否可以 来自不同地点的“客户” 对于插入和更新? [说明:如果我跟着 我必须从步骤1-4接近 绑定客户端实体 在创建新的情况下的客户端表 发票,但如果是 更新/打印我的发票 绑定客户端实体 发票表,否则数据 不会是一致的或整数......所以 我如何保持数据完整性 没有创建意大利面条代码 DAL来处理这个自定义 数据绑定的要求??]
    2. 我通过了一个系统     保存以前的所有版本     更新前的实体数据     “保留所有版本的历史”。     如果我想使用相同的方法     我怎么能避免自定义绑定     在数据库设计方面做到这一点     “使用MYSQL”? [解释:一些     使用1.0版创建的发票     客户端然后是客户端信息     更新,其版本变为1.1     和最后一个创建的新发票     版本......所以跟随它是好的     这种方法?我该怎么做     设计我的实体/表以满足实体的要求     版本控制和绑定?
    3. 请提供任何书籍或参考资料 这可以踢我的权利 方向?
    4. 谢谢,

3 个答案:

答案 0 :(得分:0)

您需要做的就是让桌子保持原样。您是对的,您应该将客户信息存储在发票中,以便记录物品运往何处。如果更改,您不应更新此信息,除了尚未发货的任何发票。要维护此类信息,您需要在customer表上触发一个触发器,该触发器会查找尚未发送的发票并自动更新这些地址。

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

在这种情况下,数据完整性只需通过客户ID的外键即可。 id本身不应该被用户改变或允许改变,并且应该是代理号,例如整数。因此,您不应该更改实际发票中的地址信息(除非它已经发货,在这种情况下您最好更改它或产品将被运送到错误的地方),这足以保持数据的完整性。这也允许您查看实际发货的位置,但仍然可以通过使用外键查找有关客户端的当前信息。

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

答案 1 :(得分:0)

“这是一个商业案例,其中数据必须被非规范化以保存所发送内容的历史记录。他的设计不正确。”

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

“他的设计”确实不正确......因为它正常化了!!!

这是标准化的,因为对应于发票的地址在任何时候都不是真正依赖于客户ID。

所以:正常化,是的,我确实这么认为。不是规范化是这里涉及的唯一问题。

答案 2 :(得分:-3)

我对你所得到的内容并不完全清楚,但我认为你想阅读关于规范化的内容,可以在很多关于关系数据库和SQL的书中找到。我认为你最终得到的是两张由外键连接的表格,但也许每句前面的一些反省将帮助你澄清你的想法。