Перейти до вмісту

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

Матеріал з Вікіпедії — вільної енциклопедії.

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

Див. також

[ред. | ред. код]

Джерела

[ред. | ред. код]