【发布时间】:2016-05-04 13:31:43
【问题描述】:
我正在从事一个大数据项目,从不同的在线卖家那里收集大量产品信息,例如价格、标题、卖家等(每件商品 30 多个数据点)。
一般来说,该项目有 2 个用例:
- 在网络应用程序或小部件中显示特定产品的最新数据点
- 分析历史数据,例如价格历史、产品聚类、语义分析等
我首先决定使用 MongoDB 来实现水平扩展,因为假设为项目存储的数据在数百 GB 的范围内,并且数据可以通过 MongoDB 跨多个 MongoDB 实例动态分片。
每个产品的 30 多个数据点不会一次收集,而是在不同的时间收集,例如一个爬虫收集价格,几天后另一个爬虫收集产品描述。但是,某些数据点可能会重叠,因为两个爬虫都收集例如产品标题。例如,结果可能是这样的:
Document 1:
{
'_id': 1,
'time': ISODate('01.05.2016'),
'price': 15.00,
'title': 'PlayStation4',
'description': 'Some description'
}
Document 2:
{
'_id': 1,
'time': ISODate('02.05.2016'),
'price': 16.99,
'title': 'PlayStation4',
'color': 'black'
}
因此我最初提出了以下想法(想法1):
- 如上所述,在一个特定爬网过程中找到的所有数据点最终都在一个文档中。为了获得最新的产品信息,我会单独查询每个数据点并获取不超过某个阈值的最新条目,例如一周,以确保“用例 1”的产品信息不会过时,并且我们拥有所有数据点(因为单个文档可能不包含所有数据点,而仅包含一个子集)。
- 但是,由于某些数据点(例如产品名称)不会定期更改,因此始终保存所有数据(以便能够进行时间序列分析和高级分析)会导致数据库中的大量冗余,例如每天都会保存相同的产品描述,即使它没有改变。因此,我想我可能会检查数据库中的最新值,并且仅在值发生更改时才保存该值。但是,这会导致大量额外的数据库查询(每个数据点一个),并且由于上述时间阈值,我们将丢失数据点是否未更改或被所有者从网站上删除的信息商店。
因此,我在考虑不同的解决方案(想法 2):
- 我想拆分不同文档中的所有数据点,例如价格和标题存储在单独的文档中,并带有自己的时间戳。如果数据点未更改,则可以更新时间戳以指示该数据点未更改并且仍可在网站上使用。但是,这会导致小数据点(例如布尔值)的巨大开销,因为每个文档都需要自己的键、时间戳等才能使用索引快速查找/过滤/排序它们。
例如:
{
'_id': 1,
'timestamp': ISODate('04.05.2016'),
'type': 'price',
'value': 15.00
}
因此,我正在努力寻找用于该项目的正确模型和/或数据库。总结一下,就是这些要求:
- 收集数以亿计的产品(数百 GB 甚至 TB)
- 分布式爬虫在不同时间点检索重叠的产品信息子集
- 信息应存储在分布式、水平可扩展的数据库中
- 应将数据冗余降至最低
- 应保留有关数据点的时间序列信息
我将非常感谢任何可能帮助我推进项目的想法(数据模型/架构、不同的数据库……)。提前非常感谢!
【问题讨论】:
标签: mongodb database-design bigdata nosql