2

私は、会社の架空の車両群のデータベース モデルに取り組んでいます。4 種類の車両 (乗用車、トラック、セミトラック、バス) と 2 種類のドライバーがいます。どちらのタイプも一度に 1 台の車両しか運転で​​きず、タイプ 1 は車しか運転で​​きず、タイプ 2 は毎日 1 台の車両を運転できます。

Type 1 と Type 2 が Driver テーブルから継承され、4 つの車両タイプが Vehicle テーブルから継承されるように ER モデルをセットアップしました。私の問題は、タイプに応じてドライバーを特定の車両テーブルに接続する方法にあります。

4

2 に答える 2

1

とをセットアップしVehicleTypesますVehicles

CREATE TABLE VehicleType
( VehicleTypeID CHAR(1) NOT NULL
, VehicleTypeName VARCHAR(20) NOT NULL
, PRIMARY KEY (VehicleTypeID)
, UNIQUE (VehicleTypeName)
) ;

INSERT INTO VehicleType
  (VehicleTypeID, VehicleTypeName)
VALUES
  ('C', 'Car'),
  ('T', 'Truck'),
  ('S', 'Semi-truck'),
  ('B', 'Bus') ;

CREATE TABLE Vehicle
( VehicleID INT IDENTITY(1,1)
, VehicleTypeID CHAR(1) NOT NULL
, LicencePlate VARCHAR(20) NOT NULL
--- other stuff about a vehicle
, PRIMARY KEY (VehicleTypeId, VehicleID)
, UNIQUE (LicencePlate) 
, FOREIGN KEY (VehicleTypeId)
    REFERENCES VehicleType (VehicleTypeId)
) ;

DriverTypesDrivers: _

CREATE TABLE DriverType
( DriverTypeID INT NOT NULL
, DriverTypeTitle VARCHAR(20) NOT NULL
, PRIMARY KEY (DriverTypeID)
, UNIQUE (DriverTypeTitle)
) ;

INSERT INTO DriverType
  (DriverTypeID, DriverTypeTitle)
VALUES
  (1, 'Driver-Type-1'),
  (2, 'Driver-Type-2') ;

CREATE TABLE Driver
( DriverID INT IDENTITY(1,1) NOT NULL
, DriverTypeID INT NOT NULL
, FullName VARCHAR(40) NOT NULL
--- other stuff about a driver
, PRIMARY KEY (DriverTypeID, DriverID)
, FOREIGN KEY (DriverTypeID)
    REFERENCES DriverType (DriverTypeID)
) ;

そして最後に、さまざまなタイプのドライバーが運転できる許可された車両のタイプ:

CREATE TABLE Driver_Vehicle_Combinations
( DriverTypeID INT NOT NULL
, VehicleTypeID CHAR(1) NOT NULL
, PRIMARY KEY (DriverTypeID, VehicleTypeID)
, FOREIGN KEY (DriverTypeID)
    REFERENCES DriverType (DriverTypeID)
, FOREIGN KEY (VehicleTypeId)
    REFERENCES VehicleType (VehicleTypeId)
) ;

INSERT INTO Driver_Vehicle_Combinations
  (DriverTypeID, VehicleTypeID)
VALUES
  (1, 'C'),
  (2, 'C'),
  (2, 'T'),
  (2, 'S'),
  (2, 'B') ;

特定の日に誰がどの車両を実際に運転したかを保存する場合:

CREATE TABLE Driver_Schedule
( DriverID INT NOT NULL
, DriverTypeID INT NOT NULL
, ScheduleDate DATE NOT NULL
, VehicleID INT NOT NULL
, VehicleTypeID CHAR(1) NOT NULL
, PRIMARY KEY (DriverID, ScheduleDate)
, UNIQUE (VehicleID, ScheduleDate)         --- If a vehicle is allowed to be
                                           --- driven by only one driver each day
, FOREIGN KEY (DriverTypeID, DriverID)
    REFERENCES Driver (DriverTypeID, DriverID)
, FOREIGN KEY (VehicleTypeId, VehicleID)
    REFERENCES Vehicle (VehicleTypeId, VehicleID)
, FOREIGN KEY (DriverTypeID, VehicleTypeId)      --- this ensures than no driver
    REFERENCES Driver_Vehicle_Combinations       --- gets to drive a vehicle that
              (DriverTypeID, VehicleTypeId)      --- is not allowed to
) ;

SQL-Fiddleでコードをテストできます。ER図は次のようになります。

ER図

于 2013-01-21T17:28:09.177 に答える
0

リレーショナル データベースではなく、OOP の観点から考えているようです。リレーショナル データベースは、継承などのオブジェクト指向の概念を実際にはサポートしていません。ドライバー用に 1 つ、車両用に 1 つのテーブルを用意します。どのドライバーがどの車両を運転できるかに関するルールはビジネス ロジックであり、コードで定義する必要があります。

複数の車両テーブルと複数のドライバー テーブルがあると、データベースの使用が非常に難しくなります。

于 2013-01-21T16:37:12.247 に答える