假设我有一个理论数据库,列出了一堆可以出租的汽车。经销商可以从他们的可用库存中添加\删除汽车。
在伪代码中:
[Dealer]:
[Id] PKEY
[Name] NVARCHAR
[Car]:
[Id] PKEY
[DealerId] FKEY to [Dealer]
[LicensePlate] NVARCHAR
客户进来并安排预订......
[Customer]:
[Id] PKEY
[Reservation]:
[Id] PKEY
[CarId] FKEY to [Car]
[Date] -- for simplicity just say that a car can only be rented for a whole day
现在说出售了一辆经营多年的汽车经销商。经销商需要移除汽车,但不希望删除所有历史预订数据。对此最好的做法是什么?
一些选项似乎是:
选项1.软删除 - 在[Car]上添加一个表示已不再可用的列
[Car]:
[Id] PKEY
[DealerId] FKEY to [Dealer]
[LicensePlate] NVARCHAR
[IsAvailable] BOOLEAN
我唯一的问题是,如果我在[LicensePlate]上有一个独特的约束,那么这意味着我无法将汽车添加到另一个经销商,除非我创建了某种*->*
关系(可能考虑到LicensePlate号可以退役并在不同的汽车上重复使用,会变得混乱。
选项2.将过去的预订转换为1NF - 无论如何都需要删除未来的预订(不能在不在经销商处的汽车上预订)。但是,过去的保留不再是保留。它们是那时的历史数据。我可以创建另一个表来处理过去没有引用[Car]的保留,而是在1NF中。
[PastReservation]:
[Id] PKEY
[DealerId] FKEY to [Dealer] -- I guess it's not entirely 1NF...
[LicensePlate] NVARCHAR
[Date]
还有其他选择吗?我应该注意到的任何问题吗?