NoSQL:什么是非结构化数据?


9

目前,我们基于mssql服务器的解决方案正在资源边缘运行。

现在,关于下一步解决负载的问题,我们有许多传统的选择:

  • 购买更快的CPU和IO
  • 拆分一些客户以分离服务器
  • 将数据库移到群集

就许可和硬件或时间而言,所有这些都是昂贵的。因此,我想通过将整个系统移至nosql引擎cassandra承诺的可伸缩解决方案中来添加另一种选择。

但是,我不确定noSQL数据库也没有使用过SQL数据库,因此我需要了解“非结构化”数据的结构。

在我们的应用程序中,我们基本上将用户以各种方式输入的数据存储为“键值”列表。有一个父表,它包含head元素(如Order),还有一个子表,其键值对包括该订单的内容(如Order_Lines)。

在业务方面,Order和OrderLines是一个单位。但是由于RDBMS,它们存储在表中,并且必须一直连接。

在操作过程中,有时我们选择只加载顶部,但是在大多数情况下,我们加载头行+一些KVP以显示一些有用的信息。

例如,在概述列表中,我们在每行的列中显示头标识符+一些值。

更新:我们存储任何形式的表格。因此,基本上我们存储“文档”。但是,我们必须按任何值,排序等来准备和搜索这些形式。数据访问控制在数据库上增加了另一层兼容性。

您可能会猜到,某些KVP的数量和可用性因对象而异。没有有效的可能性为每种对象创建单个表,因为我们必须为不同的数据组合创建数千个表。

这种“字典”之类的数据集会更好地存储在noSQL数据库中吗?并从中获得性能收益吗?卡桑德拉会将这些head + KVP建模为一个数据集吗?看看cassandra网页和一些教程,我的印象是,在数据组织方面,我们的RDBMS和cassandra之间并没有太大的区别-如果您要选择5个KVP,我们将拥有大量的连接为每一行的列表。

欢迎启蒙,也可以使用指向这些问题的论文的指针。

Answers:


3

有几个概念需要区分。一个是关于结构,另一个是关于模式。

结构化数据是应用程序预先知道其接收的每个字节的含义的数据。一个很好的例子是来自传感器的测量。相反,Twitter流是非结构化的。模式是关于如何要求结构强制将其传递给DBMS的。它控制DBMS解析其存储的数据量。需要模式的DBMS(例如SQL Server)可以存储未解析的数据(varbinary)或可选解析的数据(xml)和完全解析的数据(列)。

NoSQL DBMS位于从无解析(键值存储)向上的范围内。在这方面,Cassandra提供了相对丰富的功能。它们与关系存储明显不同的地方在于数据的一致性。定义表格后,只有与该定义相匹配的数据才可以保存在那里。但是,在Cassandra中,即使定义了列和族,也不需要同一表中的任何两行看起来彼此相似。由应用程序设计师来决定一行中有多少行(也称为文档)以及由指针链接的单独存放的内容。实际上,您想要多少非正规化。

好处是您可以通过一次连续读取来检索全部数据。很快 不利之处在于,作为应用程序程序员,您现在将永远对涉及此数据存储的每一段代码负责所有数据完整性和向后兼容性。很难做到这一点。同样,您被锁定在数据的一种观点上。如果按订单号键入行,您如何报告某一特定产品,地区或客户的销售情况?


1
在我们的例子中,我们存储的数据基本上是表格数据。用户可以在运行时定义表单,并可以在自己喜欢的任何时间对其进行修改。可以从数千个字段构造表单。如果捕获了类似列表的数据,则会发生这种情况。如果我们预先知道数据-在数据库设计时,我们将其标准化。您对数据视图的评论使我想到:如果表单是作为文档编写的,那么您如何在表单上为列表创建视图或在现实生活中按字段对数据进行排序?映射减少数据,重新收集并准备代码清单?
2015年

从历史上讲,这全都是客户端-您可以拿回文档,然后按需完成。CQL具有任何SQL开发人员都会熟悉的条款。Map Reduce是大型数据集的首选架构。看起来Cassandra 3.0将具有物化视图
Michael Green

5

尽管恕我直言,noSQL数据库已经成为主流,但采用这种技术的决定还是要根据存储的信息所需的成就来做出,而不仅要考虑您当前的性能。这意味着您最好的选择是坚持使用SQL数据库并改善您的硬件。

但是此外,我在您的问题中读到一些让我思考的东西。数据库的当前状态不是很多,但是您的句子“我们基本上将用户以各种方式输入的数据存储为“键值”列表”使我思考问题是否不是不良的数据模型,而不是缺乏物理资源。我已经在“传统” SQL数据库中以不可思议的性能管理了非常大的表(超过100亿行)。

我并不是说这是错误的,只是,因为我当然不能用很少的有关您当前解决方案的信息来评估您在正确的数据模型中的情况,而只是考虑将数据模型作为其他选择来重新考虑,因为您可能会在这里发现一些线索。

通常,当您无法在模型的最终状态下实现模型时(因为您不知道将要面对的不同键,或者当您需要其中一种可能的值时),权衡列表可以作为一种折衷方案某个元素的键。但是在实施后,我通常会在您收集了足够的信息以识别常见的使用情况并确定数据模型决策是否为最佳后的一段时间后,重新考虑此类决策。如果您知道您将拥有一定数量的键,请尝试使用传统方式对常规表进行一些基准测试

CREATE TABLE benchmarkTable (
  element INTEGER,
  key1 VARCHAR(xx),
  key2 INTEGER,
  key3 DECIMAL(5,2),
...
);

...并添加相应的索引。尝试一下,并用两种方法衡量执行计划。如果一次收集多个密钥,您可能会特别感到惊讶,因为除其他优点外,数据块大小应减小,从而可以提高性能。

希望这有助于或至少扩大了可能性,并开辟了新的调查范围。


非常感谢您的回答,但实际上情况如此,以至于我们真的不知道数据的结构。我们存储表单数据,但我们不知道表单模型的结构。我们当然知道应用程序,但是它是动态的,可以随时更改。
2015年

明白了 我不知道这有多大挑战,但是作为一个尝试尝试,创建一个表,该表包含执行FK(也许是INTEGER)在用户填充表中引用的公共键池吗?也许它比索引varchar列要好一些,如果它动态变化很大,我想它不会很短。而且它也会减小索引的大小。
LironCareto

1
这摆脱了问题,但是我们已经讨论了对用户可能性的某些限制。例如,将最大应用程序表字段减少为10个香草varchar db-fields。这是对模式的非规范化,基本上可以一次选择头部数据集和10个应用程序列的值,也可以在额外的db表上最多选择一个联接。在更改相关值时,我们还必须在代码中修改这一数据库行。这似乎是可行的,并且可以减少最多10个连接的选择,以显示app-table。但是,那时更改用户的应用程序列定义非常昂贵。
2015年

1
没关系,不用担心。我想我理解您的观点,并且您的方法对我来说是性能改进和可行性之间的良好折衷。显然,拥有使用统计数据以确定这些字段很重要。你有基准吗?至少在您找到一个(更好的?确定的?)解决方案之前,它可能会花您一些时间,或者您可能会发现可以长期使用它。
LironCareto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.