gpt4 book ai didi

java - 迷惑与势是有关系的

转载 作者:行者123 更新时间:2023-11-30 22:57:55 27 4
gpt4 key购买 nike

我正在尝试配置一个新的数据库设计,因为我们已经决定迁移到 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 关系,那么我想到的第一个(但不是最好的)想法是拥有一个外键CardMyCard 之间的关系中,因为这在技术上会强制两个表之间的关系不被复制。但是,如果您有一个 MyCard 基关系和一些其他可能的关系,例如 MyCard1MyCard2、... MyCard999 而您的 Card 不一定与它们中的每一个都匹配,那么您的 Card 关系将填充 999 个很少有值的字段。

即使只有一个 MyCard 关系,从 Card 到它的 外键 也是不必要的,因为,如果我们始终如一将它用作是一个关系,那么它将是一个关系而不是有一个,即使没有技术差异在两种表示之间。

因此,最好只创建一个从 MyCardCard外键,因为这样

  • 您的架构尽可能简单
  • 您的架构尽可能易于维护

那么,我们如何在 OOP 中表示它呢?

我们可以在 MyCard 中有一个字段代表 Card

简而言之:这看起来像一个是一个关系,但由于它一直被用作一个有一个关系,它本质上是一个有一个 关系。

关于java - 迷惑与势是有关系的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451873/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com