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

Ben*_*Ben 2 sql database database-design

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

Vehicles                                                     Warranties

VehicleID, SalePrice, VehicleType, WarrantyID                WarrantyID, EffDate, ExpDate
Run Code Online (Sandbox Code Playgroud)

其中VehicleType是"汽车"或"摩托车".我的缺点是,在车辆表中,每辆摩托车的"WarrantyID"都具有空值.这会被视为不良做法吗?

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

Cars                                                         Motorcycles

VehicleID, SalePrice, WarrantyID                             Vehicle ID, SalePrice


Warranties

WarrantyID, EffDate, ExpDate
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bil*_*win 6

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

当属性与给定行中的数据类型无关时,允许列为NULL是完全普通的.NULL表示"未知,丢失或不适用的数据".


Mar*_*rvo 5

听起来你可以考虑连接表.

Vehicle              VehicleWarranty          Warranty
---------            ---------------          ----------
VehicleId            VehicleId                WarrantyId
SalePrice            WarrantyId               EffectiveDate
Run Code Online (Sandbox Code Playgroud)

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

  • 确切地说,无需将一辆车与多种保修相结合. (2认同)
  • @BenGorman如果你想支持多对多关系,即多车辆到1保修,或者1辆有多种保修的车辆,你应该采用这种方法.如果您从不希望车辆有多个保修,但多个车辆可以共享1个保修,那么正确的解决方案就是Bill's.并添加车型表(vehictyypeid in vehicles table).这将帮助您符合3NF,有助于提高数据质量并减少磁盘空间. (2认同)