我可以使用SQLite来模拟任意图形(即带有周期的逻辑图)吗?

时间:2013-10-26 12:13:36

标签: sqlite database-design data-modeling

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

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

在为此提出可能的答案之前,请帮助我了解如何更好地定义或说明问题。一旦问题定义得到改进,然后指出正确的方向(技术,参考资料),让我试着弄明白。

目的:

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

    1. 将使用SQLite 3(最新版本)。
    2. 小数据集(< 1,000区域和连接,< 5s DB创建)。
    3. 相对静态(< 5插入或更新/年)。
    4. 从头开始重新创建数据库可能比更新更简单吗?
    5. 高速公路是区域,而不是连接器。
    6. 街道是逻辑连接器,没有长度,没有重量。
    7. 区域和连接就像一个房子,有许多房间有多个门。门连接房间。门上没有穿越重物。选择门的重量来自门之间的距离。走廊就像一扇延长的门,所以它有一个重量,被认为是一个类型的房间。房间可能有一个大的尺寸,但如果只有两个门彼此靠近,它可能有一个小的重量。这不是房间大小对我的目的而言,而是门之间的距离。

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

1 个答案:

答案 0 :(得分:0)

是的,可以使用SQLite存储此类数据。 这不实用,您可能会遇到性能问题。如果您计划存储大量此类数据并希望获得可扩展的解决方案,则应该使用图形数据库。

如果您要存储~1000个节点,那么可以使用SQLite中的简单实现。

特别是因为您的更新数量非常少,您可以预先计算距离。因此,您不必每次都重新计算它,而只需从数据库加载。

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

Graph representation

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

如果您已存储这些数据,则可以计算从每扇门到其他门的最短路径。您可以将其存储在新表中。 (距离(门1,门2,路径,距离))

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

在此之后,你在每对门之间有最短路径。

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

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

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

总费用:(步行到门距离)+(从门到目的地门路径开始)+(到达目的地区域的目的地)

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