Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在数据库中存储两个位置之间的路由_Mysql_Database_Database Design - Fatal编程技术网

Mysql 在数据库中存储两个位置之间的路由

Mysql 在数据库中存储两个位置之间的路由,mysql,database,database-design,Mysql,Database,Database Design,有谁能告诉我,如何设计一个可以存储 起始位置(城市名称) 地点(城市名称,包括起点和终点) 位置,db应能够处理任意数量的位置) 结束地点(城市名称) 谢谢 编辑: 例如,我必须保留芝加哥和纽约之间的地方。 我不知道如何设计一个数据库,可以容纳 起点(芝加哥) 介于两者之间的位置(此处Iam主要对数据类型感到困惑) 终点(纽约) 您应该有另一个可以参考的表,该表与所有开始记录、传输记录和完成记录具有一对多的关系,因此您可以将整个“集合”记录“绑定”在一起 旅行 位置 在location\

有谁能告诉我,如何设计一个可以存储

  • 起始位置(城市名称)
  • 地点(城市名称,包括起点和终点) 位置,db应能够处理任意数量的位置)
  • 结束地点(城市名称)
谢谢

编辑:

例如,我必须保留芝加哥和纽约之间的地方。 我不知道如何设计一个数据库,可以容纳

  • 起点(芝加哥)
  • 介于两者之间的位置(此处Iam主要对数据类型感到困惑)
  • 终点(纽约)

您应该有另一个可以参考的表,该表与所有开始记录、传输记录和完成记录具有一对多的关系,因此您可以将整个“集合”记录“绑定”在一起

旅行 位置 在
location\u type
列中,您可以使用一些独特的标志,这些标志将告诉您位置记录是否表示开始、运输或完成。例如,开始可以是
0
的标志,
1
可以是运输标志,
2
可以是结束标志。

未测试

CREATE TABLE Location (
    ID INT UNSIGNED AUTO_INCREMENT,
    Name VARCHAR(50),
    PRIMARY KEY (ID)
) ENGINE=INNODB CHARACTER SET utf8

CREATE TABLE Trip (
    ID INT UNSIGNED AUTO_INCREMENT,
    Name VARCHAR(50),
    StartLocation INT UNSIGNED,
    EndLocation INT UNSIGNED,
    PRIMARY KEY (ID),
    CONSTRAINT Constr_Trip_StartLocation_fk
        FOREIGN KEY Trip_StartLocation_fk (StartLocation)
        REFERENCES Location (ID),
    CONSTRAINT Constr_Trip_EndLocation_fk
        FOREIGN KEY Trip_EndLocation_fk (EndLocation)
        REFERENCES Location (ID)
) ENGINE=INNODB CHARACTER SET utf8

CREATE TABLE TripStopoff (
    Trip INT UNSIGNED,
    StopoffNumber INT UNSIGNED,
    Location INT UNSIGNED,
    PRIMARY KEY (Trip, StopoffNumber),
    CONSTRAINT Constr_TripStopoff_Trip_fk
        FOREIGN KEY TripStopoff_Trip_fk (Trip)
        REFERENCES Trip (ID),
    CONSTRAINT Constr_TripStopoff_Location_fk
        FOREIGN KEY TripStopoff_Location_fk (Location)
        REFERENCES Location (ID)
) ENGINE=INNODB CHARACTER SET ascii

INSERT INTO
    Location
    (ID, Name)
VALUES
    (1, 'Chicago'),
    (2, 'Manoning'),
    (3, 'Jersey City'),
    (4, 'Newark'),
    (5, 'New York')

INSERT INTO
    Trip
    (ID, Name, StartLocation, EndLocation)
VALUES
    (1, 'My trip', 1, 5)

INSERT INTO
    TripStopoff
    (Trip, StopoffNumber, Location)
VALUES
    (1, 1, 2),
    (1, 2, 3),
    (1, 3, 4)

我有三张表:位置、路线和站点

locations:
    location_id | name

routes:
    route_id | description

stops:
    stop_id | location_id (fk) | route_id (fk) | stop_number
停止表是交联表。在插入位置时,让应用程序设置正确的停止编号。 然后,您可以通过简单的

select * from routes join stops join location
where route_id = ...    
order by stop_number
如果需要向管线插入位置,请使用两个查询:

update stops set stop_number = stop_number + 1 
where route_id = ... 
   and stop_number > 'inserted_stop_number';

insert into stops (route_id, location_id, stop_number) values // etc
理论上,链表(在这里存储对路线上下一站的引用)在概念上更接近现实,但在标准的Mysql选项中,从以这种方式存储的数据中获取列表非常困难,因此我建议不要使用链表,并保持简单


如果你真的需要更多的力量来创建和使用一个路由中的链接节点,你可以考虑学习:但是对于简单的开始,完成所有不需要重新计算的路由,上述的可能就足够了。你能补充更多细节吗?现在我不确定你是否需要帮助创建和设计数据库,或者只是其中一个。我需要帮助设计数据库(我很烂)。。谢谢好的,谢谢你的澄清。我知道你在问题中确实提到了设计,但有些人使用这个术语时比较松散,所以很难区分。

select * from routes join stops join location
where route_id = ...    
order by stop_number
update stops set stop_number = stop_number + 1 
where route_id = ... 
   and stop_number > 'inserted_stop_number';

insert into stops (route_id, location_id, stop_number) values // etc