当我们只需要引用键的 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]))
- 1 - 英语
- 2 - 西班牙语
- 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 - 国家大学
- 2 - 1 - 西班牙
- 2 - 2 - 西班牙
- 2 - 3 - 意大利面
最后是疑问(因为国旗的图片是按国家/地区划分的,但不取决于语言)
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]))
结果应该是:
- 1 - 1 - (https://icons.iconarchive.com/icons/wikipedia/flags/16/US-United-States-Flag-icon.png)
- 2 - 2 - (https://icons.iconarchive.com/icons/wikipedia/flags/16/ES-Spain-Flag-icon.png)
- 3 - 3 - (https://icons.iconarchive.com/icons/wikipedia/flags/16/FR-France-Flag-icon.png)
我希望你能帮助我。
编辑:对不起,如果我不能很好地解释。
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: 您正在将属性分配给不属于它们的实体。见下图。
您的示例模型可能如下所示:
部分详情如下:
- 你的
Languages
table没问题。
- 国家标识符不应包含语言。它应该是一个单一的领域,因为国家往往不依赖任何其他实体。
- 一般来说,每个国家往往只有一面国旗。您可以将实际图片移动到单独的 table 中,将 1:1 链接到
dbo.Countries
,或者您可以将数据直接包含在国家/地区中,如示例模型中那样。
- 不要在新开发中使用
image
或其他类似的数据类型,它们已被弃用 15 年了。
- 官方语言列表取决于
country + language
组合。
-
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
我对在组合键时如何在 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]))
- 1 - 英语
- 2 - 西班牙语
- 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 - 国家大学
- 2 - 1 - 西班牙
- 2 - 2 - 西班牙
- 2 - 3 - 意大利面
最后是疑问(因为国旗的图片是按国家/地区划分的,但不取决于语言)
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]))
结果应该是:
- 1 - 1 - (https://icons.iconarchive.com/icons/wikipedia/flags/16/US-United-States-Flag-icon.png)
- 2 - 2 - (https://icons.iconarchive.com/icons/wikipedia/flags/16/ES-Spain-Flag-icon.png)
- 3 - 3 - (https://icons.iconarchive.com/icons/wikipedia/flags/16/FR-France-Flag-icon.png)
我希望你能帮助我。
编辑:对不起,如果我不能很好地解释。 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: 您正在将属性分配给不属于它们的实体。见下图。
您的示例模型可能如下所示:
部分详情如下:
- 你的
Languages
table没问题。 - 国家标识符不应包含语言。它应该是一个单一的领域,因为国家往往不依赖任何其他实体。
- 一般来说,每个国家往往只有一面国旗。您可以将实际图片移动到单独的 table 中,将 1:1 链接到
dbo.Countries
,或者您可以将数据直接包含在国家/地区中,如示例模型中那样。 - 不要在新开发中使用
image
或其他类似的数据类型,它们已被弃用 15 年了。 - 官方语言列表取决于
country + language
组合。 -
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