Розмітка зовнішніх ключів (шаблон проєктування)

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

Опис ред.

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

Щоб зберегти граф об'єктів в сховище, необхідно перетворити ключ об'єкта за вказівником у зовнішній ключ.

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

 

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

class AlbumTable
{
        public int Id { get; set; }
        public string Title { get; set; }

        public int ArtistId { get; set; }
}

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

Тоді у пам'яті таку структуру описують наступні об'єкти.

class Album
{
        public int Id { get; set; }
        public string Title { get; set; }

        public Artist Artist { get; set; }
}

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

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

class Mapper
{
	public Album GetAlbum(AlbumTable albumTable, Artist artistTable)
	{
		if (albumTable.ArtistId != artistTable.Id) throw new InvalidOperationException();

		return new Album
		{
			Id = albumTable.Id,
			Title = albumTable.Title,
			Artist = new Artist
			{
				Id = artistTable.Id, // albumTable.ArtistId
				Name = artistTable.Name,
			},
		};
	}
	
	        
	public (AlbumTable, ArtistTable) GetAlbumWithArtistTable(Album album)
	{
		var albumTable = new AlbumTable
		{
			Id = album.Id,
			Title = album.Title,
		};
		
		var artistTable = new ArtistTable
		{
			Id = album.Artist.Id,
			Name = album.Artist.Name,
		};
			
		return (albumTable, artistTable);
	}
}

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

Джерела ред.