2

我是 SQL 新手,正在学习邻接列表、嵌套集、闭包表,但据我了解,这些解决方案通常适用于非循环数据。

我知道这类问题可能更适合 Neo4j 等图形数据库引擎,我也在探索这一点。但是对于这个问题,我特别想知道我是否可以在SQLite中实现这个目标。

在提出可能的答案之前,请帮助我了解如何更好地定义或说明问题。一旦问题定义被提炼出来,然后给我指出正确的方向(技术、参考资料),让我试着弄清楚。

目标:

  1. 维护区域列表及其连接方式。
  2. 区域可以有不同的类型:国家、高速公路、州、城市、社区。
  3. 区域可以循环连接(无向)。
  4. 区域可以有多个出口。
  5. 维护区域内从一个出口到另一个出口的加权列表。
  6. 提取从一个区域到另一个区域的最佳路径(从这个社区到最近的高速公路)。

假设:

  1. 将使用 SQLite 3(最新版本)。
  2. 小型数据集(< 1,000 个区域和连接,< 5s 创建数据库)。
  3. 相对静态(< 5 次插入或更新/年)。
  4. 从头开始重新创建数据库可能比更新更简单?
  5. 高速公路是区域,而不是连接器。
  6. 街道是合乎逻辑的连接器,没有长度,没有重量。

区域和连接就像一个有许多房间的房子,有多个门。门连接房间。没有穿过门的横向重量。选择门的重量来自门之间的距离。走廊就像一扇延伸的门,所以它有重量,被认为是一个类型的房间。一个房间的面积可能很大,但如果只有两扇门彼此靠近,它的重量可能会很小。对我来说,重要的不是房间的大小,而是门之间的距离。

一如既往,感谢您抽出宝贵时间阅读并提出建设性意见。

4

1 回答 1

0

是的,可以使用 SQLite 来存储这种数据。这不切实际,您可能会遇到性能问题。如果您计划存储大量此类数据并想要一个可扩展的解决方案,您应该选择一些图形数据库。

如果您要存储约 1000 个节点,则可以使用 SQLite 中的简单实体。

特别是由于您将进行很少的更新,您可以预先计算距离。因此,您不必每次都实际重新计算它,而只需从数据库中加载。

我认为您应该将您的问题表示为图表。

图形表示

节点可能是“门”,它们之间的距离是边缘。您可以轻松地将其存储在关系数据库中。(区域(Id,名称),门(Id,Area1,Area2)DoorDoorDistance(Door1,Door2,距离))

如果你已经存储了这些数据,你就可以计算出从每一扇门到另一扇门的最短路径。您可以将其存储在新表中。(距离(门 1、门 2、路径、距离))

要计算最短路径,您可以找到不同的算法: 最短路径算法

在此之后,您将获得每对门之间的最短路径。

从现在开始的唯一问题是从起始区域到目的地区域的哪扇门的女巫门。

如果您不想如此精确,则只需选择路径最短的那个。否则,您必须保持与区域起点的门距离。一个; 您可以假设您从区域的中心开始,因此您可以存储距中心 B 的门距离;通过存储准确的门位置并计算从确切起点开始的门距离,您可以更加精确。

在这两种情况下,您都应该在起始区域和目标区域选择成本最低的门:

总成本:(步行到门的距离)+(起始门到目的地门路径)+(步行到目的地区域内的目的地)

我会这样做。我希望我能帮上忙,玩得开心!

于 2013-12-27T11:02:16.523 回答