2

データの整合性を維持するために、外部キーを適切に使用しようとしています。私はデータベースの専門家ではないので、私が知らない一般的な設計原則があるかどうか疑問に思っています。これが私がやろうとしていることの例です:

タイプ (乗用車、トラックなど)、メーカー、モデルを含む車両のデータベースを構築するとします。ユーザーは少なくとも Type を入力する必要がありますが、Make と Model はオプションです (Model が指定されている場合、Make は必須です)。私の最初のアイデアは、データベースを次のように設定することです。

Type:
-id (PK)
-description

Make:
-id (PK)
-type_id (FK references Type:id)
-description

Model:
-id (PK)
-make_id (FK references Make:id)
-description

Vechicle:
-id (PK)
-type_id (FK references Type:id)
-make_id (FK references Make:id)
-model_id (FK references Model:id)

タイプ、メーカー、モデルがすべて一致するようにするには、Vehicle の FK をどのように設定しますか? たとえば、車両が (Type:Motorcyle, Make:Ford, Model:Civic) を持たないようにするにはどうすればよいでしょうか? これらはそれぞれ有効な FK ですが、他のテーブルの FK によって示される関係は維持されません。

また、Model は必須ではないため、model_id FK を保存してそこから逆方向に作業することはできません。

私はデータベースの設計にまったく縛られていないので、テーブルの設定方法を変更しなければならない可能性はあります。何か案は?

PS - 誰かが興味を持っている場合、私は mysql を使用していますが、これはデータベースに関する一般的な質問です。

編集(説明):

-type_id と make_id は、model_id が null の場合にそれらを特定する方法がない限り、車両テーブルに必要です。

- type_id、make_id、および model_id の間の関係を維持する必要があります。

4

5 に答える 5

2

このような:

タイプ:

  • ID (PK)
  • 説明

作る:

  • ID (PK)
  • type_id (FK は Type:id を参照、null 以外)
  • 説明

モデル:

  • ID (PK)
  • make_id (FK は Make:id を参照します。null ではありません)
  • 説明

車両:

  • ID (PK)
  • model_id (FK 参照 Model:id)

車両からの型式と型式の重複参照は基本的にはしないでください。そんなことをすると、問題が発生します。車両のモデルからメーカーとタイプを取得できます (定義されている場合)。モデルには製造元が必要です。Make には型が必要です。

少し考えてみてください。車両に特定のモデルがあり、車両とモデルの両方にメーカーがある場合、それらの値は異なる可能性があります。この種の矛盾は、情報の冗長性が原因で発生する可能性があります。あなたはそれを一般的に避けたいです。

車両のメーカーとタイプを把握する必要がある場合、SQL は次のようになります。

SELECT v.id, v.model_id, m.make_id, k.type_id
FROM vehicle v
LEFT JOIN model m ON v.model_id = m.id
JOIN make k ON m.make_id = k.id
JOIN type t ON k.type_id = t.id

等々。

于 2009-11-13T23:41:23.640 に答える
2

探しているのは CHECK 制約です。残念ながら、MySQL は現在これをサポートしていません。このような機能をトリガーでエミュレートすることはできますが、機能させるには INSERT トリガーと UPDATE トリガーの両方を作成する必要があります。

ただし、他の回答が示しているように、実際に保存する必要があるのは車両モデルだけです。アプリケーションでは、タイプが利用可能な場合はドリルダウンする必要があります。

于 2009-11-13T23:45:32.383 に答える
1

1 つのアプローチを次に示します。-

1つのメーカー(フォード、GM、ホンダ) が多くのモデルを持つことができ、1 つのモデルは 1 つのメーカーのみに属します。 -モデルは特定のタイプ(乗用車、トラック バイク) です。 ・車両は特定の型式のものです。1 つの車両は 1 つのモデルのみです。モデルの車両が多数存在する場合があります。

モデル テーブルには、すべてのモデルに共通の列が含まれています。一方、車、トラック、およびオートバイには、それぞれ固有の列があります。

DB をモデル化するときは、データ、エンティティ、および関係を考慮してください。UI から始めないでください。物事を整理するために、間にビジネス層があります。MySQL を使用しても問題ありません。アプリケーション層にチェックと外部キーの制約を適用できます。

vehicle_model_01

于 2009-11-14T15:53:31.437 に答える
0

設計はデータの整合性に問題ありません。特定のタイプの Make と特定の Make のモデルで Vehicle を構成する必要があることを維持するのは、アプリケーションの仕事です。

データベースで車両のタイプ/メーカー/モデルの整合性を維持したい場合は、Vehicle テーブルにチェック制約を追加して、車両のメーカーのタイプ ID が提供されたタイプ ID と等しいことを確認できます。モデル ID が null でない場合は、make id が提供された make id と同じであることを確認してください。

于 2009-11-13T23:40:04.547 に答える
-1

すでに回答を受け入れているようですが、実際の構造上の問題を処理し、トリガーやチェック制約を使用しない代替アプローチは、「n/a」などの説明を使用して Make および Model テーブルにダミー エントリを作成することです。 Type と Make のエントリごとに 1 つずつ、Vehicle の冗長な列を削除します。

そうすれば、車両のタイプしかわかっていない場合は、適切なタイプを参照する Make のダミー エントリを見つけてから、その Make を参照する Model のダミー エントリを見つけて、新しい行からその Model を参照します。車両。

もちろん、主な欠点は、ダミー行を作成するための追加のハウスキーピングです。これは、Type または Make を追加する場合は事前に、またはデータが欠落している Vehicle を追加する場合はオンデマンドで行われます。

于 2009-12-09T20:10:19.330 に答える