假设我有两张桌子:
用户:
ID: PK, AI
username: varchar
pwd: varchar
addressID: FK references address.ID
地址:
ID: PK, AI
street varchar,
houseNr varchar,
postal varchar,
历史表会是什么样子,因为我们显然有外键。 要求:我们必须能够看到曾经链接到用户的所有地址。
我的看法是,如果我们更新用户,一个新条目就会进入 user_history 表。 该条目必须指向一个地址,我们不能指向地址表中的地址,因为如果情况发生变化,我们将拥有新的数据,而不是此时的数据。
因此,我在地址更新时如何看待它,我们还必须将地址复制到 address_history 表,以便我们的用户可以引用该外键以始终保持历史记录。
实际中会如何发生?
提前致谢, 亲切的问候,
在我见过的在现实数据库中实现的每种情况下,参考都是相反的:
用户:
ID: PK, AI
username: varchar
pwd: varchar
地址:
ID: PK, AI
userid: reference to User
street varchar
houseNr varchar
postal varchar
is_current bool
因此地址可能会来来去去,但给定用户使用的所有地址都会引用该用户的 ID。该用户不再使用的旧地址只需设置
is_current=false
,但记录仍然永久存在。
如果旧地址记录移至
Address_history
表中,它仍然有效;地址记录中的外键仍然通过其用户 ID 指向前所有者。
以另一种方式切换引用的另一个优点是给定用户可能拥有多个当前地址。