2009-03-06 12 views
3

以外のものを定義する必要があります多対多の関係は次のようにあなたは、一般的な関係を持っていると思います多対多の関係の典型的な製品/カテゴリを撮るの関係

table -- ProductsCategories 
column - ProductId 
column - CategoryId 

は、それが病気に助言されますその関係に他の特性を加えること、その特定の関係上にのみ存在すること。このような(私は例が得意ではないよ、私のひどい例を許してください)のように:多くの関係

table -- ProductsCategories 
column - ProductId 
column - CategoryId 
column - DiscountForProductsInThisCategory 
column - CategoryImageForProductsInThisCategory 

答えて

6

多くは、単に多くの関係に2 1と表で、2つの関係を持つ3つのテーブルと考えますリレーションシップとデータが関連付けられた2つのテーブルではなく、実装に違いはありません。

いずれにしても、それは完全に受け入れられます。

0

私はこのテーブルに他のフィールドを追加することはまったく問題だと思います。私が行ったことの1つの例は、通常、タイムスタンプフィールドを追加して、2つのエントリーの間に関係が作成されたことを知ることです。

5

もちろんこの情報を保存することができます。それ以外の場合は正規化されません。

+0

+1:また、「上位の」関係もあります。 3-wayリレーションシップ(中間テーブルが2つ以上のFKを持ち、属性を持つ場合など)。 –

+0

+1。これらのプロパティが2つ(またはそれ以上)の外部キーの一意の交差点に依存している場合、それらは適切な場所です。 –

+0

これらの2つのフィールドは、まだ正規化されている間にカテゴリテーブルに格納することができます。彼らの名前は 'x ... InThisCategory'なので、Categoryに関係します。彼らは「関係」自体には関係しません。 –

6

データがその特定の関係に特化していない限り、多くのデータの複製が終了するため、これを避けてください。あなたの例では、画像はカテゴリにリンクされているので、そこに保存する必要があります。ただし、関係が作成および編集された時を示すタイムスタンプ、および関係を作成および変更したユーザーIDは、その表になければなりません。

+0

合意しましたが、カテゴリと製品の間の関係ではなく、カテゴリに関する製品の割引を含むテーブルにCategoryIDを使用して結合します。タイムスタンプを追加することは関係に関連しています。 – MPavlak

1

はい。

リレーションシップにはIMOという属性があります。いくつかのデザインマスターはそうは思わないが。

学生とコースの「登録」関係を考えてみましょう。学生がクレジットまたは審査員のいずれかに登録できる場合、この属性が(StudentID、CourseID)キーを持つテーブルに格納されることは意味があります。この表は、学生がどのコースに登録しているかをカタログ化する関係表です。

3

例えば、アスリートのテーブルとRacesのテーブルがある場合。参加表AthleteRaceは、そのレースへの選手の参加を表しているので、そこにレースの時間を持たせることもできます。

2 exapmlesあなたが持っている:彼らはありませんカテゴリ内の製品の会員に、カテゴリーに関係するよう

column - DiscountForProductsInThisCategory 
column - CategoryImageForProductsInThisCategory 

は、カテゴリテーブルに属しています。

+0

ありがとう、これはもっと良い例でした。適切な例を考え出すのはかなり恐ろしいことです。 –

2

質問は考慮されるべき問題ではありません。

たとえば、 DiscountForProductsInThisCategoryはカテゴリのPKを使用して1 :: 1であるため、唯一正しいカテゴリはCategoryです。 ProductCategoryでは、データの大規模な複製となります。

列が1(ProductId + CategoryId)の関係で1 :: 1の場合、唯一正しい場所はProductCategoryです。