1対多の関係と多対1の関係の違い


117

1対多の関係と多対1の関係の本当の違いは何ですか?逆転するだけなんですよね?

このトピック以外に、このトピックに関する「わかりやすく理解しやすい」チュートリアルはありません。SQLfor Beginners:Part 3-Database Relationships


1
これは完璧な説明です:en.wikipedia.org/wiki/Many-to-many_
data_model

@RobertPitt多対多の記事は質問にどのように関連していますか?あなたは、おそらくかなりのものen.wikipedia.org/wiki/One-to-many_(data_model)
TMG

回答:


111

はい、その逆です。エンティティが存在する関係のどちら側に依存します。

たとえば、1つの部門が複数の従業員を雇用できる場合、部門と従業員は1対多の関係(1部門は多くの従業員を雇用)であり、従業員と部門の関係は多対1(多くの従業員は1つの部門で働く)です。

関係タイプの詳細

データベースの関係-IBM DB2ドキュメント


2
シーンにならないのではないでしょうか!(確実ではありませんが)順序は依存関係を表すと思います!じゃない?たとえば、役割を使用するユーザーは、1対多であっても、多対多ではない場合があります。これは、役割を使用するユーザーの参照を取得できないためです。それは理にかなっていますか?
アマヌエルネガ2014


29

このページからデータベース用語について

テーブル間のほとんどの関係は1対多です。

例:

  • 1つの領域は、多くの読者の生息地になる可能性があります。
  • 1人の読者が多くのサブスクリプションを持つことができます。
  • 1つの新聞に多数の購読を含めることができます。

多対1の関係は1対多と同じですが、見方が異なります。

  • 多くの読者が1つの地域に住んでいます。
  • 多くのサブスクリプションは、同一のリーダーで構成できます。
  • 多くの購読は、同じ新聞を対象としています。

20

1対多の関係と多対1の関係の本当の違いは何ですか?

これらの用語には、データを視覚化するのに役立つ概念上の違いがあり、生成されたスキーマには、完全に理解する必要がある可能性のある違いもあります。ほとんどの場合、違いは視点の1つです。

一対多の関係、ローカルテーブルを別のテーブルに多くの行に関連付けることができる一つの列を有しています。初心者向けSQLの例では、1つCustomerが多くOrderのに関連付けられている場合があります。

反対の多対1の関係では、ローカルテーブルに、別のテーブルの1つの行に関連付けられている多くの行がある場合があります。この例では、Order1つのに多くのが関連付けられている場合がありますCustomer。この概念の違いは、精神的な表現にとって重要です。

さらに、関係をサポートするスキーマは、CustomerおよびOrderテーブルで異なる表現になる場合があります。たとえば、顧客に列idとがある場合name

id,name
1,Bill Smith
2,Jim Kenshaw

次に、Orderをに関連付けるためにCustomer、多くのSQL実装は、関連付けられた(このスキーマでは)Orderを格納する列をテーブルに追加します。idCustomercustomer_id

id,date,amount,customer_id
10,20160620,12.34,1
11,20160620,7.58,1
12,20160621,158.01,2

