当我们只需要引用键的 1 个元素时,在 table SQL 服务器中使用组合键作为外键

Use composite key as foreign key in table SQL Server when we only need to reference 1 element of the key

我对在组合键时如何在 table 中作为外键引用有疑问,但我只需要键的一部分。

例子(Tables 'Languages'和'Countries'都没有问题,疑点在'Flags'Table:



    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]))



    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]))


最后是疑问(因为国旗的图片是按国家/地区划分的,但不取决于语言)



    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]))

结果应该是:


我希望你能帮助我。

编辑:对不起,如果我不能很好地解释。 table 个国家包含 'countries' 但每种语言都有相应的翻译,因此,它不取决于每个国家使用哪种语言,只是不同语言中的相同国家名称。

然后 'flags' 每个国家/地区应该是唯一的,而不依赖于我们所指的语言。

我希望这有助于澄清。

提前致谢。

如果我对问题的理解正确,您希望标志 table 指代国家 table?如果您通过添加外键约束来更改 table,这意味着当 inserting/updating 数据进入标志 table.

时需要提供有效的国家/地区
ALTER TABLE dbo.Flags
ADD CONSTRAINT [fk_constraint_name] FOREIGN KEY (Id_Country)
REFERENCES dbo.Countries (ID_Country)

TL;DR: 您正在将属性分配给不属于它们的实体。见下图。

您的示例模型可能如下所示:

部分详情如下:

  1. 你的Languagestable没问题。
  2. 国家标识符不应包含语言。它应该是一个单一的领域,因为国家往往不依赖任何其他实体。
  3. 一般来说,每个国家往往只有一面国旗。您可以将实际图片移动到单独的 table 中,将 1:1 链接到 dbo.Countries,或者您可以将数据直接包含在国家/地区中,如示例模型中那样。
  4. 不要在新开发中使用 image 或其他类似的数据类型,它们已被弃用 15 年了。
  5. 官方语言列表取决于 country + language 组合。
  6. dbo.Country table 在 EnglishName 列上有替代键(在图中标记为 <ak>)(因为您需要某种方式来区分国家/地区)无需求助于 dbo.CountryLanguages table)。这种做法是disputable;如果您不喜欢在这里硬编码任何一种语言,您可以为一个国家/地区使用其他一些自然键。最重要的是,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