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);