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

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

Наслідування з таблицею для кожного класу (англ. Class Table Inheritance) — шаблон проєктування, який пропонує зберігати ієрархію наслідування класів в окремих таблицях.

Опис[ред. | ред. код]

Оскільки реляційні бази даних не підтримують наслідування, потрібно придумати спосіб відображення такої ієрархії в сховищі.

Одним із рішень буде зберігати кожний клас в окремій таблиці. Тоді колонками у таких таблицях будуть лише необхідні поля класів ієрархії.

Застосування[ред. | ред. код]

  • В Entity Framework даний підхід називається Table Per Type (TPT).

Переваги та недоліки[ред. | ред. код]

Переваги[ред. | ред. код]

  • Таблиці не займають зайвої пам'яті оскільки зберігають лише описані поля
  • Зв'язок між моделлю і схемою бази даних простий і зрозумілий
  • Зміни у батьківських класах не впливають на структури таблиць спадкоємців

Недоліки[ред. | ред. код]

  • Завантаження об'єкта вимагає запиту одразу до кількох таблиць
  • Переміщення полів в дочірній чи батьківський клас вимагає зміни структури таблиць
  • Таблиці батьківських класів стають вузьким місцем усі запити їх використовують
  • Необхідна синхронізація значень між таблицями

Реалізація[ред. | ред. код]

обрамлення
обрамлення

Нехай дана ієрархія об'єктів.

public class Player
{
    public string Name { get; set; }
}

class Footballer : Player
{
    public string Club { get; set; }
}

class Cricketer : Player
{
    public int BattingAverage { get; set; }
}

Тоді у сховищі ці об'єкти представлятимуться таблицями, які міститимуть лише необхідні поля.

public class PlayerTable
{
    public int Id { get; set; }
    public string Name { get; set; }
}

class FootballerTable
{
    public int PlayerId { get; set; }
    public string Club { get; set; }
}

class CricketerTable
{
    public int PlayerId { get; set; }
    public int BattingAverage { get; set; }
}

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

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