3

我目前正在从事一个私人项目,该项目将使用Google 的 GTFS 规范来获取有关 100 多个公共交通机构、它们的路由器、车站、时间和其他相关信息的信息。我将从这里获取我的信息,以及具有类似信息的 google 代码 wiki 页面。有很多数据并将其划分为多个 CSV 格式的文本文件。这些可能是巨大的,一些在 80-100mb 的数据范围内。

有了我拥有的数据,我想将它们全部转换成一个很好的可靠数据库,我可以在上面构建层以用于我的项目。我将使用 GPS 定位来确定位置和所有周围的车站/站点。

我的目标是通过尽可能少的调用来访问所有这些站点和车站的所有信息,同时保持数据集较小以便查询结果。

我目前倾向于 MongoDB 和 CouchDB,因为他们的 GeoSpatial 支持可以真正优化获取小型数据集。但我还需要确保连接一条路线上的所有站点,因为我将沿着这条线路的公交路线传播信息。在这种情况下,我发现我可以从 Neo4j 和 OrientDB 之类的 Graph DB 中受益,但据我所知,既没有 GeoSpatial 支持,我也不能 100% 确定 Graph DB 是我需要的。

完美的解决方案可能不存在,但我来这里寻求帮助以找到最适合我的情况。我知道我可能不得不解决我选择的任何限制,但我想至少完成我的研究并知道这是我目前能得到的最好的。

我还被建议将数据拆分到多个数据库中,但这可能会变得非常混乱,因为所有信息都通过 ID 紧密互连。

任何帮助,将不胜感激。

4

3 回答 3

1

我使用过 Mongo 的 GeoSpatial 功能,如果您需要 C# 或 javascript 实现方面的帮助,我可以提供一些指导——我建议您开始使用它,因为它非常易于使用。我现在正在学习有关 Neo4j 的所有知识,并且正在研究一种利用 Mongo 和 Neo4j 的混合方法。您可能希望使用 Mongo 对象 ID 将 Mongo 中的文档交叉引用到 Neo4j 中的节点。

对于我的混合实现,我将配置文件和任何其他大型静态数据存储在 Mongo 中。在 Neo4j 中,我存储了朋友和朋友之类的关系。如果我想分析两个朋友最有可能一起看的电影(或者我最初没有想到的任何其他关系),通过保留该对象 ID 引用,我可以简单地添加一些代码,指示每个节点出去抓取来自相关配置文件的电影列表。


2011 年 2 月 12 日添加:

只是想跟进这个“混合”想法,因为我最近创建了原型并实施了更多解决方案,最终我使用了多个数据库。Martin Fowler 将此称为“多语言持久性”。

我发现我经常使用关系数据库、文档数据库和图形数据库的组合(在我的情况下,这通常是 SQL Server、MongoDB 和 Neo4j)。由于这个问题与数据建模和地理空间相关,我想我会在这里谈一谈:

我使用 Neo4j 进行站点组织(类似于 REST 模型中的超媒体概念)、对社交数据进行建模和构建推荐(通常基于社交数据)。因此,我通常会在开始编程之前对应用程序的这一部分进行建模。

我经常最终使用 MongoDB 对应用程序的其余部分进行原型设计,因为它提供了如此简单的持久性机制。我喜欢开始开发带有用户界面的应用程序,所以最终效果很好。

当我开始将实体从 Mongo 移动到 SQL Server 时,上下文通常很重要——例如,如果我有一个应用程序允许用户根据定期收集的数据构建每日报告,那么运行一个构建这些报告的过程可能是有意义的每晚并在 Mongo 中存储每日报告对象,这些对象可以根据需要组合成更大的聚合报告(显然这没有考虑一些特殊情况,但这与重点无关)......另一方面,如果用户需要在非常特定的时间段内提取按需报告,将所有内容保留在 SQL Server 中并根据需要构建这些报告可能是有意义的。

也就是说,这值得更深入的思考,这里有一些可能会有所帮助的注意事项:

  • 如果我发现从数据库中提取实体[换句话说(在关系数据库的上下文中)-从提供生成实体或列表所需的数据的数据库中查询数据,我通常会尝试将实体存储在关系数据库中满足请求参数的实体] 不需要大量处理(例如,多个连接)
  • 您是否需要 ACID 合规性(除此之外:如果您有图形问题,您可以利用 Neo4j 来解决这个问题)?有符合 ACID 的文档数据库,但 Mongo 不符合是有原因的:MongoDB 不符合 ACID 的真正含义是什么?

我在野外看到的 Mongo 的一种用途,我认为值得一提 - Hadoop 被用于计算大量哈希表,然后将这些哈希表存储在 Mongo 中。我相信 TripAdvisor 会使用类似的方法在定位优惠、广告等方面进行基于用户的定制。

于 2011-10-10T16:42:48.727 回答
1

显然,图形数据库 100% 适合您的问题。我的建议是在 neo4j 或 orientdb 上使用一些地理空间模块,尽管您还有其他一些免费和开源的实现。

我认为现在最好的一个,实现了所有地理空间的东西是neo4j-spatial包。但据我所知,如果有必要,你也可以自己复制大部分地理空间的东西。

BTW 谈到拆分,如果数据/查询量会很高,我强烈建议您分担负载并以这种方式思考模型。当然你可以做点什么。

于 2011-10-06T12:17:40.417 回答
0

NoSQL 的存在只是因为 MySQL 用户认为所有数据库在数据库变大和/或变得复杂时都会出现性能问题。

我建议你使用 PostGIS。您也可以将相同的数据库用于其他数据需求。

http://postgis.refractions.net/

于 2011-11-11T06:04:37.293 回答