2

假设我拥有一家销售汽车和摩托车的企业。我想跟踪每个数据。我公司为每辆车提供免费保修,但我们甚至不为摩托车提供保修。最初,我以为我会有两张桌子——一张“车辆”表格和一张“保修”表格,就像这样

Vehicles                                                     Warranties

VehicleID, SalePrice, VehicleType, WarrantyID                WarrantyID, EffDate, ExpDate

其中 VehicleType 是“汽车”或“摩托车”。我的缺点是,在 Vehicles 表中,每辆摩托车的“WarrantyID”都有一个空值。这会被认为是不好的做法吗?

我考虑过的另一种方法是使用三个表,例如

Cars                                                         Motorcycles

VehicleID, SalePrice, WarrantyID                             Vehicle ID, SalePrice


Warranties

WarrantyID, EffDate, ExpDate

我的缺点是我将摩托车和汽车分成两张几乎相同的桌子。(实际上,他们会有更多的字段,如购买成本、里程等)。唯一的区别是所有汽车都有保修,没有摩托车有保修。

(注意:我还假设 2 或 3 辆车可以共享一个保修。)

设置此数据库的正确方法是什么?

4

5 回答 5

6

将摩托车和汽车存放在同一张桌子上。

当属性与给定行中的数据类型不相关时,允许列为 NULL 是完全正常的。NULL 表示“未知、缺失或不适用的数据”。

于 2013-06-03T19:11:50.280 回答
5

听起来你可以考虑一个连接表。

Vehicle              VehicleWarranty          Warranty
---------            ---------------          ----------
VehicleId            VehicleId                WarrantyId
SalePrice            WarrantyId               EffectiveDate

这样,您的 Vehicle 表中就没有保修 ID,因此您不必处理空值。如果您对车辆有保修,则保修表(和 VehicleWarranty 表)中只有一个条目。此外,连接表允许您将相同的保修附加到多辆汽车,或将同一辆车附加到多个保修。

于 2013-06-03T19:12:34.960 回答
1

没有合适的方法,两种方法都有效。这取决于业务的全部内容。

是关于车辆吗,即应用程序中的很多东西都与车辆有关,而不关心它是汽车还是摩托车,那么您可能想要一张桌子。

但是,如果大多数业务处理其中一个或另一个而不是两者,则完全有可能拥有单独的表,可能具有将两者结合起来的视图。

于 2013-06-03T19:14:00.167 回答
1

这取决于您要在桌子上进行的用途。

如果您要查询混合车辆列表,那么您应该选择第一个模型。

但如果你不打算混合它们,你可以使用第二个。

我会选择第一个,因为它可以让您将来为自行车提供保修。

于 2013-06-03T19:14:08.830 回答
0

如果某些车辆的保修是可选的并且您的假设不是必需的,您可以将 FK 放在保修表中。以下还假设车辆和保修(如果存在)之间存在一对一的关系。

Vehicle              Warranty
---------            ---------------
VehicleId            VehicleId
SalePrice            EffectiveDate

缺点是您必须支付外部连接或查询保修的费用才能确定车辆是否配备。

在不了解您的查询模式的情况下,很难说出什么是最好的。

于 2013-06-03T19:27:07.137 回答