1

次のデータを保存するためのベスト プラクティスは何かを知る必要があります。

複数のガレージがあるとしましょう。各ガレージには、まったく異なる属性 (飛行機、戦車、船、バイクなど) を持つさまざまな種類の車両が保管されています。1 つのガレージにあるすべての車両について、その属性を含めてクエリを実行する必要があります。

このデータを 1 つのユニバーサル クエリで保存してクエリを実行する場合、どのような方法がよいでしょうか? すべての車両を 1 つのテーブルに格納し、考えられるすべての属性を使用しますか? または、特定のタイプの車両ごとに複数のテーブルを作成しますか? では、1 つのガレージのすべての異なる車両を、どのタイプであるかを知らずに照会するにはどうすればよいでしょうか?

このようなことは、単一のクエリでも可能ですか? または、データを取得するために複数のクエリを作成する必要がありますか?

私が達成しようとしていることを理解していただければ幸いです。

4

4 に答える 4

1

私はこのようなことをします:

テーブル ガレージ – ガレージ ID、名前、その他のもの

テーブル Vehicle – VehicleId、VehicleTypeId、その他のもの

テーブル VehicleType – VehicleTypeId、Type、その他のもの

テーブル属性 – AttributeId、AttributeName、その他のもの

テーブル VehicleAttribute – VehicleId、AttributeId、Value、その他のもの

テーブル VehicleGarage – VehicleId、GarageId、DateIn、DateOut など

ガレージ内のすべての車両と属性を取得するためのクエリ

select v.vehicleId
, vt.type
, a.attributename
, va.value
from VehicleGarage vg join Vehicle v on vg.VehicleId = v. VehicleId
join VehicleType vt on v.VehicleTypeId = vt.VehicleTypeId
join VehicleAttribute va on v.VehicleId = va.VehicleId
join Attribute a on va.AttributeId = a.AttributeId
where garageId = 1

テーブルの場合、CreatedWhen、CreatedBy などの他のものがあります。

于 2013-02-09T20:56:40.007 に答える
1

これは確かに可能ですが、データモデルを作成する際の計画が必要です。

すでに述べたように、サブタイプとスーパータイプの関係 (継承) を実装するにはさまざまな方法があります。

1.) オールインワンテーブル

この場合、私はあなたの問題を次のようにモデル化します:

Garage(GarageId_PK, Name)
Vehicle(VehicleId_PK, LicenceNr, GarageId_FK, SomethingOnlyCarsHave, SoemthingOnlyMortorbikesHave, Type)

タイプの場合、ID を指定し、ID を名前に関連付けるか、そこに名前を書き込むだけの別のテーブルを用意できます (あまりクリーンなソリューションではありません!)。ところで、複数の継承が必要な場合 (乗り物には必要ないと思います)、Type をビットマスクにすることもできます。

個人的にはこのアプローチはあまり好きではありませんが、これを行うことはまったく問題ありません。Oracle ie は、研究資料でこれを示唆しています。また、1 つのクエリの問題に対するより簡単な解決策です。

SELECT *
FROM Vehicle v
INNER JOIN Type t ON (v.Type = t.TypeId)
WHERE GarageId = 42

2.) 各サブタイプの表

私には、NULL 値が少ないため、これはよりクリーンなソリューションのように感じますが、1 つのクエリですべてを取得するにはもう少し作業が必要です。

Garage(GarageId_PK, Name)
Vehicle(VehicleId_PK, LicenceNr, GarageId_FK)
Car(VechicleId_PK_FK, SomethingOnlyCarsHave)
Motorbike(VechicleId_PK_FK SoemthingOnlyMortorbikesHave)

これにより、理論的には複数の継承が可能になり、サブタイプのみを許可するトリガーを作成する必要があります。

この場合の SQL:

SELECT *
FROM Vehicles v
     LEFT JOIN Car c ON(v.VehicleId = c.VehicleId)
     LEFT JOIN Motorbike m ON (v.VehicleId = m.VehicleId)
WHERE GarageId = 42

または、より多くのタイプがある場合は、醜いものをビューに入れることができます:

CREATE OR REPLACE View v_allVehicles AS
(SELECT *
 FROM Vehicles v
      LEFT JOIN Car c ON(v.VehicleId = c.VehicleId)
      LEFT JOIN Motorbike m ON (v.VehicleId = m.VehicleId)

SELECT *
FROM v_allVehicles

編集:

表記について: 名前の後ろに _PK を付けると、列が主キーであることを示します。_外部キーへの FK。

于 2013-02-09T16:59:09.077 に答える
0

あなたは見えるモデルを持つことができます

vehicle_type(vehicle_type_id, description, PK(vehicle_type_id));
 (1, 'bike'; 2, 'plane', ..etc);

vehicle(vehicle_id, vehicle_type_id (FK to  vehicle_type),
 [common attributes], PK(vehicle_id), 
  UNIQUE(vehicle_id,vehicle_type_id ) 
);

bike(vehicle_id,vehicle_type_id , [bike attributes], 
  PK(vehicle_id,vehicle_type_id),
  FK(vehicle_id,vehicle_type_id ) to vehicle, 
  CHECK(vehicle_type_id=1));

plane(vehicle_id,vehicle_type_id , [plane attributes], 
PK (vehicle_id,vehicle_type_id),
  FK(vehicle_id,vehicle_type_id ) to vehicle,
  CHECK(vehicle_type_id=2) 
);

garage(garage_id, name, ..., PK (garage_id));

garage_vehicle(garage_id - FK to garage, 
 vehicle_id - FK to vehicle, PK(garage_id,vehicle_id)
);
于 2013-02-09T16:55:50.893 に答える
0

セパレートテーブルガレージは可能な限り全てのガレージを収納できます。次に、可能なすべての組み合わせですべての車両を Vehicles テーブルに格納します。車両テーブルに、参照する外部キー列を追加します

create table vehicle(column1,column2...,garageid foreign key references garage)

次に、単一のガレージ内のすべての車両を選択するために、車両テーブルをクエリできます

select * from vehicle where garage='garage_value'
于 2013-02-09T16:56:48.343 に答える