上記のデータ行でcustomer_idid列を見ると、Bill Smith(customer-id#1)に2つの注文が関連付けられていることがわかります。1つは$ 12.34、もう1つは$ 7.58です。 Jim Kenshaw(customer-id#2)の注文は$ 158.01で1つだけです。

理解しておくべき重要なことは、通常、1対多の関係は実際には「1」である列を表に追加しないということです。にCustomerは、との関係を説明する追加の列はありませんOrder。事実Customerかもしれないがまた1対多の関係持つShippingAddressSalesCallテーブルをし、まだ追加の列が追加ません持っていますCustomerテーブル。

ただし、多対1の関係を説明idするために、「1」テーブルへの外部キーである「多」テーブルに列が追加されることがよくあります。この場合、customer_id列がに追加されますOrder。$ 12.34のに関連付けられた注文#10 Bill Smithに、customer_id列をBill SmithのID 1に割り当てます。

ただし、CustomerとのOrder関係を説明する別のテーブルが存在する可能性もあるため、Orderテーブルにフィールドを追加する必要はありません。テーブルにcustomer_idフィールドを追加する代わりに、との両方のキーを含むテーブルOrderが存在する場合がありCustomer_Orderます。 CustomerOrder

customer_id,order_id
1,10
1,11
2,12

この場合、1対多および多対1多対は、それらの間にスキーマの変更がないため、すべて概念的です。どのメカニズムがスキーマとSQL実装に依存するか。

お役に立てれば。


3
一般的なケースは、包含依存関係と呼ばれます。外部キー制約は、最も一般的なタイプの包含依存関係ですが、すべての包含依存関係に外部キーが含まれるわけではありません。共通の属性(「参照」)は常に両方のテーブルに存在します。「1つ」の側では、これらの属性は候補キーと呼ばれます。「多」側で、それら外部キーである可能性があります。「1対多」または「多対1」という用語は、どちらの側がオプションであるかを必ずしも示唆することなく、少なくとも1つの候補キーを含むすべての包含依存関係に適用できます。
nvogel 2016年

興味深い@sqlvogel。Javaではとはjavax.persistence.OneToMany異なりManyToOneます。あなたはそれらが同義であるか、それが単に実装に依存していると言っていますか?私の答えは間違っていますか?
グレー

2
問題は、Javaではなく、リレーショナルデータベースとSQLについてです。多分あなたはJavaについて正しいです。
nvogel

@sqlvogelの例として使用していました。「1対多」と「多対1」は同義語だと言っていますか。
グレー、

2
これらは、まったく同じ関係を異なる視点から説明する2つの方法だと言っています。「AはBのサブセット」と同じように、「BはAのスーパーセット」と同じ意味です。
nvogel 2016年

4

違いはありません。どちらの方法で関係を述べるかは、単に言語と好みの問題です。


1
概念的にも生成されたスキーマにも確かに違いがあります。私の回答を参照してください:stackoverflow.com/a/37954280/179850
グレー

4
@グレー。いいえ、ありません。あなたの答えは間違っているだけでなく、初心者(この質問をする人)を混乱させます。
PerformanceDBA

4

最初の質問の答えは次のとおりです。どちらも似ていますが、

2番目の質問への回答は、次のとおりです。1対多-> MAN(MANテーブル)には複数の妻(WOMENテーブル)が多対1である可能性があります->複数の女性が1人のMANと結婚しています。

このリレーションを2つのテーブルMANとWOMENに関連付ける場合、1つのMANテーブルの行がWOMENテーブルの行と多くのリレーションを持つ場合があります。それが明確であることを願っています。


3

1つのリレーションを持つ2つのテーブル

SQL

SQLでは、1種類の関係のみがあり、それは参照と呼ばれます。(あなたのフロントエンドは、[回答の一部など]で役立つか混乱することをするかもしれませんが、それは別の話です。)

  • A 外部キー 1表中の(referencはINGのテーブル)を
    参照主キー別の表の(referencのED
    テーブルを)
  • SQL用語では、バーはFooの参照
    されていない他の方法の周りを

    CREATE TABLE Foo (
        Foo   CHAR(10)  NOT NULL, -- primary key
        Name  CHAR(30)  NOT NULL
        CONSTRAINT PK             -- constraint name
            PRIMARY KEY (Foo)     -- pk
        )  
    CREATE TABLE Bar (
        Bar   CHAR(10)  NOT NULL, -- primary key
        Foo   CHAR(10)  NOT NULL, -- foreign key to Foo
        Name  CHAR(30)  NOT NULL
        CONSTRAINT PK                -- constraint name
            PRIMARY KEY (Bar),       -- pk
        CONSTRAINT Foo_HasMany_Bars  -- constraint name
            FOREIGN KEY   (Foo)      -- fk in (this) referencing table
            REFERENCES Foo(Foo)      -- pk in referenced table
        )
  • 以来、Foo.Foo主キーであり、それはユニークであり、任意の所与の値に対してのみ行が存在しますFoo

  • 以来Bar.Fooリファレンス、外部キー、であり、それには一意のインデックスが存在しない、のいずれかの与えられた値のために多くの行が存在することができFoo
  • したがって、関係 Foo::Barは1対多です。
  • これで、関係を逆に認識(見る)できます。Bar::Foo多対1です。
    • しかし、混乱させないでください。どのBar行でも、Foo参照する行は1つだけです。
  • SQLでは、これですべてです。それだけで十分です。

1対多の関係と多対1の関係の本当の違いは何ですか?

関係は1つしかないため、違いはありません。知覚(一方の「端」または他方の「端」から)またはそれを逆に読んでも、関係は変わりません。

カーディナリティ

カーディナリティは、最初にデータモデルで宣言されます。つまり、論理的および物理的(意図)を宣言し、次に実装(意図が実現)で宣言します。

カーディナリティ

1対0対多
SQLでは、(上記)が必要なすべてです。

1対1
取引が必要参照テーブルのを強制です。

1対0から1
あなたがに必要Bar

CONSTRAINT AK    -- constraint name
    UNIQUE (Foo) -- unique column, which makes it an Alternate Key

一対一
トランザクション が必要参照テーブルのを強制です。

多対多
物理レベルではそのようなことはありません(SQLには1種類のリレーションしかありません)。

モデリング演習中の初期の論理レベルでは、 このような関係を描く便利です。モデルが実装に近づく前に、存在できるものだけを使用するように昇格させるべきです。このような関係は、連想テーブルを実装することで解決されます。

多対多の解決


1
@Martijn Peters。行動規範に準拠するように編集できます。ただし、(a)説明、および(b)実際に証明された事実も削除しました。それらについて私は何をしますか?
PerformanceDBA、

3
誰かの知性や職業上の行動に、わいせつ、名前の呼びかけ、アスペションを投げかけることなく、それらを表現する別の方法を見つけてください。間違っているかどうかに関係なく、テクノロジーに焦点を当てます。
Martijn Pieters

2

1対多と多対1は、多重度は類似していますが、アスペクト(つまり、方向性)は類似していません。

マッピング協会エンティティクラスとの間の関係のテーブル間。関係には2つのカテゴリがあります。

  1. 多重度(ER用語:カーディナリティ)
    • 1対1の関係:夫と妻の例
    • 1対多の関係:母と子の例
    • 多対多の関係:生徒と科目の例
  2. 方向性:マッピングには影響しませんが、データへのアクセス方法に違いがあります。
    • 一方向の関係:他のエンティティを参照する関係フィールドまたはプロパティ。
    • 双方向関係:各エンティティには、他のエンティティを参照する関係フィールドまたはプロパティがあります。

リレーショナルデータベースには「方向性」はありません。各関係には2つの「終わり」があります。参照(参照されるテーブル)と参照(参照を行うテーブル)です。SQL / DMLを使用すると、任意のテーブルを任意の方法で参照できます…片側…反対側…両側…側なし。
PerformanceDBA

0

実際的な違いはありません。Devendraが示すように、問題の見方を考えると、最も意味のある関係を使用してください。


概念的にも生成されたスキーマにも確かに違いがあります。私の回答を参照してください:stackoverflow.com/a/37954280/179850
グレー

3
@グレー。いいえ、ありません。あなたの答えは間違っているだけでなく、初心者(この質問をする人)を混乱させます。
PerformanceDBA

0
  • --- 1対多---親は2人以上の子供を持つことができます。
  • ---多対多---これらの3人の子供は単一の親を持つことができます。

    どちらも似ています。これは、必要に応じて使用できます。特定の親の子供を見つけたい場合は、1対多で参加できます。または、双子の両親を見つけたい場合は、多対一で行くことができます。同様に....、


-6

1対多対多の親クラスにはn個の子が含まれているため、これはコレクションマッピングです。

多対1にはn個の子があり、1つの親が含まれているため、オブジェクトマッピングです


この回答は適切であり、追加情報があるため、なぜ反対票が投じられたのか理解できません。単方向のコンテキストでは、1対多および多対1では、UXに応じて同じコード品質が提供されません。関連するデータセットを取得する必要がある場合そのため、セットがマップに存在するために条件が適切なselectステートメントは必要ありませんが、ユーザーがデータのセットを取得する必要がなく、各行を一意として関心がある場合は、1対多の方が賢明です。望ましいインスタンスなので、多対1の方が賢明な選択です
Mohammed Housseyn Taleb

それは良い答えかもしれませんが、それらは同じではありません。多対1にはn個の子を含む親クラスがあり、1対多には1つの子に対して多くの親があります。SQLでは、多対1の関係は無指向性である可能性があるため、違いはないかもしれませんが、Djangoなどのフレームワークでは、1対多の関係と外部キーがないため、これは大きな問題です。多対1の関係を処理することは、自然に一方向でのみ機能します。これは、同じ方法で他の方向に使用することはできません。
iFunction '29 / 07/29
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.