用于删除引用项的常规DB实践

时间:2014-11-20 15:59:33

标签: mysql sql-server oracle database-design database-normalization

假设我有一个理论数据库,列出了一堆可以出租的汽车。经销商可以从他们的可用库存中添加\删除汽车。

在伪代码中:

[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]

还有其他选择吗?我应该注意到的任何问题吗?

0 个答案:

没有答案