1対多の関係と多対1の関係の本当の違いは何ですか?逆になっているだけなの?
このトピックに関する「わかりやすい」チュートリアルは、これ以外に見つかりません。初心者向けSQL:パート3-データベースの関係
1対多の関係と多対1の関係の本当の違いは何ですか?逆になっているだけなの?
このトピックに関する「わかりやすい」チュートリアルは、これ以外に見つかりません。初心者向けSQL:パート3-データベースの関係
はい、その逆です。関係のどちら側にエンティティが存在するかによって異なります。
たとえば、1つの部門が複数の従業員を雇用できる場合、部門間の関係は1対多の関係(1つの部門は多くの従業員を雇用)であり、従業員間の関係は多対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に、列を' sid1Bill Smith
に割り当てます。customer_id
Bill Smith
Customer
ただし、との関係を説明する別のテーブルが存在する可能性もあるため、テーブルにOrder
フィールドを追加する必要はありませんOrder
。customer_id
テーブルにフィールドを追加する代わりに、との両方のキーを含むテーブルOrder
が存在する可能性があります。 Customer_Order
Customer
Order
customer_id,order_id
1,10
1,11
2,12
この場合、1対多および多対1はすべて概念的なものです。これは、それらの間にスキーマの変更がないためです。どのメカニズムは、スキーマとSQLの実装によって異なります。
お役に立てれば。
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
、一意であり、任意の値に対して1つの行しかありません。Foo
は参照であり、外部キーであり、一意のインデックスがないためBar.Foo
、任意の値に対して多くの行が存在する可能性があります。Foo
したがって、関係Foo::Bar
は1対多です
今、あなたはその逆の関係を知覚(見る)することができます、Bar::Foo
多対1です
Bar
は1つだけです。Foo
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
1対1参照テーブルのトランザクションを強制するには、トランザクション
が必要です。
物理レベルではそのようなことはありません(SQLには1つのタイプの関係しかないことを思い出してください)。
モデリング演習の初期の論理レベルでは、このような関係を描くと便利です。モデルが実装に近づく前に、存在できるものだけを使用するようにモデルを引き上げたほうがよいでしょう。このような関係は、物理[DDL]レベルで連想テーブルを実装することで解決されます。
違いはありません。どちらの方向で関係を述べるかは、言語と好みの問題です。
1対多と多対1は、多重度では類似していますが、アスペクト(つまり方向性)では類似していません。
エンティティクラス間の関連付けとテーブル間の関係のマッピング。関係には2つのカテゴリがあります。
あなたの最初の質問への答えは次のとおりです:両方とも似ています、
2番目の質問に対する答えは次のとおりです。1対多->MAN(MANテーブル)には複数の妻(WOMENテーブル)が多対1である可能性があります->複数の女性が1人のMANと結婚しています。
ここで、この関係を2つのテーブルMANおよびWOMENと関連付けたい場合、1つのMANテーブル行がWOMENテーブルの行と多くの関係を持つ可能性があります。それが明確であることを願っています。
私の経験によれば、これは優れた質問であり、ERD図とリレーショナルデータベースでは方向性が示唆されています。RDBMSでは、常に多対1(些細なケースでは1対> 1)の関係を定義します。関係の多側(別名子)は片側(別名親)を参照し、外部キー制約を使用してこれを実装します。技術的には、インデックスにアクセスし、片側の主キーレコードを取得してから、このレコードにアクセスして詳細情報を取得する必要があります。
Postgres、Intersystems CacheなどのオブジェクトリレーショナルDBMSについて話していない限り、これを逆に行うことはできません。これらのDBMSを使用すると、2つのエンティティ(テーブル)間の双方向の関係を定義できます。その場合、レコードへのアクセスは逆になります。つまり、One--To-> Manyは、参照の配列(子)を使用して実現されます。ORMには、ここで説明したのと同じ方法で相互に参照するクラスがあります。
警告:IT市場のほとんどのRDBMSは、厳密な意味でのリレーショナルデータベース管理システムではありません。null値や重複レコードなどについて考えてください。これらの許可された機能の多くは、リレーションとは何かの定義を破ります。
実用的な違いはありません。Devendraが示したように、問題の見方を考えると、最も意味のある関係を使用してください。
---1対多---親は2人以上の子供を持つことができます。
---多対1---これらの3人の子供はひとり親を持つことができます
どちらも似ています。必要に応じてご使用いただけます。特定の親の子供を見つけたい場合は、1対多で行くことができます。または、双子の親を見つけたい場合は、多対多で行くことができます。
1対多および多対1の関係は、同じ論理関係について話します。たとえば、所有者は多くの家を所有している場合がありますが、家は1人の所有者しか所有できません。
したがって、この例では、所有者が1つであり、家が多数です。各ホームには、追加の列として常にowner_id(外部キーなど)があります。
これら2つの実装の違いは、どちらのテーブルが関係を定義するかです。1対多では、所有者は関係が定義される場所です。たとえば、owner1.homesは、owner1のowner_idを持つすべての家を一覧表示します。多対1では、家は関係が定義される場所です。たとえば、home1.ownerはowner1のowner_idをリストします。
すでにowner_idを知っているので少し冗長に見えるので、実際にはどのような場合に多対1の配置を実装するのかわかりません。おそらく、それは削除と変更のクリーンさに関連しています。
evendra D. Chavan's
私がこの関係について与えることができる最も簡単な説明は、答えに便乗する ことです。
部門は複数の従業員を持つことができるので、従業員側からはone-to-many
関係であり、部門側からはmany-to-one relationship
ただし、従業員が複数の部門に所属できる場合は、従業員側からは「ではなく」と言うこともできるmany
ためone
、関係は次のようになります。many-to-many
つまり、簡単に理解すると、関係は両側から見ることができるmany-to-many
場合、つまり、関係であると言うことができます。one-to-many
one-to-many
)one-to-many
)1対多の親クラスにはn個の子が含まれているため、コレクションマッピングです。
多対1にはn個の子があり、1つの親が含まれているため、オブジェクトマッピングです。