Используйте составной ключ в качестве внешнего ключа в таблице SQL Сервер, когда нам нужно ссылаться только на 1 элемент ключа - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть сомнения относительно того, как ссылаться на внешний ключ в таблице, когда ключ составлен, но мне нужна только 1 часть ключа.

Пример (в таблицах «Языки» и «Страны» есть нет проблем, сомнение в таблице «Флаги»:



    CREATE TABLE [dbo].[Languages](
        [Id_Language] [int] IDENTITY(1,1) NOT NULL,
        [Language] [varchar](50) NOT NULL
     CONSTRAINT [PK_Languages] PRIMARY KEY CLUSTERED ([Id_Language]))


  • 1 - Engli sh
  • 2 - Spani sh
  • 3 - французский
  • 4 - немецкий

    CREATE TABLE [dbo].[Countries](
        [Id_Country] [int] NOT NULL,
        [Id_Language] [int] NOT NULL,
        [Country] [nvarchar](80) NOT NULL,
     CONSTRAINT [PK_Countries] PRIMARY KEY CLUSTERED ([Id_Country], [Id_Language])
     FOREIGN KEY([Id_Language]) REFERENCES [dbo].[Languages] ([Id_Language]))


  • 1 - 1 - США
  • 1 - 2 - Estados Unidos
  • 1 - 3 - États Unis
  • 2 - 1 - Испания
  • 2 - 2 - Испания
  • 2 - 3 - Spagne

И, наконец, ЗДЕСЬ, наконец, сомнение (потому что изображение флага для каждой страны, но не зависит от языка)



    CREATE TABLE [dbo].[Flags](
        [Id_Flag] [int] IDENTITY(1,1) NOT NULL,
        [Id_Country] [int] NOT NULL, ------ HOW CAN I DO IT?????????????
        [Image] [image] NOT NULL
     CONSTRAINT [PK_Flags] PRIMARY KEY CLUSTERED ([Id_Flag]))

Результат должен быть:


Я надеюсь, что вы можете помочь мне с этим.

РЕДАКТИРОВАТЬ: Извините, если я мог бы н не объясняю хорошо. Таблица Страны содержит «страны», но с соответствующим переводом для каждого языка, поэтому не зависит от того, на каком языке говорит каждая страна, это просто одно и то же название страны на разных языках.

И затем «флаги» должен быть уникальным для каждой страны независимо от того, на каком языке мы ссылаемся.

Надеюсь, это поможет в качестве пояснения.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

TL; DR: Вы присваиваете атрибуты объектам, которым они не принадлежат. См. Диаграмму ниже.

Вот как может выглядеть ваша модель: Countries and their languages

Ниже приведены некоторые подробности:

  1. Ваша таблица Languages в порядке.
  2. Идентификатор страны не должен включать язык. Это должно быть единое поле, поскольку страны, как правило, не зависят от каких-либо других субъектов.
  3. Как правило, каждая страна имеет один флаг. Вы можете переместить фактическое изображение в отдельную таблицу, связанную от 1: 1 до dbo.Countries, или вы можете включить данные в страну напрямую, как в примере модели.
  4. Не использовать image или другие подобные типы данных в новой разработке, они устарели уже 15 лет.
  5. Список официальных языков зависит от комбинации country + language.
  6. Таблица 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
0 голосов
/ 26 апреля 2020

Если я правильно понимаю вопрос, вы хотите, чтобы таблица флагов ссылалась на таблицу стран? Если вы измените таблицу, добавив ограничение внешнего ключа, это означает, что при вставке / обновлении данных в таблицу флагов потребуется указать действительную страну.

ALTER TABLE dbo.Flags
ADD CONSTRAINT [fk_constraint_name] FOREIGN KEY (Id_Country)
REFERENCES dbo.Countries (ID_Country)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...