Спадкування із спільною таблицею (шаблон проєктування) — Вікіпедія

Спадкування зі спільною таблицею (інша назва Наслідування з одною таблицею, англ. 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; } } 

Див. також[ред. | ред. код]

Джерела[ред. | ред. код]