web-dev-qa-db-ja.com

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

1対多と多対1の関係の本当の違いは何ですか?逆になってるだけなの?

このトピック以外に、このトピックに関する「わかりやすい」チュートリアルはありません。 初心者向けSQL:パート3-データベース関係

105
Zhaf

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

たとえば、1つの部門が複数の従業員を雇用できる場合、部門から従業員は1対多の関係(1つの部門は多くの従業員を雇用)、従業員から部門への関係は多対1(多くの従業員が1人で働いています)部門)。

詳細情報 関係タイプについて:

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

96

これから データベース用語に関するページ

テーブル間のほとんどのリレーションは1対多です。

例:

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

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

  • 多くの読者が1つの地域に住んでいます。
  • 多くのサブスクリプションは、同じ読者のものである場合があります。
  • 多くの購読は、同じ新聞を対象としています。
29
nathan gonzalez

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

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

1対多の関係では、ローカルテーブルには1つの行があり、別のテーブルの多くの行に関連付けることができます。 初心者向けのSQL の例では、1つのCustomerを多くのOrdersに関連付けることができます。

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

さらに、リレーションシップをサポートするスキーマは、CustomerテーブルとOrderテーブルで異なって表される場合があります。たとえば、顧客に列idおよびnameがある場合:

id,name
1,Bill Smith
2,Jim Kenshaw

次に、OrderCustomerに関連付けるために、多くのSQL実装がOrderテーブルに、関連付けられたidCustomer(このスキーマcustomer_id

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

上記のデータ行でcustomer_id id列を見ると、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は、ShippingAddressおよびSalesCallテーブルと1対多の関係を持ち、Customerテーブルに追加の列が追加されていない場合があります。

ただし、多対1の関係を記述するために、多くの場合、[1つ]テーブルの外部キーである[多]テーブルにid列が追加されます。この場合はcustomer_id列がOrderに追加されます。 $ 12.34の注文#10をBill Smithに関連付けるには、customer_id列をBill Smithのid 1に割り当てます。

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

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

この場合、one-to-manyおよびmany-to-oneはすべて概念的なものです。それら。どのメカニズムがスキーマとSQL実装に依存します。

お役に立てれば。

16
Gray

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

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

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

6
pal

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

4
nvogel

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

SQL

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

  • A Foreign Key in one table (the referencing table)
    参照
    a別のテーブルのプライマリキーreferencedテーブル)
  • SQL用語では、Barは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の特定の値に対して1行のみが存在します。

  • Bar.Fooは参照、外部キーであり、一意のインデックスがないため、Fooの特定の値に対して多くの行が存在する可能性があります
  • したがって、リレーションFoo::Barは1対多です
  • 今、あなたは関係を知覚する(見る)ことができ、Bar::Fooは多対1 です。
    • ただし、混乱させないでください。1つのBar行には、1つのFoo行しかありません。
  • SQLでは、これですべてです。必要なのはそれだけです。

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

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

カーディナリティ

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

カーディナリティ

1対0
SQLで必要なのは(上記)だけです。

1対1
参照元テーブルのトランザクションを強制するには、Transactionが必要です。

1対0
Barに必要なもの:

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

1対1
参照元テーブルのトランザクションを強制するには、Transactionが必要です。

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

モデリング演習の初期の論理レベルでは、このような関係を描くのは便利です。モデルが実装に近づく前に、存在できるもののみを使用するように昇格させる必要がありました。このような関係は、連想表を実装することで解決されます。

多対多の解決

3
PerformanceDBA

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

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

  1. 多重度(ER用語:カーディナリティ)
    • 一対一の関係:夫と妻の例
    • 一対多の関係:母と子の例
    • 多対多の関係:生徒と被験者の例
  2. 方向性:マッピングには影響しませんが、データへのアクセス方法に違いが生じます。
    • 一方向の関係:他のエンティティを参照する関係フィールドまたはプロパティ。
    • 双方向の関係:各エンティティには、他のエンティティを参照する関係フィールドまたはプロパティがあります。
2
Premraj
  • --- 1対多---親は2人以上の子を持つことができます。
  • ---多対一---これらの3人の子供は、単一の親を持つことができます。

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

0
Samuel H

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

0
Tom Bell