これは、私が何年にもわたって複数の場所で見たシナリオです。他の誰かが私よりも優れたソリューションに出くわしたかどうか疑問に思っています...
私の会社は比較的少数の製品を販売していますが、販売する製品は高度に専門化されています (つまり、特定の製品を選択するには、その製品に関するかなりの数の詳細を提供する必要があります)。問題は、特定の製品を選択するために必要な詳細の量は比較的一定ですが、必要な詳細の種類は製品によって大きく異なることです。例えば:
製品 X には、(仮説的に) 次のような識別特性がある可能性があります。
- '色'、
- '素材'
- 「平均故障時間」
ただし、製品 Y には特性がある可能性があります
- '厚さ',
- '直径'
- '電源'
製品 X と製品 Y の両方を利用する注文システムを作成する際の問題 (とにかくそのうちの 1 つ) は、ある時点で注文明細が「販売」しているものを参照する必要があることです。製品 X と製品 Y は 2 つの異なるテーブルで定義されているため、幅広いテーブル スキームを使用した製品の非正規化はオプションではありません (製品定義は非常に深い)。注文入力、編集、レポート作成が実用的です。
過去に試したこと
- 製品 X と製品 Y に共通の列を持つ「製品」という名前の親テーブルを作成し、次に「製品」を OrderLine テーブルの参照として使用し、製品 X のテーブル間のプライマリ サイドとして「製品」との FK リレーションシップを作成します。これは基本的に、'Product' テーブルを OrderLine とすべての異なる製品テーブル (例: Products X と Y) の両方の親として配置します。注文入力には問題なく機能しますが、「製品」レコードは、「製品」をより詳細な子である製品 X または製品に結合する方法を決定するために、製品の種類を追跡する必要があるため、注文のレポートまたは編集で問題が発生します。 Y.利点: キー関係が保持されます。 短所: レポート、注文明細/製品レベルでの編集。
- 注文明細レベルで「製品タイプ」列と「製品キー」列を作成し、いくつかの CASE ロジックまたはビューを使用して、明細が参照するカスタマイズされた製品を決定します。これは項目 (1) に似ていますが、共通の「製品」テーブルはありません。注文明細行とその製品定義の間の外部キーが完全になくなるため、これはより「迅速かつ汚い」ソリューションだと思います。利点: 迅速な解決。 短所: (1) と同じですが、RI が失われます。
- 共通のヘッダー テーブルを作成し、カスタマイズされた属性 (OrderLine [n] <- [1] Product [1] <- [n] ProductAttribute) のキーと値のペアを使用して、製品定義を均質化します。 利点: キー関係が保持されます。製品の定義に曖昧さはありません。 短所: レポート (属性を含む製品のリストの取得など)、属性値のデータ入力、パフォーマンス (製品属性の取得、製品属性の挿入または更新など)
他の誰かが別の戦略を試して成功した場合は、ぜひ聞いてみたい.
ありがとうございました。