关系数据库设计 - 具有多个地址的主表

时间:2018-06-04 21:09:37

标签: sql relational-database database-administration

我需要设计一个关系数据库,它将基于Q1,Q2等期间批量加载客户/地址数据。我希望创建一个简单的客户主表,其中包括地址等人口统计数据。挑战在于客户地址可能会在一段时间内发生变化,我需要捕获这些新地址,并将旧地址保留为早期的快照。

我可以轻松地将customerId / quarter设置为每行的唯一特征,但这会为地址保持不变的客户带来许多不需要的重复项。另一种选择可能是将默认季度设置为“ALL”,并仅为具有地址更新的现有客户添加新行。然后由查询/视图选择“全部”,除非指定的四分之一存在(表示更新的地址)

不确定这种情况的最佳方法,我希望其他人可能有一些建议吗?

1 个答案:

答案 0 :(得分:1)

我建议这样的设计:

  • 客户:客户ID,其他客户字段
  • 地址:地址ID,街道1,其他地址字段
  • customer_address:客户ID,地址ID,从日期开始生效,到目前为止有效

这允许以下几点:

  • 要分别捕获给客户的地址。通常,地址本身不会改变,客户与地址的关系会发生变化。这是在客户和地址之间的连接表中捕获的。
  • 在customer_address表中,您可以捕获有效日期和有效日期。这使您不仅可以捕获地址对所有季度都有效,还可以捕获客户地址的变化。它还允许不同年份的季度(例如2017年1月1日和2018年1月1日都是Q1)。
  • 拥有这样的多个表可以减少系统中重复数据的数量。

您的查询可以将这些表连接在一起,并根据customer_address表中的有效日期进行过滤。

所有这些都有意义吗?