我正在尝试配置一个新的数据库设计,因为我们已经决定迁移到 Hibernate。以前在我的 Java 代码中我有以下三个类
super 类
public abstract class Card {
private String firstname;
private String lastname;
private String email;
...
}
卡片子类
public class ContactCard extends Card{
private String variable1;
private String variable2;
private String variable3;
public ContactCard(){
super(firstname, lastname, email);
...
}
}
还有其他一些要跟进。这似乎工作正常。但是我开始有点困惑。这里我们有 is a 关系中的子类,一些卡片是卡片。不过,我无法将其映射到数据库表中。
例如,为了将卡片表的过程合并到数据库中,我可以为每个子类类型创建一个表,并且在该表中我可以有一个引用卡片表的 id(在用户注册时生成) ).但是,这现在意味着在我的数据库中,我已经将 is a relationship 转换为 has a? 子类现在有一张卡片,而不是一张卡片。
我很困惑,希望有人能为我解决问题。
谢谢
最佳答案
混淆源于 ORM 必须将对象转换为关系,反之亦然。 is a 是一种关系,表示 OOP 术语中的子类,即扩展基类 的类。但是,在 RDBMS 术语中,您有关系(或表,两者意思相同)和属于所述关系的记录/实体。
现在,如果您有一个映射到您的 Card
类的表,那么子类(我暂时称它为 MyCard
)本身不能继承你的 RDBMS,因为没有继承。因此,不是继承记录,而是需要一些约定来表示该概念。
如果 MyCard
有一个 foreign key
映射到 Card
,那么这意味着存在多对一关系(只要因为 Card
也没有 外键
,在这种情况下会有一对一的关系。
如果我必须在表中创建一个 is a 关系,那么我想到的第一个(但不是最好的)想法是拥有一个外键
在 Card
和 MyCard
之间的关系中,因为这在技术上会强制两个表之间的关系不被复制。但是,如果您有一个 MyCard
基关系和一些其他可能的关系,例如 MyCard1
、MyCard2
、... MyCard999
而您的 Card
不一定与它们中的每一个都匹配,那么您的 Card
关系将填充 999 个很少有值的字段。
即使只有一个 MyCard
关系,从 Card
到它的 外键
也是不必要的,因为,如果我们始终如一将它用作是一个关系,那么它将是一个关系而不是有一个,即使没有技术差异在两种表示之间。
因此,最好只创建一个从 MyCard
到 Card
的 外键
,因为这样
- 您的架构尽可能简单
- 您的架构尽可能易于维护
那么,我们如何在 OOP 中表示它呢?
我们可以在 MyCard
中有一个字段代表 Card
。
简而言之:这看起来像一个是一个关系,但由于它一直被用作一个有一个关系,它本质上是一个有一个 关系。
关于java - 迷惑与势是有关系的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451873/