草庐IT

mongodb - NoSQL(MongoDB/DynamoDB)架构

coder 2023-11-05 原文

我正在从网站上抓取一系列产品并将它们存储在数据库中。目前,我使用的是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中工作,在MongoDB中允许二级索引,而选项2可以在MongoDB或DynamodB中工作。(我之所以考虑这两个,是因为我希望在云中托管一些东西,而不需要维护开销)。
我走这些路对吗?哪种效果最好?我对nosql完全不熟悉,所以任何建议都将不胜感激。

最佳答案

您说您正在尝试解决以下数据存储问题:
每年1000万左右的历史数据点
异构数据点
每年1000万左右的历史数据点
正如评论中指出的,每年1000万个数据点并不是一个大数据集。包括mysql在内的大多数数据库都能够支持这一点,只要您知道如何优化它们,所以不要仅仅为了解决这个问题而切换技术。如果您对如何优化mysql有特定的问题,那么我建议您单独提出一个问题。
对于基于MongoDB的历史数据问题的解决方案,您可能会有一个product_history数据的集合,您只需决定每个文档中要放入多少个条目。一些选项:每个产品一个;每个产品/时间戳一个;特定时间段内每个产品/时间戳一个,例如一天或一个月。更多细节:
The mongo docs建议将数据嵌入到数组中“对于某些用例”是有意义的。您的用例听起来像这样的用例,即我不会为每个产品/时间戳创建一个文档。
您也不希望每个产品都有一个文档,因为mongo不太擅长增长非常长的数组。
所以,剩下的选项是在特定时间段内每个产品/时间戳一个。跟这个走。不幸的是,您将不得不尝试一些事情,以确定如何确切地组织此文档。以下是一些尝试:
使用“period”属性指示所讨论期间的开始时间。在产品/期间上创建索引。
当您附加到此文档中的数据结构时,可以使用mongo的upsert功能简化代码。
根据新数据点进入的频率选择时段的持续时间(每小时、每天、每月等)。您可能需要根据负载测试调整此持续时间。
每个周期构造文档的最简单方法是使用一个数组保存数据。但是,mongo不擅长附加到很长的数组,因此有些人通过在文档中创建一个简单的树来提高性能。例如,如果您有一个每日文档,则可以在一天中每小时使用一个单独的数组:

{
  "0" : [ 123, 456 ],
  "1" : [ 789 ]
}

