Гибернация подходящей стратегии наследования

Это родительский класс

@MappedSuperclass
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public  class APostCommon extends Actionable {    

   private static final long serialVersionUID = 1L;

   @Column(name = "TITLE")
   private String title;

   @Lob
   @Column(name="DESCRIPTION")
   private String description;

   //omitted others for purity
}

Это детский класс

 @Entity
 @Table(name="QUESTION")
 public class Question extends APostCommon {

    private static final long serialVersionUID = 1L;

    @Transient
    private List<Answer> answers;

    @Column(name="FOLLOW_COUNT")
    private Integer followerCount;

    @Column(name="ANSWER_COUNT")
    private Integer answerCount;

    //omitted others for purity
}

Answer отличается от суперкласса только включением questionId поле

@Entity
@Table(name="ANSWER")
public class Answer extends APostCommon{

   private String questionId;
   //omitted others for purity
}

Какая модель данных подходит для меня. Должен ли я использовать InheritanceType.SINGLE_TABLE или же TABLE_PER_CLASS, Что произойдет, когда в будущем появятся миллионы записей?

1 ответ

Решение

Когда я готовился к сертификату JPA, вот мои вишневые заметки по обеим стратегиям:

Стратегия единого стола

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

SQL, необходимый для выполнения этих операций, прост, оптимизирован и не требует объединения

  • Плюсы в вашем случае: возможно, ваш дизайн не будет хорошим и нормализованным, но вы избавите себя от головной боли, связанной с производительностью, а также ваши запросы будут намного проще, особенно если вы ожидаете иметь миллионы записей для вопросов и ответов.
  • Минусы в вашем случае: я предполагаю, что вопрос и ответ будут иметь много общего, но также, с течением времени и ростом таблицы, будет много разных свойств / столбцов. В результате вы можете получить одну из этих раздутых таблиц, в которой хранится всякое возможное множество данных, и в какой-то момент его невозможно поддерживать (ни разу мне не потребовалось одобрение всего отдела и несколько дней тестирования, чтобы добавить один индекс в один из столбцов стол как этот).

Объединенная стратегия

Отображение таблицы на объект обеспечивает повторное использование данных, которое предлагает нормализованная схема данных, и является наиболее эффективным способом хранения данных, которые совместно используются несколькими подклассами в иерархии.

  • Плюсы в вашем случае: со временем количество дополнительных отдельных столбцов между таблицами вопросов и ответов не является проблемой, поскольку ваша схема хороша и нормализована, поэтому у каждого из них есть логическое место. Дизайн чистый, понятный, поддерживаемый и масштабируемый (возможно, вам может понадобиться добавить больше абстракции к специализированным Вопросам и Ответам).
  • Минусы в вашем случае: с миллионами строк для вопросов и ответов вам понадобится как минимум одно дополнительное объединение для базовых запросов, хотя, если вы будете поддерживать его нормализацию по мере роста столбцов / функций, минимальное количество объединений будет выше, чем это.

Вывод:

Изначально я склонялся к Единому столу, но, потратив немного времени, он осознал, что это будет "ленивое" решение (положите все в одну сумку и забудьте о дизайне). Объединенные столы кажутся более зрелым решением когда вам нужно подумать о своей стратегии индексирования, сколько таблиц вы должны нормализовать (и какие группы данных) и, наконец, придумать эффективные запросы, пакетные операторы.

Решение за вами, но если вы пойдете за объединенную стратегию, вы определенно увеличите свой набор навыков, поскольку это будет более требовательным.

Другие вопросы по тегам