混合数据库关系?

时间:2013-07-29 19:24:20

标签: mysql database orm relational-database entity-relationship

当有三个实体Table1 Table2Table3

时调用的关系是什么

Table1Table3有一对一的关系 Table2Table3有一对多的关系 Table3有两个复合键,Table1IDTable2ID

这种关系叫什么?我试图弄清楚如何在ORM中对此进行建模,但因为我甚至不知道这种关系是什么,我甚至不知道从哪里开始。

1 个答案:

答案 0 :(得分:0)

我们通常将其称为 reflexive bi-directional

在ORM中处理此问题并非易事。

如果您可以从Table1ID删除Table3列(删除指向后面的外键),这将简化模型。但这可能不适合你。

Hibernate将此称为双向关联; Hibernate只保留了该关联的一个“结束”;它不会在两个方向都保持外键。


修改

我查看了模型图(来自您在评论中提供的链接)。

personVehicleperson之间看起来非常像vehicle表是关联表。这与我们在解决多对多关系时会看到的模式相同。您的模型看起来像是多对多的特殊情况,其中关系的一侧仅限于一个。

就密钥而言,您的模型如下所示:

person 
  id    PK

vehicle
  id    PK

personVehicle
  person_id  PK, FK->person(id)
  vehicle_id PK, FK->vehicle(id)

如果我理解了你的要求,你想要在vehicle表上表示一个外键约束,该约束指向personVehicle表中的一行:

vehicle
  id    PK, FK->personVehicle(vehicle_id)

我不知道任何ORM会自动为您在vehicle表格中维护这种类型的双向外键。 (我认为不可能在外键列中维护该值,不能仅以ORM将双向维护外键的方式“声明”此关联。

(某些数据库,例如Oracle,允许我们创建和维护这样的关系,通过在插入,更新和删除时允许外部约束为DEFERRED,并将对外键约束的检查推迟到COMMIT。)< / p>

如果有一个外键,来自vehicle,指向personVehicle中的一行,并且要求personVehicle中的行需要引用回EXACT相同的行vehicle表中的行(而不仅仅是某行)然后您不需要vehicle表中的外键。该关系已在模型中通过personVehicle表中的外键充分表示。

如果您需要强制执行约束,即车辆最多只能与一个personVehicle相关,则需要personVehicle(vehicle_id)上的UNIQUE约束。这代表了模型中的充分要求。

如果这是真正的一对一,并且您需要一个外键,那么这实际上相当于完全删除vehicle表,并将该表中的属性合并到personVehicle表中。 / p>


修改

我对 reflexive 一词的使用可能不正确。我通常引用一个表,该表对同一表中的列的外键引用为递归

两个表之间的关系而言,其中每个表都有引用另一个表的外键...如果t1中的行指的是t2中的一行,那么t2中的行返回到t1,而不是指向任何行,而是返回到引用它的EXACT同一行...我想到的是关系被“反映”回来。

这种关系反映出来了。但我们不使用术语“反射”,因为该术语在Java中具有特殊含义。所以,也许唯一合适的术语是“双向”。

典型的双向一对一关系是一个表中的行指向另一个表中的一行,该行指向原始表中的EXACT同一行:

例如:

t1          t2
id  t2_id   id   t1_id
--- -----   ---- ------
1   A       A    1
2   B       B    2
3   C       C    3

另一种形式是行不一定引用回引用它的同一行。 (这通常不限于一对一),但我们仍然有指向两个方向的外键(从t1到t2,从t2到t1)

例如:

t1            t2
id  t2_id     id  t1_id
--- -----     --- ----
1   A         A   2
2   B         B   3
3   C         C   1

在第一种情况下,我们有一个要求,其中一行具有外键值,该外键值仅引用另一个引用回原始行的表中的行。这种关系“反映”了回来。

在第二种情况下,我们没有这个要求。如果我从第1行开始,它指向行A,它指向第2行。

在定义数据库中的外键关系方面,约束的定义是相同的。不同之处通常是外键列是否为NULL,或者必须是UNIQUE。

我认为除了“双向”之外还有一个术语区分了第一种情况和更普遍的第二种情况。我以为我曾使用过“反身”或“反思”这个词,但我可能会弄错。

就“递归”关系而言,外键指向同一个表中的一行,该外键(几乎)总是引用表中的一个不同的行;它没有回归自身。