Спадкування із спільною таблицею (шаблон проєктування)
Зовнішній вигляд
Спадкування зі спільною таблицею (інша назва Наслідування з одною таблицею, англ. Single Table Inheritance) — шаблон проєктування, який пропонує зберігати ієрархію наслідування класів у вигляді однієї таблиці.
Оскільки реляційні бази даних не підтримують спадкування, потрібно придумати спосіб відображення такої ієрархії в сховищі.
Рішенням буде зберігати всю ієрархію в одній таблиці. Тоді колонками у такій таблиці будуть усі поля всіх класів ієрархії.
- У Hibernate (Java) та Entity Framework даний підхід називається Table-Per-Class-Hierarchy та Table-Per-Hierarchy (TPH) відповідно. Колонка яка відповідає за тип об'єкту називається дискримінатор (Discriminator).
- У структуру бази додається лише одна таблиця
- Не потрібні JOIN команди для отримання даних, лише WHERE
- Переміщення полів в дочірній чи батьківський клас не вимагає зміни структури таблиці
- Необхідно додати колонку, яка відповідає за тип об'єкта
- Деякі колонки таблиці використовуються лише певними класами ієрархії, що призводить до витрат пам'яті
Нехай дана ієрархія об'єктів.
public class Player
{
public string Name { get; set; }
}
class Footballer : Player
{
public string Club { get; set; }
}
class Cricketer : Player
{
public int BattingAverage { get; set; }
}
Тоді у сховищі ці об'єкти представлятимуться однією таблицею.
class PlayerTable
{
// поле необхідне, щоб розрізняти тип в ієрархії
public int Type { get; set; }
public string Name { get; set; }
public string Club { get; set; }
public int BattingAverage { get; set; }
}