我正在为我的学校项目创建一个数据库,以便从项目场景中给出的示例表中生成一个功能数据库。
在示例表中,有一个名为“路线”的列,该列在一个单元格中具有多个值,例如“伦敦塔山,格林威治,惠特斯特布尔”。我觉得减少冗余的最好方法是创建一个单独的“目的地”表,如下所示
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)
);
是否可以在一行中插入多个目标并仍然减少冗余?
任何建议,谢谢您
答案 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
表中的每一行都包含Itineraries
和Destinations
表中的记录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关系。然后,您可以将多个目的地分配给多个行程。