【问题标题】:SaaS system with dynamic data model in production生产中具有动态数据模型的 SaaS 系统
【发布时间】:2017-12-26 08:22:50
【问题描述】:

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

我正在尝试找出哪个数据库/数据存储系统可能是此类系统的最佳选择。最近我阅读了很多 NoSQL 解决方案,例如 Cassandra 和 MongoDB,它在性能方面看起来很有希望,但有一个缺陷:它不是关系数据,因此必须对数据进行非规范化。

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

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

对要求进行说明

我的问题实际上是,我如何使用像 Cassandra 这样的 NoSQL DB 来维护关系数据,并且与 RDBMS 相比,该解决方案的性能是否仍然更好?

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

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

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

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

【问题讨论】:

    标签: mongodb cassandra database nosql


    【解决方案1】:

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

    【讨论】:

    • 我更新了我原来的帖子,希望能更清楚。我对 NoSQL DB 及其用例完全陌生,但我相信无论使用什么 DBMS,数据仍然是关系的(只是非规范化)。我很好奇这些数据是如何在 NoSQL 数据库中管理的,以防特定关系/实体有更新。
    • 即。在 Azure 表存储世界中,您可以通过 2 种方式管理非规范化但相关的数据模型之间的一致性。如果这些非规范化实体具有相同的分区键,则通过批处理操作实现强一致性,否则最终的一致性模式利用 azure 队列和工作角色来处理独立操作。 Cosmos DB 现成的支持不同的一致性模型,因此它是表存储的演变。您的非规范化数据模型应针对您的用例(查询、更新等)进行优化
    • 在 noSQL 中,您应该围绕查询对表结构进行建模。如果你想维护关系数据,你应该维护一个关系数据库。否则,您需要动态创建 noSQL 表,而不仅仅是基于 RDBMS 数据,而是基于使用这些数据的查询。我不明白您对生产系统上的 DDL 的看法不是一个好主意。您为用户准备专用模式并提供它。您仅限制用户对其表的权限。您还可以对用户的查询进行一些验证,以消除用户删除所有表的机会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2019-03-15
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多