【问题标题】:Avoid duplicating fields across multiple tables避免跨多个表重复字段
【发布时间】:2018-09-28 03:46:04
【问题描述】:

让我简要描述一下表结构:

客户表

id | name | address_line_one | address_line_two | contact_no_one

销售发票表

id | id_Customer (Foreign Key) | invoice_no

如果我必须打印销售发票,我必须使用客户表中的客户信息(如姓名、地址)。 假设一年后,一些客户数据发生了变化(如姓名或地址),我更新了客户表中的新数据。现在,如果客户要求旧发票,它将打印新的客户数据,这在法律上是错误的。

这是否意味着,我必须创造

name_customer

address_line_one_customer

...

以及销售发票表中的所有这些字段?

如果是,是否有更好的方法从客户表中的这些字段获取数据到销售发票表,然后编写 SQL 查询来获取值,然后设置值?

【问题讨论】:

  • 嗨。 (正如人们所料:)这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。并且不要满足于评论中建议的重复。

标签: database database-design


【解决方案1】:

这完全取决于您。在某些情况下,如果它是一份法律文件,您将保存所有详细信息,以便您始终可以按照创建的方式显示它。或者,如果您正在制作 pdf 发票,则将其保存以 100% 确定。

另一种选择是创建一个 CustomerHistory 表,以便始终使用日期范围保存过去的版本,以便您可以返回旧版本。

这取决于用例,但这些是您的主要选择。

【讨论】:

    【解决方案2】:

    这听起来像是一个很容易解决的问题,只需将 Employee 表置于版本标准格式 (VNF) 中即可。这实际上只是 2nf 的一种风格,但它提供了使用相同查询查询当前数据和过去数据的能力。

    日期时间参数用于提供区别。当值设置为 NOW 时,返回当前数据。当该值设置为过去的特定日期时间值时,将返回该日期和时间的当前数据。

    详情请见here。如果您认为这对您有用,该答案还包含指向更多信息的链接。

    【讨论】:

      猜你喜欢
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多