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

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

Опис ред.

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

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

Застосування ред.

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

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

Переваги ред.

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

Недоліки ред.

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

Реалізація ред.

 

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

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 string Name { get; set; }
}

class FootballerTable
{
    public string Name { get; set; }
    public string Club { get; set; }
}

class CricketerTable
{
    public string Name { get; set; }
    public int BattingAverage { get; set; }
}

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

Джерела ред.