一对多和多对一关系之间的差异

时间:2011-01-05 07:23:07

标签: sql relational-database relational-algebra

一对多和多对一关系的真正区别是什么?它只是颠倒了,有点吗?

除了这个主题之外,我找不到任何关于这个主题的“易于理解”的教程:SQL for Beginners: Part 3 - Database Relationships

13 个答案:

答案 0 :(得分:95)

是的,反之亦然。这取决于实体所在的关系的哪一方。

例如,如果一个部门可以雇用几个员工,那么部门到员工是一对多的关系(1个部门雇用了许多员工),而员工与部门的关系是多对一(许多员工在一个部门工作)。

关于关系类型的

更多信息

Database Relationships - IBM DB2 documentation

答案 1 :(得分:28)

从此page about Database Terminology

  

表之间的大多数关系是一对多的。

     

示例:

     
      
  • 一个地区可能是许多读者的栖息地。
  •   
  • 一位读者可以订阅很多。
  •   
  • 一份报纸可以订阅很多。
  •   
     

多对一关系与一对多关系相同,但从不同的角度来看。

     
      
  • 许多读者住在一个地区。
  •   
  • 许多订阅可以是同一个读者。
  •   
  • 许多订阅适用于同一份报纸。
  •   

答案 2 :(得分:15)

  

一对多和多对一关系之间的真正区别是什么?

这些术语之间存在概念上的差异,这些术语应该可以帮助您可视化数据,以及应该完全理解的生成架构中的可能差异。大多数情况下,差异是透视之一。

一对多关系中,本地表有一行可能与另一个表中的许多行相关联。在SQL for beginners的示例中,一个Customer可能与许多Order相关联。

在相反的多对一关系中,本地表可能有许多行与另一个表中的一行相关联。在我们的示例中,许多Order可能与一个Customer相关联。这种概念差异对于心理表征很重要。

此外,支持关系的模式可能在CustomerOrder表中以不同方式表示。例如,如果客户有列idname

id,name
1,Bill Smith
2,Jim Kenshaw

