数据库规范化

时间:2012-10-18 02:09:48

标签: database dependencies primary-key normalization partial

我想问一个与规范化有关的问题。

我有2个PK,VIN和Reg_no。 VIN是车辆ID号,注册号是车牌号。 我有一个名为当前里程表的属性。 它是否具有部分依赖性或完全依赖于2 PK?

2 个答案:

答案 0 :(得分:1)

  

我有2个PK,VIN和Reg_no。 VIN是车辆ID号和   注册号是车牌号。

你有两个候选键。 VIN是独一无二的;板号也可能唯一。 (但这取决于你的申请。)

任何键都可以包含多个列,但是您没有一个多列键,您有一个键(VIN)或两个单独的键(VIN和板)。这没有什么不妥。

  

我有一个名为当前里程表的属性。它有部分吗?   依赖或完全依赖2 PK?

无论此表中是否只有一个或两个键,每个键只有一列。由于每个可能的键只有一列,因此不可能具有部分键依赖性。

答案 1 :(得分:0)

你可能只需要一个PK。使用VIN,因为它绝对是唯一的。注册号码可以在州/省之间“重复使用”。

您的“复合主键”将在您需要的联接表中显示。

<强> VEHICLE_TABLE

VIN                  nvarchar(50) [pk]
RegistrationNumber   nvarchar(50)
NumberOfPassengers   int
Make                 nvarchar(20)
Model                nvarchar(20)
Color                nvarchar (20)
Features             nvarchar(MAX)

<强> DRIVER_TABLE

DriverID             int [pk]
Name                 nvarchar(20)
Address              nvarchar(50)
OtherCrap            nvarchar(MAX)

<强> POSITION_TABLE

PositionID           int [pk]
Position             nvarchar(50)

<强> MAINTENANCE_TABLE

MaintenanceID        int [pk]
VIN                  nvarchar(50) [fk - VEHICLE_TABLE.VIN]
Odometer             decimal(9,2)
MaintenanceDate      DateTime

<强> STAFF_TABLE

StaffID              int [pk]
Name                 nvarchar(20)
PositionID           int [fk - POSITION_TABLE.PositionID]

<强> VEHICLE_JOIN_DRIVER_TABLE

VIN                  nvarchar(50) [cpk fk - VEHICLE_TABLE.VIN]
DriverID             int [cpk fk - DRIVER_TABLE.DriverID]

<强> VEHICLE_JOIN_STAFF_TABLE

VIN                  nvarchar(50) [cpk fk - VEHICLE_TABLE.VIN]
DriverID             int [cpk fk - DRIVER_TABLE.DriverID]
StaffID              int [cpk fk - STAFF_TABLE.StaffID]

这个答案也试图“稍微”回答你的另一个问题 What is the PK and FK i should assign to my table?