域模型/ JPA实体模型是否应该创建一个设计良好的数据库表结构?

时间:2016-08-04 09:21:06

标签: jpa database-design

让我们假设应该从头开始构建的应用程序的域模型描述如下:

一个人可能住在一个地址。一个人可以拥有多辆汽车。

如果我必须先设计数据库,我可能会想出以下数据库设计(规范化,级联等不应该对我的具体问题起主要作用)。

Person (id, name)
Address (id, street, zip, city, person_id)
Car (id, manufacturer, yearBuilt, color, person_id)

我主要遵循标准设计概念(例如在此链接http://db.grussell.org/section006.html中描述)。

正如您所看到的,地址表具有person表的外键,因为person - address关系可以被视为可选。

一个人可以拥有多辆汽车的事实是通过将外键放入汽车牌桌中的人来实现的。我认为这是建立1..m关系的标准方法。

如果我必须先设计域模型,我可能会想出以下设计:

public class Person {

    private String name;
    private Address address;
    private List<Car> cars;

    // Getters and setters
}

public class Address {

    private String street;
    private String zip;
    private String city;

    // Getters and setters
}

public class Car {

    private String color;
    private Date yearBuilt;

    // Getters and setters
}   

在该域模型中,Person类具有所有必要的关系。 AddressCar课程不需要了解他们拥有Person的任何内容。

我现在可以通过添加@Entity并为每个类提供@Id属性将这些类转换为JPA实体。

@Entity
public class Person implements Serializable {

    @Id
    private Long id;
    private String name;
    @OneToOne
    private Address address;
    @OneToMany
    private List<Car> cars;

    public Person() { }

    // Getters and setters
}

@Entity
class Address implements Serializable {

    @Id
    private Long id;
    private String street;
    private String zip;
    private String city;

    public Address() { }

    // Getters and setters
}

@Entity
class Car implements Serializable {

    @Id
    private Long id;
    private String color;
    private Date yearBuilt;

    public Car() { }

    // Getters and setters
}

如果我的JPA提供程序根据提供的注释创建表,则会创建以下数据库结构:

Person (id, name, address_id)
Address (id, street, zip, city)
Car (id, manufacturer, yearBuilt, color)
Person_Car (person_id, car_id)

正如您所看到的,如果我必须首先设计数据库,那么这与我创建的数据库结构不对应。我在JPA提供者创建的数据库模型中看到了一些缺陷:

  1. 由于人员 - 地址关系是可选的,我会将一个Person的外键放入Address表中,反之亦然。
  2. 由于建立1..m关系的标准方法是将拥有类的外键放入详细信息类中,我将永远不会提出关系或关联表。如果没有其他属性描述关系,我为什么要这样做呢?
  3. 要将Person加入Car,JPA提供程序需要对关系或关联表执行其他连接。这会显着降低性能吗?
  4. 我现在可以做的是为JPA实体类提供额外的字段和/或注释,以争取人们可能期望的数据库结构。

    是否有必要争取能够创建预期数据库结构的域模型/ JPA实体设计(就像使用数据库优先方法一样)?如果是这样,是否可以使用与直接创建的域模型不同的域模型?设计领域模型/ JPA实体模型有哪些优势,可以创建某种最佳实践&#34;数据库结构?

1 个答案:

答案 0 :(得分:0)

将人员映射更新为Car,如下所示:

@OneToMany
@JoinColumn(name = "person_id")
private List<Car> cars;

然后,JPA提供程序的DDL生成器应该创建所需的表结构。