наследование одной таблицы (с Ebean + Play!рамки)
-
11-12-2019 - |
Вопрос
Я использую концепцию single table inheritance
конечно, из соображений ООП.
например, PostLike
и TopicLike
наследовать от Like
сорт.
Я вижу две проблемы в этой методологии:
- вместо двух таблиц (PostLike и TopicLike) я получаю «одну большую таблицу» лайков.
- в этой таблице есть дополнительный столбец под названием dtype что позволяет идентифицировать запись (т.е.типа лайк).в долгосрочной перспективе это может быть огромная трата дискового пространства.не так ли?
Я не эксперт по БД, и поэтому мне хотелось узнать ваше мнение о конструкции этой базы данных и о том, важны ли эти две проблемы.
Решение
Если у вас только одна таблица вместо двух, чтение будет быстрее, поскольку вы избежите «объединений».Но вы будете использовать больше места, потому что у вас будет дополнительный столбец «dtype» и несколько пустых столбцов.
Давайте возьмем пример.Вот модель (без аннотаций JPA):
public abstract class Like {
public Long id;
public String foo;
}
public class PostLike extends Like {
public String post;
}
public class TopicLike extends Like {
public String topic;
}
Ты получишь стол Like
:
----------------------------------
|dtype | id | foo | topic | post |
----------------------------------
|post | 1 | a | NULL | p1 |
|topic | 2 | b | t1 | NULL |
----------------------------------
И, как вы можете видеть, для элемента «PostLike» у вас будет значение NULL «topic».
Но в настоящее время дисковое пространство не является настоящей проблемой.
Единственный недостаток, который я вижу при наследовании одной таблицы, — это количество столбцов, которое может быть огромным, если у вас много свойств, и сложнее добавить новое свойство/столбец в вашу модель (если вам нужно применить эволюцию БД). .
И АФАИК, ebean поддерживает только «однотабличное наследование».