如果一台服务器上有大量的数据不适合存储,并且需要能够快速读取历史数据,那么mongodb对分片的支持可能会给您带来一些好处。基本上,您可以将数据拆分,这样就不必读取磁盘。但你的问题还不清楚阅读性能是否重要,以及你阅读的类型,所以如果你想了解更多信息,请发布一个新的问题。
异构数据点
关于RDBMS对您的问题的解决方案,以下是我见过的最常见的方法:
使数据非标准化。你说每个产品有85个属性?然后创建一个包含85列的表!你说另一种产品有20种不同的属性?然后再向表中添加20列!这个解决方案:
很简单。
性能良好,因为非规范化的所有通常好处都适用。
破坏了使用关系数据库的一些好处。例如,大多数列不能有“not null”约束。
规范化数据。创建一个表来捕获x类型的属性,创建另一个表来捕获y类型的属性,等等。如果您有一个新的产品类型,则添加一个新表。这个解决方案:
可能很复杂。例如,如何决定将某些公共属性放在哪个表中?
会表现不好。例如,如果必须联接10个表才能从数据库中获取任何有用的信息,则会出现问题。
会让数据库纯粹主义者高兴。
使用行而不是列。这个解决方案:
很复杂,很难维护。
表现很差。
破坏了使用关系数据库的一些好处。
(注意,还有其他基于rdbms的解决方案。例如,有些人喜欢put XML documents into DB2
你在尝试最后一种方法,所以难怪你不开心!如果您要坚持使用rdbms,那么我建议您切换到我列出的其他方法之一。
现在,回到你关于nosql的问题上来。基于文档的nosql数据库(如mongodb)是解决“异构数据点”问题的一个有吸引力的解决方案,因为它没有模式。你可以在一个文档中列出一个产品的规格,当你想添加新的属性时,你就这么做。MongoDB确实允许对属性进行索引,所以如果你想找到一个带有属性A的产品,那么你可以通过索引快速地找到。(不过,这里并没有什么魔力:对于任何数据库,索引的维护成本都很高,所以要谨慎地创建索引)。

关于mongodb - NoSQL(MongoDB/DynamoDB)架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9261883/

有关mongodb - NoSQL(MongoDB/DynamoDB)架构的更多相关文章

  1. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  2. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  3. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  4. ruby - 如何分隔 DynamoDB 更新表达式中的多个子句 - 2

    根据AWSDocs:Anupdateexpressionconsistsofoneormoreclauses.EachclausebeginswithaSET,REMOVE,ADDorDELETEkeyword.Youcanincludeanyoftheseclausesinanupdateexpression,inanyorder.However,eachactionkeywordcanappearonlyonce.我无法在一个update_expression中获得正确的SET和REMOVE语法:params={key:{'id'=>{s:'123'}},table_name:'c

  5. ruby - 如何将 DynamoDB Local 与 AWS Ruby 开发工具包结合使用? - 2

    亚马逊的documentation提供有关如何使用DynamoDBLocal的Java、.NET和PHP示例。你如何用AWSRubySDK做同样的事情??我的猜测是你在初始化时传入了一些参数,但我不知道它们是什么。dynamo_db=AWS::DynamoDB.new(:access_key_id=>'...',:secret_access_key=>'...') 最佳答案 您使用的是SDK的v1还是v2?您需要找出答案;从上面的简短片段来看,它看起来像v2。为了以防万一,我已经包含了这两个答案。v1答案:AWS.config(us

  6. ruby-on-rails - ActiveRecord 和 NoSQL - 2

    我已经使用Rails几年了,并且非常习惯ActiveRecord,但最近完成了一项可以从(某些)NoSQL数据存储中获益的任务。少量数据最好放在NoSQL系统中,但大部分数据仍应放在RDBMS中。不过,我看过的每个NoSQL包装器/gem似乎都需要从应用程序中删除ActiveRecord。是否有结合这两种技术的建议方法? 最佳答案 不确定您正在研究什么NoSQL服务,但我们已经将MongoDB与Postgres结合使用了一段时间。有用的提示,他们说你需要摆脱ActiveRecord,但实际上你不需要。大多数人只是这么说,因为您最终没

  7. ruby - 使用 Ruby 了解 AWS DynamoDB 中的属性 - 2

    我似乎无法理解DynamoDB的AWSRubySDK文档(或者更具体地说,DynamoDB数据模型的概念)。具体来说,我一直在阅读:http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html#!AWS/DynamoDB.htmlNote:IhavereadthroughtheDataModeldocumentationaswellandit'sstillnotsinkingin;I'mhopingaproperexampleinRubywithclearupmyconfusion在下面的代码片段中,我创建了一个名为“my_books

  8. ruby - 写密集型特征的架构 - 2

    我在当前项目中使用由Oracle数据库和memcached支持的RubyonRails。有一个非常常用的功能,它依赖于单个数据库View作为数据源,并且该数据源内部有其他数据库View和表。这是一个虚拟数据库View,能够从一个地方访问所有内容,而不是物化数据库View。大多数情况下,如果用户正在使用他们希望更新的功能,那么让数据保持最新很重要。从这个View获取数据时,我将安全表内部连接到View(安全表不是View本身的一部分),其中包含一些我们用来在更细粒度级别上控制数据访问的字段。例如,安全表有user_id,prop_1,prop_2列,其中prop_1,prop_2是数据库

  9. ruby-on-rails - 有没有很好的引用(开源)Rails NoSQL应用程序? - 2

    我有兴趣了解使用nosql将如何影响rails应用程序的架构/设计/代码。有人知道使用nosql持久性的开源rails应用程序的一个好例子吗?谢谢 最佳答案 看看这些项目:卡桑德拉用法atDigg。卡桑德拉用法atTwitter。Friendly用法atFetLife(nsfw)。最后,MyNoSQL是一个提供nosql相关信息的好网站。 关于ruby-on-rails-有没有很好的引用(开源)RailsNoSQL应用程序?,我们在StackOverflow上找到一个类似的问题:

  10. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

随机推荐