1

恐怕我的问题措辞可能有点不准确,因为我刚开始使用数据库,但我会尽力而为……所以在我的大学,我们使用 Oracle Data Modeler 对数据库进行建模。问题是:一个实体的主 UID 何时作为外键传递给另一个实体?根据我(实验性地因为我无法用谷歌搜索出来......)发现,两个实体在 1:1 绑定时交换它们的 PK - 但是其他类型的绑定呢?传递哪一侧标记为可选的密钥是否重要?

4

1 回答 1

0

您需要研究不同类型的关系及其映射。

据我所知,以下是三种类型的关系:

  1. 一对一

    这是表的一行与另一表的零或一行相关的关系。理想情况下,这种关系不应在两个不同的表中实现。一张桌子就足够了。例如 - 考虑我们有personpermanent_address 表。我们假设,根据业务规则,一个人只能有一个永久地址。所以,我们可以有:

    person(personid, firstname, lastname, ...)
    permanent_address (permanent_addressid, personid, line1, line2, ...)
    

    其中personidinpermanent_address表是指表的personidperson

    如果要强制外键,可以NOT NULL向列添加约束。

  2. 多对一

    这是更通用和广泛使用的关系类型,其中一个表中的许多行与另一个表中的一行相关。

    例如,如果您有一个业务规则,其中一个人可以拥有多辆汽车,您有:

    person(person_id, first_name, last_name, birthdate, ...)
    car (licence_plate_number, person_id, carname, ...)
    

    其中person_idin cartable 是指person_idin persontable。

  3. 多对多

    这是一种关系,其中一个表中的许多行可以与另一个表中的零行、一行或多行相关。

    例如,一个人可以有很多爱好。一个爱好可以多人共享。因此,我们可以如下实现这种关系:

    person (person_id, first_name, last_name, birthdate, ....)
    hobby (hobby_id, hobby_name, hobby_type, ...)
    person_hobby (person_id, hobby_id)
    

    其中person_idin person_hobbytable 指的person_idpersontable,hobby_idin person_hobbytable 指的hobby_idhobbytable。这个中间表是实现这种多对多关系所必需的。我们可以PRIMARY KEY对列集 (person_id, hobby_id) 强制执行一个约束作为复合主键,以避免多次为同一个人分配相同的爱好。

于 2013-04-11T18:12:29.500 回答