Mysql 如何高效地存储位置和路径,并找出最短的旅行路线
我在解决面试问题时被卡住了Mysql 如何高效地存储位置和路径,并找出最短的旅行路线,mysql,oracle,postgresql,database-design,Mysql,Oracle,Postgresql,Database Design,我在解决面试问题时被卡住了 place C place A----------Place B place D 假设有3-4条路径,我可以从A地到达B地(直接路径和间接路径) 我必须存储它们并检索最短路径 我可以做这个表格,但我不能选择最短距离的路径 我创建了如下表 table1: create LocationDetails( locnid integer primary key, locnname text ); table 2: creat
place C
place A----------Place B
place D
假设有3-4条路径,我可以从A地到达B地(直接路径和间接路径)
我必须存储它们并检索最短路径
我可以做这个表格,但我不能选择最短距离的路径
我创建了如下表
table1:
create LocationDetails(
locnid integer primary key,
locnname text
);
table 2:
create PathDescription(
pathid integer primary key,
startlocnid integer,
endlocnid integer,
distance integer
);
ALTER TABLE PathDescription
ADD CONSTRAINT fk_PathDescription1
FOREIGN KEY (startlocnid)
REFERENCES Persons(locnid);
ALTER TABLE PathDescription
ADD CONSTRAINT fk_PathDescription
FOREIGN KEY (endlocnid)
REFERENCES Persons(locnid);
但现在的问题是,选择一条路径,尽可能地覆盖最小距离
从A地到B地有很多间接路径
请帮帮我
谢谢
关于选择最短路径,你应该使用Dijkstra算法,你会在google上找到很多信息和实现
在维基百科中还有一个伪代码片段:当使用PostgreSQL时,您可以使用PostGIS和。最短路径计算得到了很好的支持。对于Oracle,您可以使用以下递归查询:
with t(l1, l2, path, dist) as (
select loc_id_start, loc_id_end, 'A'||loc_id_end, distance
from paths where loc_id_start = 'A'
union all
select loc_id_start, loc_id_end, path||loc_id_end, distance+dist
from paths, t where t.l2 = paths.loc_id_start )
select path, dist from t where l2 = 'E'
PATH DIST
----- ----
ABE 11
ACE 10 <- shortest path
ADE 14
ABCE 15
ACDE 16
ABDE 24
ABCDE 21
您已经为三个不同的数据库标记了这个问题。那么您使用的是哪一种呢?如果您需要在加权图中实现路径查找,那么关系数据库+sql从一开始就是一个失败的解决方案。@zerkms:请解释,否则它看起来像是一种观点。@FrankHeikens图结构不适合关系DBMS,特别是当您需要对其执行操作时。您的回答证明:您没有提供纯SQL解决方案,而是提供了一个指向postgresql扩展的链接,该扩展在编程语言中实现,DBMS被用作虚拟存储(在这种情况下,它并不比纯文本文件好)。@zerkms:不比纯文本文件好吗?我很确定Oracle和PostgreSQL在地理信息系统和最短路径计算方面远不止是纯文本。它可能并不完美,但几乎在任何情况下都能工作。
create table paths
( loc_id_start varchar2(5),
loc_id_end varchar2(5),
distance number
);
insert into paths values ('A', 'B', 7);
insert into paths values ('A', 'C', 8);
insert into paths values ('A', 'D', 9);
insert into paths values ('B', 'C', 6);
insert into paths values ('B', 'D', 12);
insert into paths values ('C', 'D', 3);
insert into paths values ('B', 'E', 4);
insert into paths values ('C', 'E', 2);
insert into paths values ('D', 'E', 5);