私が始める前に、私は 『ガス』は、燃料や種類のいずれかを記述していることを指摘したいですエンジンの、一種のセダンではない。あなたがこの道を歩いて行く前に、一生懸命考えましょう。 (セマンティクスは、ほとんどの人が考えるよりもデータベース設計において重要です。)
あなたがしたいことは、かなりシンプルですが、必ずしも簡単ではありません。この種のスーパータイプ/サブタイプ設計(排他的アークとも呼ばれます)の重要な点は、セダンについての行がセミ・トラックなどについて行を参照することを不可能にすることです。
MySQLはコードをより冗長にし、 CHECK制約を強制しないためです。幸運ですね;アプリケーションでCHECK制約は、追加の表と外部キー制約に置き換えることができます。コメントは、SQL の上のを参照してください。
create table vehicle_types (
veh_type_code char(1) not null,
veh_type_name varchar(10) not null,
primary key (veh_type_code),
unique (veh_type_name)
);
insert into vehicle_types values
('s', 'Semi-truck'), ('c', 'Car');
これは、他のプラットフォームでCHECK制約として実装することができる種類のものです。コードの意味がユーザーに明らかな場合は、これを行うことができます。私はユーザーが知りたいと思うか、または 's'は半期用で、 'c'は自動車用です、またはビュー/アプリケーションコードはユーザーからコードを隠すことになると思います。
create table vehicles (
veh_id integer not null,
veh_type_code char(1) not null,
other_columns char(1) default 'x',
primary key (veh_id),
unique (veh_id, veh_type_code),
foreign key (veh_type_code) references vehicle_types (veh_type_code)
);
UNIQUE制約は、列{veh_id、veh_type_code}一対の外部キー参照のターゲットとすることができます。つまり、「car」行は誤って「semi」行を参照することはできません。
insert into vehicles (veh_id, veh_type_code) values
(1, 's'), (2, 'c'), (3, 'c'), (4, 'c'), (5, 'c'),
(6, 'c'), (7, 'c');
create table car_types (
car_type char(3) not null,
primary key (car_type)
);
insert into car_types values
('Van'), ('SUV'), ('Sed');
create table veh_type_is_car (
veh_type_car char(1) not null,
primary key (veh_type_car)
);
何か他のプラットフォームでCHECK制約として実装します。 (下記参照)
insert into veh_type_is_car values ('c');
これまでに1つの行しかありませんでした。
create table cars (
veh_id integer not null,
veh_type_code char(1) not null default 'c',
car_type char(3) not null,
other_columns char(1) not null default 'x',
primary key (veh_id),
unique (veh_id, veh_type_code, car_type),
foreign key (veh_id, veh_type_code) references vehicles (veh_id, veh_type_code),
foreign key (car_type) references car_types (car_type),
foreign key (veh_type_code) references veh_type_is_car (veh_type_car)
);
veh_type_codeのデフォルト値は、veh_type_is_carを参照する外部キーと一緒に、この表では、この行が唯一の車についても、そして車ですのみ参照車をできることを保証します。他のプラットフォームでは、列veh_type_codeをと宣言しています。あなたがなどgas_sedans、diesel_sedans、としてセダンを参照する追加のテーブルを構築する必要がある場合
insert into cars (veh_id, veh_type_code, car_type) values
(2, 'c', 'Van'), (3, 'c', 'SUV'), (4, 'c', 'Sed'),
(5, 'c', 'Sed'), (6, 'c', 'Sed'), (7, 'c', 'Sed');
create table sedan_types (
sedan_type_code char(1) not null,
primary key (sedan_type_code)
);
insert into sedan_types values
('g'), ('d'), ('h'), ('e');
create table sedans (
veh_id integer not null,
veh_type_code char(1) not null,
car_type char(3) not null,
sedan_type char(1) not null,
other_columns char(1) not null default 'x',
primary key (veh_id),
foreign key (sedan_type) references sedan_types (sedan_type_code),
foreign key (veh_id, veh_type_code, car_type) references cars (veh_id, veh_type_code, car_type)
);
insert into sedans (veh_id, veh_type_code, car_type, sedan_type) values
(4, 'c', 'Sed', 'g'), (5, 'c', 'Sed', 'd'), (6, 'c', 'Sed', 'h'),
(7, 'c', 'Sed', 'e');
は、その後、あなたは「veh_type_is_car」と彼らに設定外部キー参照に似て1行のテーブルを構築する必要があります。
製造において、私はベーステーブル上の権限を取り消すと、いずれかの挿入および更新、または挿入および更新を行うための
ストアドプロシージャを実行するために
最初のステップは、デザインがそれぞれのケースごとに非常に異なるため、このデータベースの主な(最も使用されている)操作は何かを判断することです。それは将来的に成長するでしょうか?もしそうならどれくらい?何人のクライアントがデータベースに問い合わせますか?どのくらいの頻度で ?これらはあなたが知る必要があるちょっとした質問です – Stephan
@Stephan - データは将来的には100kに成長するでしょう。私の主な操作はREADです。クライアントに関しては、かなり多くの人がdbで作業するでしょう! – Cristian
あなたが意図したスキーマ内の問題は、データが「非常に」正規化されているために読み込まれています...あなたが以前にいくつかのセダンを取得しなければならない場合、それは多くのユーザーにとっても問題ではありません。私はInnoDBエンジンを使用することをお勧めします.URLアプリケーションの2つの重要な機能があります:トランザクションサポートと行レベルロック – Stephan