如何为此方案正确设计数据库架构

时间:2013-06-03 19:07:24

标签: sql database database-design

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

Vehicles                                                     Warranties

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

其中VehicleType是" car"或"摩托车"。我的缺点是,在“车辆”表中,每辆摩托车的“保修ID”都是空值。这会被视为不良做法吗?

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

Cars                                                         Motorcycles

VehicleID, SalePrice, WarrantyID                             Vehicle ID, SalePrice


Warranties

WarrantyID, EffDate, ExpDate

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

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

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

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

听起来你可以考虑加入表。

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

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

答案 2 :(得分:1)

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

是否涉及车辆,即应用程序中的很多东西涉及车辆,如果它不是汽车或摩托车,那么你可能需要一张桌子。

但如果大部分业务都与其中一方交易,而不是两者兼而有之,那么完全有可能有单独的表,可能还有一个结合两者的视图。

答案 3 :(得分:1)

这取决于您将要对表格进行的操作。

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

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

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

答案 4 :(得分:0)

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

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

缺点是您必须支付外部联接的价格或查询保修,以便查明车辆是否附带车辆。

如果不了解您的查询模式,很难说出什么是最好的。