我正在尝试配置一个新的数据库设计,因为我们已经决定迁移到Hibernate。在之前的Java代码中,我有以下三个类
超类
public abstract class Card {
private String firstname;
private String lastname;
private String email;
...
}
一个card子类
public class ContactCard extends Card{
private String variable1;
private String variable2;
private String variable3;
public ContactCard(){
super(firstname, lastname, email);
...
}
}
和其他一些跟进。这似乎工作良好。然而,我开始有点困惑了。这里我们的子类中有是的关系,有些牌是的牌。我未能映射到数据库表虽然。
例如,为了将卡片表的过程合并到数据库中,我可以为每个子类类型创建一个表,并且在这个表中我可以有一个引用卡片表的id(在用户注册时生成)。但是,现在这意味着在我的数据库中我已经把一个关系转换成有一个?子类现在有一张卡片而不是一张卡片。
我很困惑,希望有人能给我解释一下。
谢谢
这种混淆源于ORM必须将对象转换为关系,反之亦然。是一个关系,在OOP术语中表示子类,是扩展基类的类。然而,在RDBMS术语中,您拥有关系(或表,两者的含义相同)和属于所述关系的记录/实体。
现在,如果您有一个表映射到您的Card
类,那么子类(我现在将其称为MyCard
)本身不能在RDBMS中被继承,因为没有继承。因此,为了用表示这个概念,需要一些约定,而不是继承记录。
如果MyCard
有一个映射到Card
的foreign key
,那么这意味着有一个多对一的关系(只要Card
没有一个foreign key
,在这种情况下就会有一个一对一的关系)。
Card
和MyCard
关系中都有一个foreign key
,因为从技术上讲,这将强制两个表之间的关系不被复制。然而,如果你有一个MyCard
碱基关系和一些其他可能的关系,如MyCard1
, MyCard2
,…MyCard999
和Card
不一定都有匹配,那么你的Card
关系将被999个很少有值的字段填充。
即使有一个单独的MyCard
关系,从Card
到它的foreign key
是不必要的,因为,如果我们一直使用它作为是一个关系,那么它将是一个关系,而不是有一个,即使在两种表示之间没有技术差异。
MyCard
到Card
创建一个foreign key
,因为这样
- 你的模式是尽可能简单的
- 你的模式尽可能容易维护
那么,我们如何在OOP中表示这个呢?
我们可以在MyCard
中有一个字段代表Card
。
简而言之:这看起来像是是一个关系,但由于它一直被用作具有关系,因此它本质上是一个具有关系。