假设我拥有一家销售汽车和摩托车的企业。我想跟踪每个数据。我公司为每辆车提供免费保修,但我们甚至不提供摩托车保修。最初,我以为我有两张桌子 - 一辆"车辆"表格和保证"保证"表,像这样
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辆车可以共享一个保修。)
设置此数据库的正确方法是什么?
答案 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
缺点是您必须支付外部联接的价格或查询保修,以便查明车辆是否附带车辆。
如果不了解您的查询模式,很难说出什么是最好的。