我目前正在开展一个私人项目,该项目将使用Google's GTFS spec来获取有关100多个公共交通机构,路由器,车站,时间和其他相关信息的信息。我将从here和Google代码维基页面获取具有类似信息的信息。有很多数据,它被分成多个CSV格式的文本文件。这些数据可能很大,有些数据范围为80-100mb。
根据我拥有的数据,我想把它全部翻译成一个很好的实体数据库,我可以在我的项目上构建图层。我将使用GPS定位来精确定位一个位置和所有周围的站点/站点。
我的目标是通过尽可能少的电话访问所有这些站点和站点的所有信息,同时保持数据集较小以查询结果。
我目前倾向于MongoDB和CouchDB的GeoSpatial支持,可以真正优化获取小数据集。但我还需要确保链接路线上的所有站点,因为我将沿着该线路的公交路线传播信息。在这种情况下,我发现我可以从像Neo4j和OrientDB这样的Graph DB中受益,但据我所知,GeoSpatial既没有支持也没有100%确定Graph DB是我需要的。
完美的解决方案可能不存在,但我来这里寻求帮助,找到最适合我的情况。我知道我可能不得不解决我选择的任何限制,但我想至少完成我的研究并知道它是我现在能做的最好的。
我还被建议将数据分成多个数据库,但这可能会非常混乱,因为所有信息都通过ID非常紧密地互连。
任何帮助都将不胜感激。
答案 0 :(得分:1)
显然,图表数据库可以100%满足您的需求。我的建议是在neo4j或orientdb上寻找一些地理空间模块,尽管你还有其他一些免费的开源实现。
我认为现在最好的一个,实现了所有地理空间的东西是neo4j-spatial包。但据我所知,如果需要,您还可以自己复制大部分地理空间事物。
BTW谈论分裂,如果数据/查询量很高,我强烈建议你分担负载并用这个术语来思考模型。当然你可以做点什么。答案 1 :(得分:1)
我已经使用了Mongo的GeoSpatial功能,如果你需要C#或javascript实现的帮助,可以提供一些指导 - 我建议它开始,因为它非常容易使用。我现在正在学习关于Neo4j的一切,我正在研究利用Mongo和Neo4j的混合方法。您可能希望使用Mongo对象id将Mongo中的文档交叉引用到Neo4j中的节点。
对于我的混合实现,我在Mongo中存储配置文件和任何其他大型静态数据。在Neo4j,我正在存储朋友和朋友之间的关系。如果我想分析电影,两个朋友最有可能想要一起观看(或者我最初没想过的任何其他关系),通过保持该对象id引用,我可以简单地添加一些代码,指示每个节点出去抓取来自相关个人资料的电影列表。
已添加2011-02-12:
我最近想要跟进这个“混合”的想法,因为我最近创建了原型并实现了一些解决方案,最后我使用了多个数据库。 Martin Fowler称之为“Polyglot Persistence”。
我发现我经常使用关系数据库,文档数据库和图形数据库的组合(在我的例子中,这通常是SQL Server,MongoDB和Neo4j)。既然问题与数据建模有关,就像地理空间一样,我想我会在这里谈到:
我使用Neo4j进行网站组织(类似于REST模型中的超媒体理念),建模社交数据和构建建议(通常基于社交数据)。因此,在开始编程之前,我通常会对应用程序的这一部分进行建模。
我经常最终使用MongoDB对应用程序的其余部分进行原型设计,因为它提供了这样一个简单的持久性机制。我喜欢开始使用用户界面开发应用程序,因此最终运行良好。
当我开始将实体从Mongo移动到SQL Server时,上下文通常很重要 - 例如,如果我有一个允许用户根据定期收集的数据构建每日报告的应用程序,那么运行一个过程可能是有意义的每晚构建这些报告并在Mongo中存储每日报告对象,这些报告对象可以根据需要组合成更大的聚合报告(显然,这不考虑一些特殊情况,但这与要点无关)......另一方面如果用户需要将受限报告限制在非常特定的时间段内,那么将所有内容保存在SQL Server中并根据需要构建这些报告可能是有意义的。
那就是说,这值得更加强烈的思考,这里有一些可能有用的考虑因素:
我在野外看到的Mongo的一个用途,我认为值得一提--Hadoop被用来计算大量哈希表,然后存储在Mongo中。我相信TripAdvisor会根据定位优惠,广告等方式使用类似的方法进行基于用户的自定义。
答案 2 :(得分:0)
NoSQL只存在,因为MySQL用户认为当数据库变大和/或变得复杂时,所有数据库都会出现性能问题。
我建议您使用PostGIS。您也可以使用相同的数据库来满足其他数据需求。