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

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

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

Див. також

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

Джерела

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