SQL数据库设计 - '标记'字段/重复记录

时间:2017-05-20 11:59:05

标签: postgresql database-design

我遇到过两种情况,即'标记'字段(/复制它们)看起来会使处理变得更加简单,并且在这两种情况下,它都是“正在使用”记录之间的区别通过某种东西而不是“归属”某种东西。

这可能没有多大意义,所以这里有一些例子:

示例1:地址

地址可能属于'a:

  • 用户
  • 地点
  • 供应商

它可能被'a:

使用
  • 顺序
  • 预订

如果不是允许订单/预订引用现有地址,我总是复制地址(在地址表或其他地方),以便订单/预订实际上也是“所有者”(意思是< em>任何地址只有一个所有者),系统逻辑非常简单:地址的所有者可以随意更新/删除。不幸的是,这也意味着通常没有充分理由(最终)使用更多的存储空间。

否则,每次对锁定行进行更改时,都需要一个“软删除”和“行锁定”系统并创建新行。

示例2:服务

(与第一个例子类似)

服务(service_type,duration,max_clients,cancellation_notice_required,price)'属于'a:

  • 用户

可能会被'a:

使用
  • 预订

因此,如果我没有“预订”预订中的服务详细信息,并且预订得到更改,则每次对与a对应的任何字段进行更改时,我都必须在“服务”表中添加一个条目。服务(或者有一些逻辑来确定何时更新)。

问题

'标记'字段/重复记录是个好主意吗?对这类问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你会在事情发生时(例如预订)存储某事物(地址或服务)的当前价值。

这是非常合理的,绝对是处理缓慢变化的维度的一种可行方法。它确实需要在每次预订中存储大量不必要的信息。另一种方法是在地址/服务上使用有效和结束日期,以便所有版本都在一个地方。

在您的情况下,这是否是一个好主意,取决于您不会触及的其他因素,例如表格的基数,更改的频率,查询的类型以及记录的宽度

我应该注意别的。供应商,场所和供应商的地址可能看起来相同,但它们可能不同。例如,供应商可能有账单地址和送货地址,每个地址都有特殊说明。场地可能有空间可以组合。