販売注文ヘッダー/詳細シナリオでは、詳細テーブルに任意の主キー (ID/GUID) を設定する必要がありますか?それとも、SalesOrderHeaderID 列と ProductID 列で構成する必要がありますか?
これは、2 行または 3 行の詳細テーブルで複合一意キーを作成できるマスター/詳細シナリオの一般的な質問です。(上記の例では、注文に重複した製品を含めることはできないと想定しています)。
販売注文ヘッダー/詳細シナリオでは、詳細テーブルに任意の主キー (ID/GUID) を設定する必要がありますか?それとも、SalesOrderHeaderID 列と ProductID 列で構成する必要がありますか?
これは、2 行または 3 行の詳細テーブルで複合一意キーを作成できるマスター/詳細シナリオの一般的な質問です。(上記の例では、注文に重複した製品を含めることはできないと想定しています)。
自然な複合キーを選択し、後でデザインを変更して Order Details が別のテーブル (たとえば、出荷) の主キーになるようにした場合は、その複合キーを新しいテーブルに伝播する必要があります。その理由だけでも、任意の ID を主キーとして選択します。
また、これにより、注文に重複した製品が含まれる可能性がある将来の状況が可能になります
(この問いに対する答えは、もちろん正解のないエキュメニカルな問題です)
ID/GUID の任意の主キーではなく、自然な主キーを選択します。自然キーを使用してエントリを一意にすることができる場合は、そのルートに進みます。
したがって、基本的なテーブル構造は次のようになります。
create table order
(
order_id int -- PK
order_date datetime,
orderedby varchar(50)
);
create table products
(
productid int, -- PK
name varchar(50)
;
create table orderdetails
(
order_id int, -- PK/FK
productId int -- PK/FK
);
テーブルにidentity
列と複合キーを配置します。
設計は次のようになります。
複合キーは引き続き両方のテーブルから使用されますが、複合テーブルから選択するときに、複合テーブルが独自の ID を持っていると一貫性があり便利です (個人的には、これにより混乱が少なくなります)。
...SalesOrderHeaderID 列と ProductID 列で構成する必要がありますか?
問題の完全な説明を提供した場合は、はい。
ただし、言及していない他の基準がある可能性があり、追加の「代理」キーを優先してバランスを歪める可能性があります。
上記のシナリオでは、詳細テーブルには、SalesOrderHeaderID 列と ProductID 列で構成される主キーが必要です。とにかく、SalesOrderHeaderID を詳細テーブルに格納してインデックスを作成する必要があるため、それを主キーの一部として使用しないでください。
実際には、SalesOrderHeaderID と注文明細番号の組み合わせを主キーとして使用するのが通常です。これは、同じ注文の同じ製品に対して複数の注文明細を記録できるようにするビジネス上の理由がしばしばあるためです。