然后,如果OrderCustomer关联,则许多SQL实现会在Order表中添加一列,用于存储关联{{1}的id (在此架构中Customer

customer_id

在上述数据行中,如果我们查看id,date,amount,customer_id 10,20160620,12.34,1 11,20160620,7.58,1 12,20160621,158.01,2 id列,我们会看到customer_id(customer-id#1)有2个与他关联的订单:一个是12.34美元,一个是$ 7.58 Bill Smith(customer-id#2)只有1个订单,价格为158.01美元。

重要的是要意识到,通常一对多关系实际上不会向表中添加任何列,即“一”。 Jim Kenshaw没有额外的列来描述与Customer的关系。实际上,Order可能与CustomerShippingAddress表之间存在一对多关系,但没有向SalesCall表添加其他列。

但是,对于要描述的多对一关系,通常会在“many”表中添加Customer列,这是“one”表的外键 - 在这种情况下id列添加了customer_id列。要将$ 12.34与Order相关联的订单#10,我们会将Bill Smith列分配给customer_id的ID为1。

但是,也可能有另一个描述Bill SmithCustomer关系的表,因此不需要向Order表添加其他字段。可以Order表包含customer_idOrder的密钥,而不是向Customer_Order表添加Customer字段。

Order

在这种情况下,一对多多对一都是概念性的,因为它们之间没有架构更改。哪种机制取决于您的架构和SQL实现。

希望这有帮助。

答案 3 :(得分:6)

回答你的第一个问题是:两者都相似,

回答你的第二个问题是:一对多 - > MAN(MAN表)可能有多个妻子(WOMEN表)多对一 - >不止一个女人嫁给了一个男人。

现在,如果要将此关系与两个表MAN和WOMEN关联,则一个MAN表行可能与WOMEN表中的行有很多关系。希望它清楚。

答案 4 :(得分:4)

没有区别。这只是语言和偏好的问题,关于你在哪种方式陈述关系。

答案 5 :(得分:2)

一对多和多对一在多重性方面相似,但不是方面(即方向性)。

实体类之间的关联与表之间的关系的映射。关系有两类:

  1. 多重性(ER术语:基数)
    • 一对一的关系:示例丈夫和妻子
    • 一对多关系:示例母亲和儿童
    • 多对多关系:示例学生和主题
  2. 方向性:不会影响映射,但会对我们如何访问数据产生影响。
    • 单向关系:引用其他实体的关系字段或属性。
    • 双向关系:每个实体都有一个关系字段或属性,引用另一个实体。

答案 6 :(得分:2)

示例

Two tables with one relation

SQL

在SQL中,只有一种关系,它称为引用。 (您的前端可能会做些有用或令人困惑的事情(例如在某些《答案》中,但这是另一回事。)

  • 一个表( referenc ing 表)中的外键
    参考
  • 另一个表( referenc ed 表)中的主键
  • 在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是一对多的
  • 现在您可以感知(看看)相反的关系,Bar::Foo是多对一的
    • 但是不要让您感到困惑:对于任何Bar行,它仅引用一个Foo
  • 在SQL中,这就是我们所拥有的。那就是所有必要的。
  

一对多和一对多关系的真正区别是什么?

只有一种关系,因此没有区别。感知(从一个“端点”或另一个“端点”)或向后读取它不会改变关系。

基数

基数首先在数据模型中声明,这意味着逻辑和物理(意图),然后在实现中(实现的意图)声明。

Cardinality

一对多一对零
在SQL中,(上面的)全部是必需的。

一对多
您需要 Transaction 来强制在“引用”表中进行操作。

一对零(一对零)
您需要在Bar

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

一对一
您需要 Transaction 来强制在“引用”表中进行操作。

多对多
在物理级别上没有这样的东西(回想一下,SQL中只有一种类型的关系)。

在建模练习的早期逻辑层次上,绘制这样的关系很方便。在模型接近实现之前,最好将其提升为仅使用可以存在的事物。通过实现关联表可以解决这种关系。

Many-to-many Resolved

答案 7 :(得分:1)

这是一个很好的问题,根据我的经验,在 ERD 图表和关系数据库中暗示了方向。在 RDBMS 中,您总是定义多对->一(普通情况下一对->一)关系。关系的多方面,又名孩子,引用一方,又名父母,你用外键约束来实现它。从技术上讲,您必须访问索引,获取一侧的主键记录,然后访问该记录以获取更多信息。

除非我们谈论对象关系 DBMS,例如 Postgres、Intersystems Cache 等,否则您不能反过来这样做。这些 DBMS 允许您定义两个实体(表)之间的双向关系。在这种情况下,以相反的方式访问记录,即 One--To-->Many 是通过使用引用数组(子项)来实现的。在 ORM 中,您的类以我们在此处描述的相同方式相互引用。

警告:严格来说,IT 市场中的大多数 RDBMS 都不是关系数据库管理系统,请考虑空值、重复记录等,其中许多允许的功能破坏了关系的定义。

答案 8 :(得分:0)

没有实际的区别。正如Devendra所说明的那样,只要根据你看待问题的方式使用最有意义的关系。

答案 9 :(得分:0)

  • ---一对多---父母可以有两个或两个以上的孩子。
  • ---多对一---这三个孩子可以有一个父母。

    两者都相似。这可以用于属于需要。如果你想为特定的父母找到孩子,那么你可以和一对多一起去。或者,想要找一对双胞胎的父母,你可以选择多对一。同样...,

答案 10 :(得分:0)

一对多和多对一关系在谈论相同的逻辑关系,例如,一个所有者可能有很多房屋,但是一个房屋只能有一个所有者。

因此,在此示例中,所有者是一个,房屋是多个。 每个家庭总是有一个owner_id(例如外键)作为额外的列。

这两者之间在实现上的区别在于哪个表定义了关系。 在一对多中,所有者是定义关系的地方。例如,owner1.homes列出所有具有owner1的owner_id的房屋 在多对一中,定义关系的位置是“家”。例如,home1.owner列出了owner1的owner_id。

我实际上不知道在什么情况下会实现多对一的安排,因为您已经知道owner_id似乎有点多余。也许与删除和更改的整洁有关。

答案 11 :(得分:0)

我可以对这种关系给出的最简单的解释是捎带evendra D. Chavan'sanswer。

使用部门和员工关系

一个部门可以有多个员工,所以从员工方面看是one-to-many关系,从部门方面看是many-to-one relationship

但是如果一个员工也可以属于多个部门,我们也可以从员工方面说现在是many而不是one,所以关系变成many-to-many< /p>

换句话说,一个简单的理解是,如果可以从双方看到 many-to-many,我们可以说关系是 one-to-many 那就是如果;

  • 一名员工可以属于多个部门 (one-to-many)
  • 一个部门可以有多个员工 (one-to-many)

答案 12 :(得分:-6)

一对多父类包含n个子元素,因此它是一个集合映射。

多对一有n个子级包含一个父级,因此它是对象映射