为了简化...我想了解用户EAV数据的历史,特别是指向地址的地方,但是消除冗余似乎很棘手。
地址有自己的表。
除了users表和其他实体表中的标准数据外,用户还有大量奇数数据。我打算将这些奇怪的用户数据放在EAV表中。此用户EAV数据还可以包含多个条目,这些条目指向存储在地址表中的地址。
我想记录变化的历史。
因此,当用户地址发生变化时,需要发生的事情是:
说实话,这似乎并不多,但是:
这一切似乎都是不洁净的,而不仅仅是EAV;)
答案 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)
当然,架构需要镜像您自己的地址属性结构。
这没有任何优雅的重用,但它避免了你正在努力解决的所有混乱,这种重用自然会带来。保留每个地址的完整快照将使用一些额外的空间,但它将使实际使用历史更容易。