web-dev-qa-db-ja.com

MySQLの1対多の関係-モデルの構築方法は?

2つのテーブルがあります。

1)エリア2)地図

各エリアには少なくとも1つのマップが必要ですが、複数のマップを持つこともできます。

1つのマップは1つのエリアにのみ属することができます。

これをMySQLで構築する方法は?

15
tellob

エリアの主キーを参照する外部キーをマップに追加します。これにより、マップとエリアの間に1対多の関係が適用されます。

エリアごとに最低1つのマップを適用すること(必要な場合)については、この投稿にいくつかのアイデアがあります here 。より簡単な解決策の1つは、マップのある領域のみを表示するビューを作成することです。

CREATE VIEW viewAreas AS
SELECT * 
FROM Areas, Maps
WHERE Areas.ID = Maps.AreaID;

このようにして、エリアを作成し、それにマップを追加できます。マップの外部キーを強制的にNOT NULLにすることもできるため、マップには常に領域が必要です。

9
Jenius
create table Area(id int primary key auto_increment, name varchar(100));

create table Map(id int primary key auto_increment, 
                 area_id int not null,
                 name varchar(100),
                 foreign key (area_id) references area(id));

SqlFiddle

MapにはAreaが必要です。area_idはnullではありません(AreaForeign keyであるため)

しかし、エリアごとに「少なくとも1つのマップ」を作成することはできません(望ましくありません)。

ある日、Areaを作成する必要があります。また、現時点ではMapはありません。または、「通常の」チェックを行って、マップのないエリアを表示します。

Areaを削除するときに、関連するMapがない場合は、Mapを削除することをお勧めします。

11

マップとエリアのそれぞれのテーブル、およびエリアにリンクするマップの外部キー。

2
user359040