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

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

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

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