139

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

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

4

13 に答える 13

125

はい、その逆です。関係のどちら側にエンティティが存在するかによって異なります。

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

関係タイプの詳細:

データベースの関係-IBMDB2の資料

于 2011-01-05T07:30:26.237 に答える
34

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

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

例:

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

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

  • 多くの読者が1つの地域に住んでいます。
  • 多くのサブスクリプションは、1つの同じリーダーである可能性があります。
  • 多くの購読は、同じ新聞に対するものです。
于 2011-01-05T07:26:34.757 に答える
26

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実装Orderid、関連付けられたCustomer(このスキーマではcustomer_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。実際、テーブルとCustomer1対多の関係がShippingAddressあり、SalesCallテーブルに追加の列が追加されていない場合もありCustomerます。

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

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

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

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

お役に立てれば。

于 2016-06-21T20:45:54.380 に答える
10

SQL

1つの関係を持つ2つのテーブル

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です

    • ただし、混乱させないでください。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]レベルで連想テーブルを実装することで解決されます。

多対多の解決

于 2019-02-17T11:00:52.923 に答える
5

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

于 2011-01-05T11:37:22.440 に答える
5

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

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

  1. 多重度(ER用語:カーディナリティ)
  • 1対1の関係(1:1と略記):夫と妻の例
  • 1対多の関係(省略形1:N):母と子の例
  • 多対多の関係(略してM:N):学生と科目の例
  1. 方向性:マッピングには影響しませんが、データへのアクセス方法に違いがあります。
  • 一方向の関係:他のエンティティを参照する関係フィールドまたはプロパティ。
  • 双方向の関係:各エンティティには、他のエンティティを参照する関係フィールドまたはプロパティがあります。
于 2017-09-03T10:20:32.933 に答える
3

あなたの最初の質問への答えは次のとおりです:両方とも似ています、

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

ここで、この関係を2つのテーブルMANおよびWOMENと関連付けたい場合、1つのMANテーブル行がWOMENテーブルの行と多くの関係を持つ可能性があります。それが明確であることを願っています。

于 2012-11-23T03:32:49.560 に答える
2

私の経験によれば、これは優れた質問であり、ERD図とリレーショナルデータベースでは方向性が示唆されています。RDBMSでは、常に多対1(些細なケースでは1対> 1)の関係を定義します。関係の多側(別名子)は片側(別名親)を参照し、外部キー制約を使用してこれを実装します。技術的には、インデックスにアクセスし、片側の主キーレコードを取得してから、このレコードにアクセスして詳細情報を取得する必要があります。

Postgres、Intersystems CacheなどのオブジェクトリレーショナルDBMSについて話していない限り、これを逆に行うことはできません。これらのDBMSを使用すると、2つのエンティティ(テーブル)間の双方向の関係を定義できます。その場合、レコードへのアクセスは逆になります。つまり、One--To-> Manyは、参照の配列(子)を使用して実現されます。ORMには、ここで説明したのと同じ方法で相互に参照するクラスがあります。

警告:IT市場のほとんどのRDBMSは、厳密な意味でのリレーショナルデータベース管理システムではありません。null値や重複レコードなどについて考えてください。これらの許可された機能の多くは、リレーションとは何かの定義を破ります。

于 2021-04-16T12:01:54.047 に答える
0

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

于 2013-08-07T08:37:26.340 に答える
0
  • ---1対多---親は2人以上の子供を持つことができます。

  • ---多対1---これらの3人の子供はひとり親を持つことができます

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

于 2018-02-01T10:00:24.560 に答える
0

1対多および多対1の関係は、同じ論理関係について話します。たとえば、所有者は多くの家を所有している場合がありますが、家は1人の所有者しか所有できません。

したがって、この例では、所有者が1つであり、家が多数です。各ホームには、追加の列として常にowner_id(外部キーなど)があります。

これら2つの実装の違いは、どちらのテーブルが関係を定義するかです。1対多では、所有者は関係が定義される場所です。たとえば、owner1.homesは、owner1のowner_idを持つすべての家を一覧表示します。多対1では、家は関係が定義される場所です。たとえば、home1.ownerはowner1のowner_idをリストします。

すでにowner_idを知っているので少し冗長に見えるので、実際にはどのような場合に多対1の配置を実装するのかわかりません。おそらく、それは削除と変更のクリーンさに関連しています。

于 2020-10-15T21:36:57.573 に答える
0

evendra D. Chavan's私がこの関係について与えることができる最も簡単な説明は、答えに便乗する ことです。

部門と従業員の関係を使用する

部門は複数の従業員を持つことができるので、従業員側からはone-to-many関係であり、部門側からはmany-to-one relationship

ただし、従業員が複数の部門に所属できる場合は、従業員側からは「ではなく」と言うこともできるmanyためone、関係は次のようになります。many-to-many

つまり、簡単に理解すると、関係は両側から見ることができるmany-to-many場合、つまり、関係であると言うことができます。one-to-many

  • 1人の従業員が多くの部門に所属できます(one-to-many
  • 1つの部門に多くの従業員を配置できます(one-to-many
于 2021-06-13T06:23:00.730 に答える
-5

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

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

于 2013-01-07T12:30:42.590 に答える