当前位置: 首页 > 知识库问答 >
问题:

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

杨安歌
2023-03-14

假设应用程序的域模型应该从头开始构建,如下所述:

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

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

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类具有所有必要的关系。地址和汽车类不需要知道他们所拥有的人的任何信息。

我现在可以通过添加@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的外键放入地址表中,反之亦然。
  2. 由于建模1... m关系的标准方法是将拥有类的外键放入详细类中,因此我永远不会提出关系或关联表。如果关系没有由附加属性描述,我为什么要这样做?
  3. 要将Person加入Car,JPA提供程序需要对关系或关联表执行额外的连接。这是否会显着降低性能?

我现在可以做的是为JPA实体类提供额外的字段和/或注释,以实现人们可能期望的数据库结构。

是否需要争取能够创建预期数据库结构的域模型/JPA实体设计(就像使用数据库优先方法一样)?如果是这样,是否可以接受不同于域模型的域模型一个人会直观地创建?设计将创建某种“最佳实践”数据库结构的域模型/JPA实体模型有什么优势?

共有1个答案

姚培
2023-03-14

更新从Person到Car的映射如下:

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

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

 类似资料:
  • 问题内容: 我有一个专栏 组 。 群组 具有存储在group_types中的不同类型(买方,卖方,裁判)。只有当该组是买方类型时,它才具有另一种(更专门)的类型,例如电气和机械类型。 我对如何将其存储在数据库中感到有些困惑。 有人可以建议我一个数据库结构吗? 谢谢 问题答案: 将您的存储为层次结构表(带有或模型): : 将选择中的所有买家。 : 将选择任何数据库中的所有买家。 如果您不需要层次结构

  • 在简单的示例中你可以使用 java.lang 和 java.util 包中的类, 还有用户自定义的Java Bean来构建数据对象: 使用 java.lang.String 来构建字符串。 使用 java.lang.Number 来派生数字类型。 使用 java.lang.Boolean 来构建布尔值。 使用 java.util.List 或Java数组来构建序列。 使用 java.util.Ma

  • 介绍 传统关系型数据库(MySQL)的模型,日常增删改查完全够用,支持复合主键、联合主键。 模型定义 喜闻乐见的对命名空间、类名无要求,只要按照规定写注解即可! @Entity 注解为定义实体类 @Table 注解为定义数据表 @Column 注解为定义字段 @DDL 定义表结构的 SQL 语句 建议使用模型生成工具:https://doc.imiphp.com/dev/generate/mode

  • 该项目是一个 TODO 应用,可以对任务清单进行增加、修改、删除等,相应地,我们需要设计一个数据模型来存储相应的数据和状态。不难想到,表的字段主要有以下几个: id: 标识每条记录的字段,是表的主键,Integer 类型; title: 即任务清单的标题,String 类型; posted_on: 任务创建时间,DATE 类型; status: 任务的状态,Boolean 类型; 因此,我们的数据

  • 在这个话题上有数百个类似的问题。但我仍然感到困惑,我希望得到专家的建议。 我们正在使用ASP开发一个应用程序。NETMVC4和EF5以及我们的是DB优先的方法。 我们在一个单独的项目中有数据层,该项目是一个类库,包含其中定义的所有实体。然后是用所有存储库和域模型定义的业务层(这是正确使用的术语)。然后是表示层。 目前我们还没有定义任何视图模型,我们使用的是与视图模型相同的BL域模型。在这种方法中,

  • 本文向大家介绍Django 根据数据模型models创建数据表的实例,包括了Django 根据数据模型models创建数据表的实例的使用技巧和注意事项,需要的朋友参考一下 如果使用默认的数据库 SQLite3,则无需配置settings.py 使用其他数据库,则需要配置settings.py,这里以Mysql为例; 在models.py中完成数据模型的创建: 并且在admin.py中完成注册: 最