我担心我的问题可能会有点无意义,因为我只是从数据库开始,但我会尽我所能......所以在我的大学,我们使用Oracle Data Modeler来建模数据库。问题是:何时将一个实体的主要UID作为外键传递给另一个实体?从我(通过实验,我不能谷歌...)发现,两个实体交换他们的PK时,他们的1:1绑定 - 但其他类型的绑定怎么样?密钥传递哪一侧标记为可选项是否重要?
答案 0 :(得分:0)
您需要研究不同类型的关系及其映射。
根据我所拥有的一点点知识,这里有三种类型的关系:
<强>一对一的强>
这是一个表的一行与另一个表的零行或一行相关的关系。理想情况下,这种关系不应该在两个不同的表中实现。只有一个表就足够了。
例如。 - 考虑我们有person
和permanent_address
表。我们假设,根据业务规则,一个人只能有一个永久地址。所以,我们可以:
person(personid, firstname, lastname, ...)
permanent_address (permanent_addressid, personid, line1, line2, ...)
personid
表中的permanent_address
引用personid
表的person
列。
如果要强制使用外键,可以在列中添加NOT NULL
约束。
<强>许多-to_one 强>
这是一种更通用和广泛使用的关系,其中一个表中的许多行与另一个表中的一行相关。
例如,如果您有一个业务规则,其中一个人可以拥有多辆汽车,那么您有:
person(person_id, first_name, last_name, birthdate, ...)
car (licence_plate_number, person_id, carname, ...)
person_id
表中的car
引用person_id
表中的person
。
<强>许多对多强>
这是一种关系,其中一个表中的许多行可以与另一个表中的零,一个或多个行相关。
例如,一个人可以有很多爱好。很多人都可以分享一个爱好。因此,我们可以按如下方式实现这种关系:
person (person_id, first_name, last_name, birthdate, ....)
hobby (hobby_id, hobby_name, hobby_type, ...)
person_hobby (person_id, hobby_id)
其中person_id
表中的person_hobby
引用person_id
表的person
,而hobby_id
表中的person_hobby
表示hobby_id
hobby
表的。该中间表是实现这种多对多关系所必需的。我们可以对列集(person_id,hobby_id)强制执行PRIMARY KEY
约束作为复合主键,以避免多次为同一个人分配相同的爱好。