3

フィールドの入力エラーを制限しようとしています。私が構築しているサイトには、車に関するデータが含まれています。

車には、リストから複数の機器 (エアコン、ABS、レザー シートなど) を含めることができます。データ入力のエラーを防ぐか、少なくとも最小限に抑えたいと考えています。

エラーの最初のケースは、相互に排他的な 2 つ以上の機器に対してデータが入力された場合です。たとえば、車には手動空調と自動空調と自動空調のバイゾーンを装備することはできません。それらのうちの1つだけが車に存在できます。

エラーの 2 番目のケースは、前提条件なしで機器のデータが入力された場合です。たとえば、必要な ABS なしで緊急ブレーキ アシスト (BA) に入ります。車は BA なしで ABS を持つことができますが、BA は ABS のある車にのみ存在します。

データが入力されるテーブルは簡単です。各車 ( version_id ) には、複数の機器 (トリム) またはトリム ID があります。Version_id と trim_id は、それぞれテーブル バージョンとトリムの FK です。そのため、存在しない trim_id または version_id のエラーは、テーブル versiontrim で既に処理されています。

テーブル versiontrim (データ エラーを最小限に抑えたい場所)

version_id    trim_id

テーブルのトリム:

trim_id    trim    trimtype

テーブルのバージョン

version_id    model_id    version    active    bodytype    places    motor_id    etc...

助けていただければ幸いです。

4

2 に答える 2

1
For each selected trim,
    Retrieve the set of mutually exclusive trims.
    Check if any of those are also selected.
    Retrieve the set of prerequisite trims.
    Check that each of those are also selected.
create table prerequisites (
    trim_id1 int not null references trims ( trim_id ),
    trim_id2 int not null references trims ( trim_id ),
    primary key ( trim_id1, trim_id2 )
);

create table exclusives (
    exclusive_group int not null,
    trim_id int not null references trims ( trim_id ),
    primary key ( exclusive_group, trim_id ),
    index ( trim_id, exclusive_group )
);

-- Retrieve all prerequisites of selected trims
select p.trim_id1, p.trim_id2
from versions v
inner join versiontrim vt on vt.version_id = v.version_id
inner join prerequisites p on p.trim_id1 = vt.trim_id
where v.version_id = ?;

-- Retrieve all mutually exclusive trims of selected trims
select vt.trim_id as trim_id1, e2.trim_id as trim_id2
from versions v
inner join versiontrim vt on vt.version_id = v.version_id
inner join exclusives e1 on e1.trim_id = vt.trim_id
inner join exclusives e2 on e2.exclusive_group = e1.exclusive_group
where e1.trim_id <> e2.trim_id
and v.version_id = ?;

これをさらに一歩進めて、競合を返すだけです。

-- Retrieve any missing prerequisites of the selected trims
select p.trim_id1, p.trim_id2
from versions v
inner join versiontrim vt1 on vt1.version_id = v.version_id
inner join prerequisites p on p.trim_id1 = vt1.trim_id
left join versiontrim vt2
    on vt2.version_id = v.version_id
    and vt2.trim_id = p.trim_id2
where vt2.version_id is null
and v.version_id = ?;

-- Retrieve any selected mutually exclusive trims
select vt.trim_id as trim_id1, e2.trim_id as trim_id2
from versions v
inner join versiontrim vt on vt.version_id = v.version_id
inner join exclusives e1 on e1.trim_id = vt.trim_id
inner join exclusives e2 on e2.exclusive_group = e1.exclusive_group
inner join versiontrim vt2 on vt2.version_id = v.version_id
where e1.trim_id <> e2.trim_id
and vt2.trim_id = e2.trim_id
and v.version_id = ?;
于 2013-06-30T00:11:17.297 に答える
0

これらの依存関係をデータベース レベルでモデル化する場合は、これらの各オプションを個別のエンティティとして扱う必要があります。

現在の構造は NN 関係をモデル化しているため、同じオプションを特定の に何度も関連付けることもできますversion。すべてのオプションについて、以下と同じアプローチを取る必要があります。

相互に排他的なオプションは、オプションの「タイプ」を構成します。たとえば、あなたが説明する空調オプションは「空調の種類」です。

このために、新しいエンティティを作成します (例aircond_type: ):

aircond_type:
    +----+-----------+
    | | ID | ラベル |
    +----+-----------+
    | | 1 | なし |
    +----+-----------+
    | | 2 | マニュアル |
    +----+-----------+
    | | 3 | 自動 |
    +----+-----------+
    | | 4 | バイゾーン |
    +----+-----------+

versions次に、この新しいテーブルに外部キーを追加します。

相互依存オプションに関しては、依存関係を表現するリレーショナルな方法は外部キー制約です。これは、「バージョン X にはオプション BA がある」という述語が「バージョン X にはオプション ABS がある」に依存することを意味します。つまり、これら 2 つの間の外部キー制約を使用して、独自のテーブルで各述語をモデル化することを意味します。

CREATE TABLE version_has_abs (
    version_id INT NOT NULL PRIMARY KEY,
    CONSTRAINT version_fk FOREIGN KEY version_fk_idx(version_id)
        REFERENCES version(version_id)
);

CREATE TABLE version_has_ba (
    version_id INT NOT NULL PRIMARY KEY,
    CONSTRAINT version_fk FOREIGN KEY version_fk_idx(version_id)
        REFERENCES version_has_abs(version_id)
);

これは明らかに非現実的であり、少なくとも柔軟性がありません。単純な検証トリガーは、「ABS」オプションがない場合にチェックを行い、「BA」オプションの帰属を防ぐことができます。

あるいは、この単純な 1 対 1 の依存関係の場合、「BA」オプションを「ABS」オプションのバリエーションとして扱うこともできます。このように、「標準」、「ABS」、「BA 付き ABS」の 3 つの「ブレーキ」オプションがあります。

于 2013-06-30T01:29:10.197 に答える