Перейти до вмісту

Розмітка зв'язків таблиць (шаблон проєктування)

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

Розмітка зв'язків таблиць (англ. Association Table Mapping) — шаблон проєктування, який пропонує відображати колекції об'єктів у вигляді проміжних таблиць з зовнішніми ключами.

Об'єкти із легкістю можуть містити набір значень у вигляді колекцій. Реляційні бази обмежуються полями з одним значенням. При відношенні "один до багатьох" можна використати розмітку зовнішніх ключів. Але при відношенні "багато до багатьох" немає однозначної сутності на яку би посилався зовнішній ключ.

Рішення таке ж як і в реляційних базах даних — створення проміжної сутності, яка міститиме ключі.

Реалізація

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

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

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

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

class EmployeeSkillTable
{
        public int EmployeeId { get; set; }
        public int SkillId { get; set; }
}

Тоді у пам'яті таку структуру можна описати наступним чином. Правда в такому випадку ускладнюється логіка відображення об'єктів у моделі даних.

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

        public ICollection<Skill> Skills { get; set; }
}

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

        public ICollection<Employee> Employees { get; set; }
}

Або згідно шаблону.

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

        public ICollection<EmployeeSkill> Skills { get; set; }
}

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

        public ICollection<EmployeeSkill> Employees { get; set; }
}

class EmployeeSkill
{
        public int EmployeeId { get; set; }
        public int SkillId { get; set; }
}

Див. також

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

Джерела

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