2つのデザインを考えています。あなたたちにとってどちらがより最適かを確認したかったのです。
したがって、offer_type と offer_type_filter という 3 つのテーブルがあります。
テーブルのオリジナルデザイン
オファー
id int(10) unsigned
code varchar(48)
offer_type_id int(10) unsigned
start_date datetime
exp_date datetime
value int(10)
updated timestamp
created datetime
offer_type
id int(10) unsigned
name varchar(48)
condition varchar(512)
offer_type_filter
id int(10) unsigned
filter_type varchar(20)
filter_value varchar(50)
offer_type_id int(10) unsigned
ご想像のとおり、オファーにはタイプがあり、フィルターはオファーが適用される特定のケースを指定します。ご不明な点がある場合は、offer_type.condition は主に最小購入で 20 ドル引きです。300ドル。Offer_type_filter は、このオファーをマクドナルドなどにのみ適用します。オファーはフィルターなしで存在できます。
現在の設計の 1 つの問題は、新しいオファーを作成するたびに、タイプが同じであっても、offer_type で重複するエントリを作成し、そのタイプを offer_type_filter で使用する必要があることです (現在のタイプを使用すると、既存のオファーが台無しになります)。
したがって、データベースの再設計に関しては、offer_type が offer_type_filter に存在してはならないことは明らかであるため、このようなものに変更する必要があると確信しています。
再設計 (offer_type_filter を廃止し、新しいテーブル フィルターを作成します。基本的には、より適切なものに名前を変更しています)
フィルター
id int(10) unsigned
filter_type varchar(20)
filter_value varchar(50)
filter_type_set_id int(10) unsigned
他のテーブルについては、これら2つのオプションを考えています
オプション 1 (再設計の offer_type_filter + 元の設計と同じ他のテーブル)
オファー
id int(10) unsigned
code varchar(48)
offer_type_filter_mapping_id int(10) unsigned
offer_type_filter_mapping
id int(10) unsigned
filter_type_set_id int(10) unsigned > from Filter table
offer_type_id int(10) unsigned
最初の設計を選択すると、offer_type_filter_mapping に冗長なエントリが作成されます。フィルターを持たないオファーの場合、offer_type_filter_mapping には、filter_type_set_id が null の offer_type_id のエントリーが含まれます。また、作成するタイプごとに、マッピング テーブルにエントリを配置する必要があります。だから私はデザインのこの側面が好きではありません。
オプション 2 (再設計の offer_type_filter + 元の設計と同じ他のテーブル)
オファー
id int(10) unsigned
code varchar(48)
filter_type_set_id int(10) unsigned > from Filter table
オプション 2 にたどり着いたのは、この場合、各オファーに冗長な filter_type_set_id があり、私の場合、オファー テーブルが巨大だからです。
どのデザインが最も痛みが少ないと思うかについて、あなたの批評を求めました. 頻繁な使用例: フィルターの有無にかかわらず、多くのオファーを作成します。すでに 40 ~ 50 のオファー タイプがあります。タイプ テーブルはすべてのシナリオをカバーできないため、10% の確率で新しいタイプを作成します。
また、私は Spring と Hibernate を使用しているので、その観点から私のデザインの制約がどうなるかを考えることができます。
PS mysql では、offer_type_filter のようにテーブルごとに 2 つの ID を生成するのは便利ではないことを追加するかもしれませんが、私はそれについて考えています。生成にダミー テーブルを使用するか、外部で生成された ID を使用する可能性があります。