惑与势是一种和有一种关系



我正在尝试配置一个新的数据库设计,因为我们已经决定迁移到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有一个映射到Cardforeign key,那么这意味着有一个多对一的关系(只要Card没有一个foreign key,在这种情况下就会有一个一对一的关系)。

如果我必须在表中创建关系,那么我想到的第一个(但不是最好的)想法是在CardMyCard关系中都有一个foreign key,因为从技术上讲,这将强制两个表之间的关系不被复制。然而,如果你有一个MyCard碱基关系和一些其他可能的关系,如MyCard1, MyCard2,…MyCard999Card不一定都有匹配,那么你的Card关系将被999个很少有值的字段填充。

即使有一个单独的MyCard关系,从Card到它的foreign key是不必要的,因为,如果我们一直使用它作为是一个关系,那么它将是一个关系,而不是有一个,即使在两种表示之间没有技术差异。

因此,最好只从MyCardCard创建一个foreign key,因为这样
  • 你的模式是尽可能简单的
  • 你的模式尽可能容易维护

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

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

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

最新更新