Спадкування із спільною таблицею (шаблон проєктування) — Вікіпедія
Спадкування зі спільною таблицею (інша назва Наслідування з одною таблицею, англ. 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; } }
Див. також[ред. | ред. код]
- Успадкування (програмування)
- Наслідування з таблицею для кожного класу
- Наслідування з таблицею для кожного конкретного класу