JPA: возможен компромисс между наследованием одной таблицы и производительностью - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть следующие таблицы MS SQL DB, где я храню данные, относящиеся к школе:

HighSchools <--- GradeLevels <--- Courses <--- CourseGrades </em>

Отношения между таблицами выглядят так:

@Entity
@Table(name = "GradeLevels", schema = "dbo")
public class HighSchoolGradeLevel {

@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "AttendedId", nullable = false)
    private HighSchoolAttended highSchoolAttended;

@OneToMany(mappedBy = "highSchoolGradeLevel")
    @OrderBy("createdDate ASC") 
    private List<HighSchoolCourse> highSchoolCourses = new ArrayList<>(0);

// other fields and getter/setter methods....
}

@Entity
@Table(name = "Courses", schema = "dbo")
public class HighSchoolCourse {

@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "GradeLevelId", nullable = false)
    private HighSchoolGradeLevel highSchoolGradeLevel;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "highSchoolCourse", cascade={CascadeType.REMOVE, CascadeType.PERSIST})
    @OrderBy("createdDate ASC") 
    private List<HighSchoolCourseGrade> highSchoolCourseGrades = new ArrayList<>(0);

// other fields and getter/setter methods....

}

@Entity
@Table(name = "CourseGrades", schema = "dbo")
public class HighSchoolCourseGrade {

@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CourseId", nullable = false)
    private HighSchoolCourse highSchoolCourse;

// other fields and getter/setter methods....

}

Пользователи веб-приложения java могут выполнять операции CRUD с данными таблиц.

Новое требование состоит в том, чтобы использовать данные с такой же структурой от третьей стороны. Использованные данные НЕ ДОЛЖНЫ отображаться для пользователей веб-приложения.

Поэтому я думаю использовать наследование JPA для одной таблицы, которое позволяет мне:

  • избегать добавления клонов существующих таблиц
  • избегать клонирования существующих бизнес-логи c, который соответствует существующим типам сущностей
  • избегать рефакторинга кода существующих операций CRUD в случае реализации собственного столбца дискриминатора.

Наследование одной таблицы выглядит разумно для моего, но есть одна вещь, в которой я не уверен "Каков компромисс производительности при использовании наследования одной таблицы, особенно при работе на Родитель и его дочерние сущности? ". Вопрос может показаться пустым, зная тот факт, что Hibernate обновит SQL запросов соответствующими discriminator операторами. Но все же было бы неплохо улучшить текущие знания и быть уверенным, что существующие пользователи wep-приложения не получат плохой опыт использования.

Существующий слой DAO веб-приложения использует Spring Data JPA. В настоящее время каждая из существующих таблиц содержит более ~ 500 тыс. Записей.

...