使用动态模式的数据库DBMS选择方法?

时间:2015-03-13 14:41:45

标签: database rdbms schemaless nosql

我正在启动一个项目,并试图揭开它面临的挑战。我来自RDBMS背景,我希望为我的下一个项目做出明智的存储技术决策。我知道如果RDBMS是我的唯一选择,我会如何处理这些问题,但我有兴趣了解这个行业会采用什么 - 理想情况下有人看到这个并说出类似的话:'我做到了这一点,并使用了###,它工作得很好,但我们不得不使用###来处理使用中的峰值。如果这是业务的最佳选择,我不会害怕爬回我的RDBMS洞穴。

所以问题是:

[object A] – type: person
{
  /*some fields that every person has*/
  name: “A”
  email: “a@example.com”
  age: 22

  /*some fields that can be dynamically*/
  my_custom_user_property : 332 /* or maybe a struct of some type */

  /*some relations (fixed)*/
  groups: member of C; administrator of C; member of F; reader of G

  /*some more arbitrary relations*/
  mother_of: B
}

[list of groups]

也就是说 - 每个客户可能希望将自己的“列”添加到数据库中,然后再搜索它们。

我的期望是数据没有快速变化(高读写比),我可以愉快地同步[例如报告的生成]。但是基于简单标准的提取需要快速且针对自定义字段。

在数据库的顶部是一些限制在列级别可以看到的功能 - 例如只有F的成员可以查看G成员的电子邮件。这些,再次,需要是动态的(假设我的自定义用户属性是敏感的,我有一些方法来设置业务规则)。根据技术的不同,我认为这可能只是纯粹的应用程序(获取整个对象,然后根据规则进行限制)或者作为更复杂的查询 - 构建器类型系统。

接下来是“图表”类型搜索 - 我目前看不到这超出了几个自由度,但是能够找到例如用户通过几种不同的路由与组进行二度连接(某些连接在开发时可能无法修复)。如上所述,这可能是可以异步处理的事情,

我想找一些能够处理的东西,目前为10M用户,1M组,每日活跃用户100K,能够管理的5K用户(例如添加列)。 (是的,完全可以通过MySQL或类似的方式实现,但在顶部有合理的工程量)

就实际开发/基础设施而言:

  • 我不想用无证的配置/陷阱等来撕掉我的头发(说我完全开心学习东西,只要它不会让我获得学位的东西只是为了下车接地)
  • 可以设置高可用性和稳健性的东西 - 例如提供良好的集群管理和报告(或在专家的帮助下不那么昂贵)
  • 最好能够相对快速地从盒子中展开的东西
  • 我可能有一个金融交易模块(未经证实),所以ACID加上
  • 使用成熟的库,可以很好地使用Spring框架。
  • 当然,好的文档/示例。有足够的信息来掌握概念模型以及实用的如何输入内容
  • 开源

我已经阅读了很多关于那里的产品的信息,但是我想将这一点减少到2个合理的选项,我可以将其解决。阅读:MongoDB;卡桑德拉; CouchBase; CouchDB的; Neo4j的; (还有更多),我对CouchBase有所了解。但我也知道有很多营销材料可以用来吸引像我这样的人对某个特定的想法。

所以这个问题总结为三个问题:是否有任何方法不起作用?是否有任何方法已被证明有效?目前是否有明确的最佳选择?

1 个答案:

答案 0 :(得分:1)

这里有关于您的问题的一些信息。以下内容来自我对Cassandra,MongoDB,MySQL和Oracle支持的用户数据库的曝光。

无法使用的方法

有些方法不会起作用,例如基于简单键值存储或存储固定数据量的缓存的方法,而其他方法则不太理想。一个有趣的例子是Cassandra,它很适合它的多数据中心支持。 Cassandra专家告诉我,像MongoDB这样的文档存储对于某些用户数据库用例来说是一个更合适的解决方案,但有些组织使用它们都是相同的,包括管理数百万个用户的组织生产的Apache Usergrid project用户。当然,Apache Usergrid项目希望添加Elasticsearch以获得更好的查询功能,但几乎任何数据库都可以添加全文搜索。

方法证明有效

有一些已知的生产系统允许客户添加自己的列。其中最着名的是Salesforce,它运行在Oracle上,并且我已经在少数几家公司使用过。每个客户都可以定义自己的自定义字段/列,并针对这些列运行SOQL(Salesforce SQL)。由于每个客户都可以创建自己的列,这可能会导致多租户表比Oracle允许的更宽,因此他们使用" flex columns"列可以包含许多不同类型的数据甚至数据类型。另一种被证明有效的方法是MongoDB,我使用的其他供应商使用它支持多租户数据存储中的每个客户字段。在这两个解决方案中,自定义字段都是用于存储和搜索自定义字段的第一类字段。

明确最佳选择

我认为目前没有明确的最佳选择。除了功能之外,还有一些要求,例如多数据中心支持,没有单点故障(SPOF),以及在某些解决方案中得到更好支持而在其他解决方案中得到更少支持的搜索。最好的"解决方案将取决于您在各种因素中的全部要求,并且可能涉及多个解决方案,例如所提到的Cassandra / Elasticsearch组合。

选项和CAP定理

要选择数据库系统,考虑我在此描述的CAP定理很有用:

Big Data or relational database (like Mysql cluster)?

在此模型中,您可以选择三者中的任意两个:一致性,可用性和分区容差,但不是全部3.如果您想要一致性,快速读取,可用性和快速写入,请考虑这一点用CAP表示。一致性和可用性是显而易见的。快速读取和写入取决于驱动分区容差要求的规模。如果你谈论的是1000万用户,那么在更大的方案中这并不是很大,你可以用更少的分区容差来做。一旦您决定是否需要CA系统或CP系统,请查看digram中三角形的一侧,看看哪些解决方案是合适的。

Couchbase is a CP system因此,这似乎符合您对一致性和分区容差(缩放)的优先级要求。但是,由于您只有1000万用户,因此您应该考虑实际需要多少分区容差。