2017-03-01 17 views
1

以下の2つのテーブルでジャンクションテーブルを使用せずに多対多リレーションシップを達成できますか?SQL多対多リレーションシップ

空港テーブル:

create table if not exists airports 
(
    id int not null auto_increment, 
    airport_name varchar(20) not null, 
    aeroplane_id int, 
    foreign key (aeroplane_id) references aeroplanes(id), 
    primary key (id) 
); 

飛行機表

create table if not exists aeroplanes 
(
    id int not null auto_increment, 
    aeroplane_name varchar(20) not null, 
    airport_id int, 
    foreign key (airport_id) references airports(id), 
    primary key (id) 
); 

なぜない場合は?

答えて

1

さて、はい、できますが、できません!

余分な関係がない場合は、エントリ全体のコピーが必要です。

あなたの場合:すべての空港にはゼロ(または1つ以上)の飛行機があります。すべての飛行機は1つ以上の空港にいた。 1つの関係で、これを保存するとき、あなたのデータは次のようになります。

airportId1, "airportName1", planeId1 
airPortId1, "airportName1", planeId2 
airPortId2, "airportName2", planeId1 
... 

(およびareoplanesテーブルについても同様)

これはあなたのDB内のいくつかの問題が発生します:

  1. 主キーを空港のためにあなたがあなたのデータのコピーの多くを維持し、あなたがそれらのすべてを更新することを確認する必要があります
  2. もう一意ではありません!

だからあなたのシナリオでは、より良いテーブル設計はairports_and_planes

airport(airport_id,name) 
aeroplanes(plane_id, name) 
airports_and_planes(airport_id, plane_id) 

次のようになります。

  • 両方のフィールドは、両方のフィールドは、プライマリを形成し、そのrepsectiveテーブルへの外部キー
  • ですキー一緒に!のが妥当と思われる
+0

が、私はこの点を理解することができませんでし – Abhilash28Abhi

+0

けれども、私はあなたがそれぞれのコピーを持っているという意味では、「あなたは、あなたのデータのコピーの多くを維持し、あなたがそれらのすべてを更新することを確認する必要があります」行(例:「airportId1、airportName1」)。これにより、テーブルのサイズが大幅に大きくなり、膨大な量のエントリがある場合には問題になる可能性があります。 'UPDATE'操作がある場合は、これらのコピーをすべて更新する必要があります。さもなければ、矛盾したデータがあります。 – hage

関連する問題