2012-03-21 10 views
0

私は可変内容のボックスを出荷し、これをデータベースで追跡することになっています。すべてのアイテム(ボックスのコンテンツ)は異なるタイプであり、それぞれのアイテムのタイプが同じ長さのシリアル番号(PKは同じデータタイプ)を持ちますが、それぞれの情報を追跡するために異なるテーブルが必要です。私はBoxesテーブルを持っています。多対多であるが複数のテーブルから供給

各項目にはテーブル(〜7テーブル)とボックステーブルがあります。私はBoxContentsテーブルを作成したいと思います。 BoxIDItemBarcodeの2つの列を持つ多対多関係の中間テーブルを作成しようとしました。ここでBoxIDBoxesテーブルのPKに対するFKであり、ItemBarcodeはそれぞれのPKのFKです。アイテムテーブル(つまり、複数のテーブルを同じ列にリンクしようとしました)。これはうまくいきませんでした。アイテムを挿入しようとしましたが、ItemBarcodeのリレーションシップの1つを除くすべてのリレーションシップでFK制約が違反されました。

複数の種類のアイテムを1つのテーブルの1つのボックスにリンクするために、関係を構築するにはどうすればよいですか?これは論理的アプローチですか?もっと情報が必要ですか?

答えて

1

私が最初に選んだのは、ItemBarcodeの値が本当にユニークであれば、

EDIT:必要なトリガーの説明が追加されました。

  • トリガーを追加すると、バーコードの一意性が強制されます。 (各項目テーブル上の挿入/更新トリガは、全て(新たに)割り当てられたバーコードは、他の項目のテーブルに表示されないことを確認する必要がある。)
  • バーコード側のFK関係なく、単一BoxId/ItemBarcodeテーブルを使用するが、それが有効であることを確実にするためのトリガーである。 (アソシエーションテーブルの挿入/更新トリガでは、バーコードがアイテムテーブルに存在することを確認する必要があります)各アイテムテーブルの削除トリガは、関連付けテーブルにあるアイテムの削除またはカスケードを必要とします。アイテムテーブル上のバーコードを更新および変更する必要があります。この最後は、前の箇条書きの挿入/更新トリガに統合することができます)。 。

私の2番目の選択肢はn個アイテムの種類のNBoxId/ItemBarcodeのテーブルになります。簡単ですが、ちょっと忙しいです。それは、必要以上に新しいアイテムタイプを追加することになります。

BoxId/ItemTypeId/ItemBarcodeテーブルは使用しません。 ItemTypeIdItemBarcodeを再度関連付けてデータを非正規化します。バーコード側でFKを使用することはできません。また、整合性を確保するために引き続きトリガーが必要です。

トリガーを恐れないでください。彼らがかなり効果的に対処できるいくつかの問題があります。

+0

以前はトリガを使用していなかったので、挿入されたバーコードが正しいテーブルに存在していることを確認するためにどのテーブルをチェックするべきかはどのように分かりましたか?各項目のバーコードには独自の接頭辞があります。バーコードの一部を解析して別のストアドプロシージャにリダイレクトするswitch文があると思いますか? – Brad

+0

ああ!私はそれを得ると思う!私はボックスとアイテム間のリンクを作成する(つまり、boxcontentsテーブルを作成する)ときに私は、サマリーテーブルに挿入すると、私は個々のアイテムテーブルに挿入すると同時に "サマリーアイテム"に追加しない!その後、エントリは常に正しいです。 – Brad

+0

@ブラッド - アイテムをボックスに追加すると、そのアイテムのバーコードがすべてのアイテムバーコードの 'ユニオン 'にあることだけが気になります。 'union'を提供する' view 'を作ることは物事を単純化するかもしれません。トリガは_deferential_ integrity、つまりあなた自身の奇妙なバージョンの参照整合性を強制して、データを破損することはできません。 (*興味のある読者の挑戦) – HABO

0

この種の問題では、リレーショナルデータベースは良くありません。あなたの基本的なデザインは正しいです - アソシエーションテーブル間のFKのテーブル。

選択肢は次のとおりです。

  1. があなたのアソシエーションテーブルに複数の列を持っている - 各項目テーブル
  2. 私はオプション2を行くだろう

1つの項目テーブルにアイテムデータをマージするために1つ

+0

どちらの方法でも空白のフィールドがある行が表示されるように感じます。オプション1を選択すると、すべてのボックスにすべてのタイプのアイテムがあるわけではありません。オプション2を使用すると、すべてのアイテムで同じ列が必要になるわけではありません。空白のフィールドは良いアイデアではないようです。特に設計上の多くは、そうですか? – Brad

+0

あなたはおそらく、アイテムテーブルの疎なデータを持っているほうがいいでしょう。それはもっと管理しやすいですし、有限と小さな行サイズのものです。 – Bohemian

+0

うん、残念ですが、マネージャーですべてのテーブルを1つにまとめることができます。私は、アプリケーションレベルで必須/ N/Aフィールドを強制する必要があると思います。 – Brad

6

あなたは、カテゴリ階層(別名クラス階層、サブタイプ階層、継承階層...。)必要があります。3 main strategiesは、カテゴリ階層を実現するためにあります

enter image description here

を。 「1つのテーブル内のすべてのクラス」または「テーブルごとのクラス」を選択した場合、何件のアイテムがあるかにかかわらず、多対多の関係を実装するためのリンクテーブルは1つだけ必要です。

関連する問題