我该如何在数据库中存储EAV地址历史记录?

时间:2011-09-15 05:07:16

标签: database-design

为了简化...我想了解用户EAV数据的历史,特别是指向地址的地方,但是消除冗余似乎很棘手。

地址有自己的表。

除了users表和其他实体表中的标准数据外,用户还有大量奇数数据。我打算将这些奇怪的用户数据放在EAV表中。此用户EAV数据还可以包含多个条目,这些条目指向存储在地址表中的地址。

我想记录变化的历史。

因此,当用户地址发生变化时,需要发生的事情是:

  • 新地址将添加到地址表中。
  • 现在,旧的EAV条目不是指向旧地址行,而是更新为指向地址表中的新行。
  • 对EAV行的更改将写入EAV历史记录表(将使用触发器)

说实话,这似乎并不多,但是:

  • 地址表中的旧条目是否应该永久地以只读方式存在? (好吧,所以我的猜测是肯定的,清除旧记录是一个仓储考虑因素,但它似乎只是...... icky)。
  • 我怎样才能至少重复使用这些地址条目? (也许通过在新用户输入时提供匹配的现有条目)

这一切似乎都是不洁净的,而不仅仅是EAV;)

1 个答案:

答案 0 :(得分:1)

如果你想跟踪一个人的地址历史,那么EAV可能会有点“优雅”的解决方案。我假设通过EAV你的意思是地址被分成字段,每个字段都是一个属性。因此,如果某人移动,但停留在同一个城市,他们的地址线会发生变化,但他们的城市,州和ZIP(可能)保持不变。

人们一直在移动。我忘记了统计数据,但每年有16%或18%的人搬家。通常有商业原因来记录人们的地址。

如果您正在跟踪地址的历史记录,我建议您更好地保留基于快照的历史记录表并使用触发器来填充该表。您可以使用这样的架构:

ADDRESS_HISTORY
  person_key  int
, change_date datetime
, address_1   nvarchar(50)
, address_2   nvarchar(50) null
, city        nvarchar(30) 
, state       nvarchar(2)
, zip         nvarchar(10)
, primary key (person_key, change_date)

当然,架构需要镜像您自己的地址属性结构。

这没有任何优雅的重用,但它避免了你正在努力解决的所有混乱,这种重用自然会带来。保留每个地址的完整快照将使用一些额外的空间,但它将使实际使用历史更容易。