我是SQL新手,了解邻接列表,嵌套集,闭包表,但据我所知,这些解决方案通常适用于非循环数据。
我知道这种问题可能更适合像Neo4j这样的图形数据库引擎,我也在探索。但对于这个问题,我特别想知道我是否可以在SQLite中实现这个目标。
在为此提出可能的答案之前,请帮助我了解如何更好地定义或说明问题。一旦问题定义得到改进,然后指出正确的方向(技术,参考资料),让我试着弄明白。
目的:
假设:
区域和连接就像一个房子,有许多房间有多个门。门连接房间。门上没有穿越重物。选择门的重量来自门之间的距离。走廊就像一扇延长的门,所以它有一个重量,被认为是一个类型的房间。房间可能有一个大的尺寸,但如果只有两个门彼此靠近,它可能有一个小的重量。这不是房间大小对我的目的而言,而是门之间的距离。
与往常一样,感谢您抽出宝贵时间阅读并提出建设性意见。
答案 0 :(得分:0)
是的,可以使用SQLite存储此类数据。 这不实用,您可能会遇到性能问题。如果您计划存储大量此类数据并希望获得可扩展的解决方案,则应该使用图形数据库。
如果您要存储~1000个节点,那么可以使用SQLite中的简单实现。
特别是因为您的更新数量非常少,您可以预先计算距离。因此,您不必每次都重新计算它,而只需从数据库加载。
我认为您应该将问题表示为图表。
节点可以是“门”并且它们之间的距离边缘。 您可以在关系数据库中轻松存储它。 (区域(Id,名称),门(Id,Area1,Area2)DoorDoorDistance(Door1,Door2,Distance))
如果您已存储这些数据,则可以计算从每扇门到其他门的最短路径。您可以将其存储在新表中。 (距离(门1,门2,路径,距离))
要计算最短路径,您可以找到不同的算法: Shortest path algorithms
在此之后,你在每对门之间有最短路径。
从现在开始,唯一的问题是从您的起始区域到目的地区域的门的女巫门。
如果你不想这么精确,你只需选择最短路径的那个。否则,您必须保持距离区域起点的门距离。 一个;您可以假设您从该区域的中心开始,因此您可以存储距离中心的门距离 B;通过存储精确的门位置并从精确的起点计算门距,您可以更精确。
在这两种情况下,您都应选择成本最低的门,包括起始区域和目的地区域:
总费用:(步行到门距离)+(从门到目的地门路径开始)+(到达目的地区域的目的地)
我会这样做。我希望我能帮忙,玩得开心!