我正在从网站上抓取一系列的产品,并将它们存储在数据库中。目前,我使用的是MySQL,它有两个表:
products (product_id, site, product_description, etc)
e.g. (1234, "xyz.com", "nice product", etc)
product_history (product_id, scrape_timestamp)
e.g. (1234, 2012-01-02 10:53:09)
(1234, 2012-01-03 11:02:09)这个模式意味着我可以获得过去任何时候列出的产品的快照。
我正在考虑迁移到NoSQL,因为(i)我经常从不同的站点获得不同的字段,(ii)每年的数据量将达到500-1000万个产品。我可以看到两种构建模式的方法
选项1:“嵌入式列表”
product_id, site, product_description, scrape_timestamp
1234, "xyz.com", "test product", {2012-01-02 10:53:09, 2012-01-03 11:02:09}选项2:“二级索引”
keep both tables as above with the relational schema我认为选项1可以在允许二级索引的MongoDB中工作,而选项2可以在MongoDB或DynamoDB中工作。(我正在考虑这两个,因为我想要一些托管在云中的东西,为我提供零维护开销)。
我使用这些方法是正确的吗?哪一种效果最好?我对nosql完全不熟悉,因此任何建议都将不胜感激。
发布于 2012-02-15 04:36:29
您说您正在尝试解决以下数据存储问题:
每个year
每年1000万左右的历史数据点
正如评论中指出的那样,每年1000万个数据点并不是一个大数据集。包括MySQL在内的大多数数据库都能够支持这一点,只要您知道如何调优它们,所以不要仅仅为了解决这个问题而切换技术。如果您有关于如何调优MySQL的具体问题,那么我建议您单独发布一个问题。
关于历史数据问题的基于MongoDB的解决方案,您可能有一个用于product_history数据的集合,您只需决定在每个文档中放入多少个条目。一些选项:每个产品一个;每个产品/时间戳一个;特定时间段内每个产品/时间戳一个。一天或一个月。更多细节:
中使用每小时一个单独的数组
{ "0“:123,456,"1”:789 }
如果您有大量数据无法放入一台服务器的内存中,并且您需要能够真正快速地读取历史数据,那么您可能会从MongoDB对分片的支持中获得一些好处。基本上,你可以拆分你的数据,这样一次读操作就不必命中磁盘。但从你的问题中还不清楚阅读性能是否重要,以及你做什么类型的阅读,所以如果你想了解更多信息,请发一个新的问题。
异构数据点
关于你的问题的RDBMS解决方案,下面是我见过的最常见的方法:
的一些好处,
(请注意,还有其他基于RDBMS的解决方案。例如,有些人喜欢使用put XML documents into DB2。)
你在尝试最后一种方法,所以难怪你不开心!如果您打算坚持使用RDBMS,那么我建议您切换到我列出的其他方法之一。
现在,回到你关于NoSQL的问题上。对于“异构数据点”问题,基于文档的NoSQL数据库(如MongoDB )是一个有吸引力的解决方案,因为它是无模式的。您可以在一个文档中列出产品的规格,当您想要添加新属性时,您只需这样做即可。MongoDB确实允许您对属性进行索引,因此,如果您希望查找具有属性A的产品,则可以通过索引快速完成此操作。(不过这里没有什么神奇之处:与任何数据库一样,索引的维护成本可能很高,因此要谨慎地创建索引)。
https://stackoverflow.com/questions/9261883
复制相似问题