我可以在外键列中添加非原子值吗?

时间:2018-10-12 11:34:32

标签: sql sql-server database

我正在为我的学校项目创建一个数据库,以便从项目场景中给出的示例表中生成一个功能数据库。

在示例表中,有一个名为“路线”的列,该列在一个单元格中具有多个值,例如“伦敦塔山,格林威治,惠特斯特布尔”。我觉得减少冗余的最好方法是创建一个单独的“目的地”表,如下所示

create table Destinations(
    DestinationID varchar(5) primary key,
    Name varchar(45)
);

我将DestinationID用作行程表中的外键依赖项,如下所示。

create table Itineraries(
    ItineraryID varchar(5) primary key,
    Name varchar(20),
    DestinationID varchar(5) foreign key references Destinations(DestinationID)
);

是否可以在一行中插入多个目标并仍然减少冗余?

任何建议,谢谢您

3 个答案:

答案 0 :(得分:3)

为了以规范化的方式实现多对多关系,通常使用“桥表” ,它可以将关系的两侧链接起来。

例如:

CREATE TABLE Destinations (
    DestinationID VARCHAR(5) PRIMARY KEY
    ,Name VARCHAR(45)
);

CREATE TABLE Itineraries (
    ItineraryID VARCHAR(5) PRIMARY KEY
    ,Name VARCHAR(20)
);

CREATE TABLE ItineraryDestinations (
    ItineraryID VARCHAR(5) FOREIGN KEY REFERENCES Itineraries(ItineraryID)
    ,DestinationID VARCHAR(5) FOREIGN KEY REFERENCES Destinations(DestinationID)
);

如上所述,ItineraryDestinations表中的每一行都包含ItinerariesDestinations表中的记录ID,可让您向行程添加多个目的地,反之亦然,方法是添加多个行,每个行>目标链接。

答案 1 :(得分:0)

您要经历的过程称为“规范化”(或“规范化”,具体取决于您的样式指南)。如果您进行搜索,可能会在网上找到很多指南。

在您的情况下,您具有“多对多关系”:一个行程有多个目的地,但是一个目的地出现在多个行程中。外键只能表示一对多关系,因此在规范化数据库模式中,我们引入了一个新实体(称为“联接表”,“数据透视表”,“桥表”或类似名称)来表示该关系:

 CREATE TABLE Destinations_Itineraries
 (
      DestinationID varchar(5) foreign key references Destinations(DestinationID),
      ItineraryID varchar(5) foreign key references Itineraries(ItineraryID)
 )

此表中的每一行代表特定行程与特定目的地的关联。这将我们的多对多关系分解为两个一对多关系。

然后我们可以查询(或联接到)此表以查找行程中的所有目的地,或包含目的地的所有行程,而不必尝试将信息直接存储在Destinations表或Itineraries表。

答案 2 :(得分:0)

在一行中执行此操作的唯一方法是在Itineraries表中添加多个目标列,例如destination1,destination2等。但这很可能会产生一个稀疏的路线表。

因此,我建议您在表Destination和Itineraries之间使用n:m关系。然后,您可以将多个目的地分配给多个行程。