关系数据库设计 - Master table 具有多个地址
Relational DB Design - Master table with multiple addresses
我需要设计一个关系数据库,该数据库将根据 Q1、Q2 等时期批量加载 customer/address 数据。我希望创建一个简单的客户主数据 table,其中包括人口统计信息,例如地址。挑战在于客户地址可能会随着时间的推移而变化,我需要捕获这些新地址并保留旧地址作为早期的快照。
我可以轻松地为每一行制作 customerId/quarter 独特的特征,但是对于地址保持不变的客户来说,这会导致许多不必要的重复。另一种选择是将默认季度设置为 'ALL',并且只为具有地址更新的现有客户添加新行。然后它将取决于 query/view 到 select 'ALL' 除非指定的季度存在(表示更新的地址)
不确定这种情况的最佳方法,我希望其他人可以提供一些建议?
我建议这样设计:
- customer:客户ID,其他客户字段
- 地址:地址ID,街道1,其他地址字段
- customer_address: customer ID, address ID, valid from date, valid to date
这允许做几件事:
- 要分别为客户捕获的地址。通常,地址本身不会改变,客户与地址的关系会改变。这是在客户和地址之间的联接 table 中捕获的。
- 在customer_address table中,您可以捕获有效起始日期和有效截止日期。这使您不仅可以捕获一个地址对所有季度都有效,还可以捕获客户地址的变化。它还允许不同年份的季度(例如,2017 年 1 月 1 日和 2018 年 1 月 1 日都是第一季度)。
- 像这样拥有多个 table 会减少系统中重复数据的数量。
您的查询可以将这些 table 连接在一起,并根据 customer_address table.
中的有效日期进行过滤
所有这些都有意义吗?
我需要设计一个关系数据库,该数据库将根据 Q1、Q2 等时期批量加载 customer/address 数据。我希望创建一个简单的客户主数据 table,其中包括人口统计信息,例如地址。挑战在于客户地址可能会随着时间的推移而变化,我需要捕获这些新地址并保留旧地址作为早期的快照。
我可以轻松地为每一行制作 customerId/quarter 独特的特征,但是对于地址保持不变的客户来说,这会导致许多不必要的重复。另一种选择是将默认季度设置为 'ALL',并且只为具有地址更新的现有客户添加新行。然后它将取决于 query/view 到 select 'ALL' 除非指定的季度存在(表示更新的地址)
不确定这种情况的最佳方法,我希望其他人可以提供一些建议?
我建议这样设计:
- customer:客户ID,其他客户字段
- 地址:地址ID,街道1,其他地址字段
- customer_address: customer ID, address ID, valid from date, valid to date
这允许做几件事:
- 要分别为客户捕获的地址。通常,地址本身不会改变,客户与地址的关系会改变。这是在客户和地址之间的联接 table 中捕获的。
- 在customer_address table中,您可以捕获有效起始日期和有效截止日期。这使您不仅可以捕获一个地址对所有季度都有效,还可以捕获客户地址的变化。它还允许不同年份的季度(例如,2017 年 1 月 1 日和 2018 年 1 月 1 日都是第一季度)。
- 像这样拥有多个 table 会减少系统中重复数据的数量。
您的查询可以将这些 table 连接在一起,并根据 customer_address table.
中的有效日期进行过滤所有这些都有意义吗?