【发布时间】:2014-05-08 14:23:30
【问题描述】:
我正在从各种 Web 应用程序获取以下格式的日志数据:
Session Timestamp Event Parameters
1 1 Started Session
1 2 Logged In Username:"user1"
2 3 Started Session
1 3 Started Challenge title:"Challenge 1", level:"2"
2 4 Logged In Username:"user2"
现在,有人想要对此日志数据进行分析(并希望在经过适当的转换后将其作为 JSON blob 接收)。例如,他可能希望接收一个 JSON blob,其中日志数据按Session 分组,并在发送数据之前添加TimeFromSessionStart 和CountOfEvents,以便他可以进行有意义的分析。在这里我应该返回:
[
{
"session":1,"CountOfEvents":3,"Actions":[{"TimeFromSessionStart":0,"Event":"Session Started"}, {"TimeFromSessionStart":1, "Event":"Logged In", "Username":"user1"}, {"TimeFromSessionStart":2, "Event":"Startd Challenge", "title":"Challenge 1", "level":"2" }]
},
{
"session":2, "CountOfEvents":2,"Actions":[{"TimeFromSessionStart":0,"Event":"Session Started"}, {"TimeFromSessionStart":2, "Event":"Logged In", "Username":"user2"}]
}
]
在这里,TimeFromSessionStart、CountOfEvents 等 [我们称之为合成附加数据] 不会被硬编码,我将制作一个 Web 界面以允许人们决定他需要 JSON 中的合成数据类型斑点。我想为人们提供很大的灵活性来决定他想要 JSON blob 中的合成数据类型。
我预计数据库将存储大约 100 万行并在合理的时间内执行转换。
我的问题是关于数据库的选择。使用 PostgreSQL 等 SQL 数据库与使用 MongoDB 等 NoSQL 数据库的相对优缺点是什么。从我到现在所读到的任何内容来看,我认为 NoSQL 可能无法提供足够的灵活性来添加额外的合成数据。另一方面,如果我使用 SQL 数据库,我可能会面临数据表示的灵活性问题。
我认为 MongoDB 和 PostgreSQL 的存储要求相当,因为我必须在两种情况下构建相似的索引(可能!)以加快查询速度。
如果我使用 PostgreSQL,我可以通过以下方式存储数据:
Session 和Event 可以是string,Timestamp 可以是date 和Parameters 可以是hstore(PostgreSQL 中可用的键值对)。之后,我可以使用 SQL 查询来计算合成(或附加)数据,将其临时存储在 Rails 应用程序的变量中(它将与 PostgreSQL 数据库交互并充当需要 JSON blob 的人的接口)并创建 JSON从它那里得到一滴。
另一种可能的方法是使用 MongoDB 来存储日志数据,并使用 Mongoid 作为 Rails 应用程序的接口,如果我能够获得足够的灵活性来添加额外的合成数据进行分析并在 PostgreSQL 上进行一些性能/存储改进。但是,在这种情况下,我不清楚在 MongoDB 中存储日志数据的最佳方式是什么。另外,我读到 MongoDB 会比 PostgreSQL 慢一些,主要是为了在后台运行。
编辑: 从我过去几天的阅读来看,Apache Hadoop 似乎也是一个不错的选择,因为它比 MongoDB(多线程)速度更快。
编辑: 我不是在征求意见,而是想知道使用特定方法的具体优点或缺点。因此,我不认为这个问题是基于意见的。
【问题讨论】:
-
并非您阅读的所有内容都是准确的。 MongoDB 既不是单线程的,也不是要在“后台”运行。
-
@AsyaKamsky 我读到
MongoDB: The Definitive Guide说The price of using MapReduce is speed: group is not particularly speedy, but MapReduce is slower and is not supposed to be used in “real time.” You run MapReduce as a background job, it creates a collection of results, and then you can query that collection in real time. -
MongoDB 远不止 MapReduce,事实上,MR 是它的一个边缘特性,你甚至不应该使用 map-reduce - 你应该使用在服务器上运行的聚合框架(不是在 JS 中)并且比 map-reduce 快一个数量级。
-
您说您从各种应用程序中获取日志数据,但您没有在示例中的任何地方显示应用程序 ID。您希望查询跨越所有应用程序,还是仅针对特定应用程序或???
-
是的,查询将跨越所有应用程序(此外,如果需要,我可以添加一个应用程序 ID,没有太大问题)。如果我使用 MongoDB,我不知道应该如何存储日志数据。我的意思是,应该如何表示
Parameters,以便以后可以对它们进行部分索引,以提高某些类型查询的查询速度[例如。那些关心用户名的人]?对于我的用例,与 PostgreSQL 相比,MongoDB 有什么缺点吗?
标签: ruby-on-rails mongodb postgresql mapreduce relational-database