1対多の関係と多対1の関係の本当の違いは何ですか?逆転するだけなんですよね?
このトピック以外に、このトピックに関する「わかりやすく理解しやすい」チュートリアルはありません。SQLfor Beginners:Part 3-Database Relationships
1対多の関係と多対1の関係の本当の違いは何ですか?逆転するだけなんですよね?
このトピック以外に、このトピックに関する「わかりやすく理解しやすい」チュートリアルはありません。SQLfor Beginners:Part 3-Database Relationships
回答:
はい、その逆です。エンティティが存在する関係のどちら側に依存します。
たとえば、1つの部門が複数の従業員を雇用できる場合、部門と従業員は1対多の関係(1部門は多くの従業員を雇用)であり、従業員と部門の関係は多対1(多くの従業員は1つの部門で働く)です。
関係タイプの詳細:
テーブル間のほとんどの関係は1対多です。
例:
- 1つの領域は、多くの読者の生息地になる可能性があります。
- 1人の読者が多くのサブスクリプションを持つことができます。
- 1つの新聞に多数の購読を含めることができます。
多対1の関係は1対多と同じですが、見方が異なります。
- 多くの読者が1つの地域に住んでいます。
- 多くのサブスクリプションは、同一のリーダーで構成できます。
- 多くの購読は、同じ新聞を対象としています。
1対多の関係と多対1の関係の本当の違いは何ですか?
これらの用語には、データを視覚化するのに役立つ概念上の違いがあり、生成されたスキーマには、完全に理解する必要がある可能性のある違いもあります。ほとんどの場合、違いは視点の1つです。
一対多の関係、ローカルテーブルを別のテーブルに多くの行に関連付けることができる一つの列を有しています。初心者向けSQLの例では、1つCustomer
が多くOrder
のに関連付けられている場合があります。
反対の多対1の関係では、ローカルテーブルに、別のテーブルの1つの行に関連付けられている多くの行がある場合があります。この例では、Order
1つのに多くのが関連付けられている場合がありますCustomer
。この概念の違いは、精神的な表現にとって重要です。
さらに、関係をサポートするスキーマは、Customer
およびOrder
テーブルで異なる表現になる場合があります。たとえば、顧客に列id
とがある場合name
:
id,name
1,Bill Smith
2,Jim Kenshaw
次に、Order
をに関連付けるためにCustomer
、多くのSQL実装は、関連付けられた(このスキーマでは)Order
を格納する列をテーブルに追加します。id
Customer
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
かもしれないがまた1対多の関係持つShippingAddress
とSalesCall
テーブルをし、まだ追加の列が追加ません持っています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
ます。 Customer
Order
customer_id,order_id
1,10
1,11
2,12
この場合、1対多および多対1多対は、それらの間にスキーマの変更がないため、すべて概念的です。どのメカニズムがスキーマとSQL実装に依存するか。
お役に立てれば。
javax.persistence.OneToMany
異なりManyToOne
ます。あなたはそれらが同義であるか、それが単に実装に依存していると言っていますか?私の答えは間違っていますか?
違いはありません。どちらの方法で関係を述べるかは、単に言語と好みの問題です。
SQLでは、1種類の関係のみがあり、それは参照と呼ばれます。(あなたのフロントエンドは、[回答の一部など]で役立つか混乱することをするかもしれませんが、それは別の話です。)
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つだけです。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対多と多対1は、多重度は類似していますが、アスペクト(つまり、方向性)は類似していません。
マッピング協会エンティティクラスとの間の関係のテーブル間。関係には2つのカテゴリがあります。
実際的な違いはありません。Devendraが示すように、問題の見方を考えると、最も意味のある関係を使用してください。
1対多対多の親クラスにはn個の子が含まれているため、これはコレクションマッピングです。
多対1にはn個の子があり、1つの親が含まれているため、オブジェクトマッピングです