【发布时间】: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