1対多と多対1の関係の本当の違いは何ですか?逆になってるだけなの?
このトピック以外に、このトピックに関する「わかりやすい」チュートリアルはありません。 初心者向けSQL:パート3-データベース関係
はい、その逆も同様です。エンティティが存在する関係のどちら側に依存します。
たとえば、1つの部門が複数の従業員を雇用できる場合、部門から従業員は1対多の関係(1つの部門は多くの従業員を雇用)、従業員から部門への関係は多対1(多くの従業員が1人で働いています)部門)。
詳細情報 関係タイプについて:
これから データベース用語に関するページ
テーブル間のほとんどのリレーションは1対多です。
例:
- 1つの領域は多くの読者の生息地になり得ます。
- 1人の読者が多数のサブスクリプションを持つことができます。
- 1つの新聞に多くの購読があります。
多対1の関係は、1対多と同じですが、視点が異なります。
- 多くの読者が1つの地域に住んでいます。
- 多くのサブスクリプションは、同じ読者のものである場合があります。
- 多くの購読は、同じ新聞を対象としています。
1対多と多対1の関係の本当の違いは何ですか?
これらの用語には概念的な違いがあり、データを視覚化するのに役立ちます。また、生成されたスキーマで完全に理解する必要がある違いもあります。しかし、ほとんどの違いは視点の1つです。
1対多の関係では、ローカルテーブルには1つの行があり、別のテーブルの多くの行に関連付けることができます。 初心者向けのSQL の例では、1つのCustomer
を多くのOrder
sに関連付けることができます。
反対の多対1の関係では、ローカルテーブルには、別のテーブルの1つの行に関連付けられた多くの行がある場合があります。この例では、多くのOrder
sを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
は、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
テーブルに追加する代わりに、Customer
とOrder
の両方のキーを含むCustomer_Order
テーブルが存在する場合があります。
customer_id,order_id
1,10
1,11
2,12
この場合、one-to-manyおよびmany-to-oneはすべて概念的なものです。それら。どのメカニズムがスキーマとSQL実装に依存します。
お役に立てれば。
最初の質問に対する答えは次のとおりです。どちらも似ていますが、
2番目の質問に対する答えは、1対多-> MAN(MANテーブル)に複数の妻(WOMENテーブル)が多対1->複数の女性が1人のMANと結婚している場合があります。
このリレーションを2つのテーブルMANとWOMENに関連付ける場合、1つのMANテーブル行はWOMENテーブルの行と多くのリレーションを持つことができます。明確に願っています。
違いはありません。関係を述べる方法については、言語と好みの問題です。
SQLには、1種類の関係しかありません。これは参照と呼ばれます。 (フロントエンドは[アンサーの一部など]役に立つまたは混乱させることを行う場合がありますが、それは別の話です。)
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 です。Bar
行には、1つのFoo
行しかありません。1対多と多対1の関係の本当の違いは何ですか?
リレーションは1つしかないため、違いはありません。知覚(一方の「端」または他方の「端」から)またはそれを逆方向に読んでも、関係は変わりません。
カーディナリティは、最初に論理的および物理的(意図)を意味するデータモデルで宣言され、次に実装(実現された意図)で宣言されます。
1対0
SQLで必要なのは(上記)だけです。
1対1
参照元テーブルのトランザクションを強制するには、Transactionが必要です。
1対0Bar
に必要なもの:
CONSTRAINT AK -- constraint name
UNIQUE (Foo) -- unique column, which makes it an Alternate Key
1対1
参照元テーブルのトランザクションを強制するには、Transactionが必要です。
多対多
物理レベルではそのようなことはありません(SQLには1種類のリレーションしかありません)。
モデリング演習の初期の論理レベルでは、このような関係を描くのは便利です。モデルが実装に近づく前に、存在できるもののみを使用するように昇格させる必要がありました。このような関係は、連想表を実装することで解決されます。
1対多と多対1は、多重度は似ていますが、アスペクト(方向性)は似ていません。
エンティティクラス間の関連付けとテーブル間の関係のマッピング。関係には2つのカテゴリがあります。
---多対一---これらの3人の子供は、単一の親を持つことができます。
どちらも似ています。これは必要に応じて使用できます。特定の親の子供を見つけたい場合は、1対多に対応できます。または、双子の両親を見つけたい場合は、多対1で行くことができます。同様に...
実用的な違いはありません。 Devendraが示すように、問題の見方を考えると最も意味のある関係を使用してください。