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

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

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

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

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