TL; DR: Вы присваиваете атрибуты объектам, которым они не принадлежат. См. Диаграмму ниже.
Вот как может выглядеть ваша модель:
Ниже приведены некоторые подробности:
- Ваша таблица
Languages
в порядке. - Идентификатор страны не должен включать язык. Это должно быть единое поле, поскольку страны, как правило, не зависят от каких-либо других субъектов.
- Как правило, каждая страна имеет один флаг. Вы можете переместить фактическое изображение в отдельную таблицу, связанную от 1: 1 до
dbo.Countries
, или вы можете включить данные в страну напрямую, как в примере модели. - Не использовать
image
или другие подобные типы данных в новой разработке, они устарели уже 15 лет. - Список официальных языков зависит от комбинации
country + language
. - Таблица
dbo.Country
имеет альтернативный ключ ( отмечен <ak>
на диаграмме) в столбце EnglishName
(потому что вам нужен какой-либо способ отличить guish стран друг от друга, не прибегая к таблице dbo.CountryLanguages
). Этот подход спорен; если вам не нравится жестко задавать здесь какой-либо язык, вы можете использовать какой-нибудь другой естественный ключ для страны. Сверху головы, ISO 3166 коды могут быть хорошим выбором.
Вот DDL для модели, чтобы ее было легче понять:
/*==============================================================*/
/* Table: Countries */
/*==============================================================*/
create table dbo.[Countries] (
[Id] int identity(1,1),
[EnglishName] varchar(100) not null,
[FlagImage] varbinary(max) not null,
constraint [PK_Countries] primary key (Id),
constraint [UQ_Countries_EnglishName] unique (EnglishName)
)
go
execute sp_addextendedproperty 'MS_Description',
'Country identifier',
'schema', 'dbo', 'table', 'Countries', 'column', 'Id'
go
execute sp_addextendedproperty 'MS_Description',
'Country name in English',
'schema', 'dbo', 'table', 'Countries', 'column', 'EnglishName'
go
execute sp_addextendedproperty 'MS_Description',
'Country flag image',
'schema', 'dbo', 'table', 'Countries', 'column', 'FlagImage'
go
/*==============================================================*/
/* Table: CountryLanguages */
/*==============================================================*/
create table dbo.[CountryLanguages] (
[CountryId] int not null,
[LanguageId] int not null,
[CountryName] nvarchar(100) not null,
constraint [PK_CountryLanguages] primary key (CountryId, LanguageId)
)
go
execute sp_addextendedproperty 'MS_Description',
'Country identifier',
'schema', 'dbo', 'table', 'CountryLanguages', 'column', 'CountryId'
go
execute sp_addextendedproperty 'MS_Description',
'Language identifier',
'schema', 'dbo', 'table', 'CountryLanguages', 'column', 'LanguageId'
go
execute sp_addextendedproperty 'MS_Description',
'Name of the country in that language',
'schema', 'dbo', 'table', 'CountryLanguages', 'column', 'CountryName'
go
/*==============================================================*/
/* Table: Languages */
/*==============================================================*/
create table dbo.[Languages] (
[Id] int identity(1,1),
[Name] nvarchar(100) not null,
constraint [PK_Languages] primary key (Id)
)
go
execute sp_addextendedproperty 'MS_Description',
'Language identifier',
'schema', 'dbo', 'table', 'Languages', 'column', 'Id'
go
execute sp_addextendedproperty 'MS_Description',
'Language name',
'schema', 'dbo', 'table', 'Languages', 'column', 'Name'
go
alter table dbo.CountryLanguages
add constraint FK_CountryLanguages_Countries_CountryId foreign key (CountryId)
references dbo.Countries (Id)
go
alter table dbo.CountryLanguages
add constraint FK_CountryLanguages_Languages_LanguageId foreign key (LanguageId)
references dbo.Languages (Id)
go