生产中使用动态数据模型的SaaS系统

时间:2017-07-20 14:46:50

标签: mongodb cassandra database nosql

我想设计一种允许客户创建自己网站的产品。客户将能够即时维护其网站的数据模型,对其进行查询并在html页面上显示输出。我怀疑传统的RDMBS是正确的选择有两个原因;每个客户都会增加数据量,即使按比例缩放,RDBMS也可能达到极限。由于数据模型是高度动态的,因此许多DDL查询会降低整个系统的速度。

我正在试图弄清楚哪个数据库/数据存储系统可能是这种系统的最佳选择。最近我通过像Cassandra和MongoDB这样的NoSQL解决方案阅读了很多内容,它在性能方面看起来很有前途但是有一个缺陷:它不是关系数据所以数据必须非规范化。

  • 我不知道对动态客户定义数据模型进行非规范化会产生什么影响,因为客户首先(以关系方式)对数据进行建模和插入,然后再进行查询。非规范化必须自动发生,这会导致另一个问题:我是否可以为每个查询创建一个表,即使某些查询可能类似?一段时间后可能存在高冗余的数据。
  • 动态创建/更新表是否有影响?
  • 每次客户更改数据时,必须在包含同一实体副本的所有表中更改相同的数据(例如,必须在“团队成员”和“项目任务”中更改员工姓名) )。这些更新是否代价高昂?
  • 是否可以嵌套无限深度的数据,如{"team": {"members": [{"name": "Ben"}]}}

可能有更好的/其他方法,我很高兴任何提示。

添加要求的说明

我的问题实际上是,我如何使用像Cassandra这样的NoSQL数据库来维护关系数据?与RDBMS相比,该解决方案仍能表现得更好吗?

客户认为是关系型的(因为事实上,无论使用什么DBMS,数据在我看来都是关系型的。)这项服务并不是让客户选择底层数据存储。只能有一个。

客户可以使用应用程序提供的管理前端来定义自己的关系数据模型。客户可以随时更改数据模型。在RDBMS中,生产系统上的DDL不是一个好主意。在数据模式之上,客户可以添加命名查询,并将其用作他创建的任何网页上的数据源。

示例将是一个名为“news”的新闻查询,而在网页中,它将像<ul><li query="news"><h1>[news.title]</h1></li></ul>一样使用,它将执行查询并迭代数据并在每次迭代时重复<li>。这是最简单的例子。

在更复杂的示例中,如果使用SQL,可能会广泛使用执行错误的子查询。在NoSQL中,似乎可以选择首先使用查询所需的数据进行非规范化和准备表,然后只查询该表。对所涉及数据的任何更改都将导致该表的更新。这意味着对于客户创建的每个查询系统都将自动创建和维护表及其数据,因此会有大量的数据冗余。基准测试表明Cassandra写作速度很快,因此可能是一种选择。

1 个答案:

答案 0 :(得分:0)

让我把我的2美分。 谈论具有自己的数据模型的用户的能力与SaaS无关。
在纯SaaS范例中,每个用户都具有相同的功能和数据模型。他可以添加自己的对象,但不能添加对象类。
因此,在这种范式中缩放是一个相当明显的(虽然坦率地说,它可能不是那么简单)解决方案。您可以获得具有内置多租户支持的云数据库(例如Azure),您可以使用亚马逊的RDS并在用户数量增长时添加更多实例,您可以使用分片(例如,分区)用户)如果数据库支持它等。
但是,当我们谈论每个用户的自定义数据模型更像是IaaS(基础架构)。这是一个更低级别的事情,你只需说:&#34;好的,伙计们,你可以建立你想要的任何数据模型,无论如何&#34;。
我相信,如果您将数据模型创建的责任转移给用户,您还应该像IaaS所提供的那样,转移数据库选择的责任。所以用户会说:&#34; &#34;好的,我在这里需要键值数据库&#34;而你以Cassandra的桌子为例。如果他想要RDBMS,你也可以给他一个。 否则,您不仅要考虑数据模型本身,还要考虑客户需要的数据策略。因此,某些客户可能需要具有键值存储(需要由某些noSQL DB支持),另一个可能需要RDBMS。你怎么知道的?
例如,考虑您示例中的实体:{"team": {"members": [{"name": "Ben"}]}}。一个用户会将此模型用于单一类型的查询,例如&#34;获取团队的成员&#34;和#34;添加团队成员&#34;。另一个用户可能需要经常查询一些统计信息(平均团队成员年龄,玩过的游戏)。
这两种情况可能需要不同的数据库类型:第一种是键值搜索,另一种是RDBMS。您如何猜测数据库类型和结构,因为键值存储是围绕查询建模的?
从技术上讲,您甚至可以尝试根据用户的数据来猜测数据库类型。数据模型和查询,但您需要为用户添加一些限制&#39;创造力。否则,这将是一项非常重要的任务。
关于扩展,因为每个模型都是唯一的,您需要在用户增长时添加数据库实例。当然,您可以在不同模式的单个数据库实例中拥有多个用户,并且您需要确定用户&#39;通过实验或性能测试每个实例的数量。
您也可以查看面向文档的数据库,但我认为您需要检查您的概念并进行一些更改。
也许您有一些明显的限制,但我只是没有从您的帖子中获取它。