五重音而不是字节-数据存储和检索方法

五重奏是一种呈现原子数据的方法,该数据指示其在业务领域中的作用。 五重奏可以描述任何项,而每个项都包含有关其自身以及与其他五重奏的关系的完整信息。 这样的描述不取决于所使用的平台。 其目的是简化数据存储并提高其表示的可见性。



我们将讨论一种存储和处理信息的方法,并分享有关在这种新范例中创建开发平台的一些想法。 干嘛 要以更快的速度进行更短的迭代,请执行以下操作:勾画您的项目,确保它符合您的想法,对其进行优化,然后继续优化结果。

五重奏具有以下属性:同级之间的类型,值,父级和顺序。 因此,包括标识符在内共有5个组成部分。 这是记录信息的最简单的通用形式,这是一种可能符合任何编程要求的新标准。 五重态存储在统一结构的文件系统中,并在连续的均匀索引的大量数据中存储。 五重数据模型-一种数据模型,该模型将任何数据结构描述为基于基本类型和术语(元数据)以及根据此元数据(数据)存储的对象实例的单个互连列表。

半分钟的歌词
如今,有无数种记录数据的标准,许多方法和规则,使用这些记录所必需的知识。 标准是单独描述的,并不直接与相应数据相关。 如果使用五重奏,则可以在用户的​​业务领域中获取有关五重奏的性质,属性和处理规则的相关信息。 它的标准在所有领域都是统一的和固定的。 五重奏对用户是隐藏的-元数据和数据对于用户而言是可通用的。

五重奏不仅是信息,它还可以表示可执行代码。 但最重要的是,它是您想要记录,存储和检索的数据。 由于在我们的情况下,五重奏是可直接寻址,互连和索引的,因此我们会将它们存储在一种数据库中。


为什么用五重奏代替字节?


不会使磁性自旋定向的位或电子脉冲。

我们习惯于以字节为单位测量数据,无论它是文档还是照片大小,互联网流量限制或移动设备上的可用空间。 我们提出了另一种度量标准-五重奏(Quintet)-它没有像Byte那样具有固定大小,但是代表了原子级的数据量,对用户来说具有一定的价值。

例如,您可以说您的数据库占用了119 MB的存储空间,或者您可以声明该数据库存储了1.37 MB的五重态。 您不必担心在这种情况下字节是多少,但是您了解该数据库包含137万个术语描述,对象,它们的属性,链接,事件,带有其详细信息的查询等。 拥有137万条有价值的数据听起来比拥有119兆字节的数据要性感。

因此,这不是代替信息在数据介质上的存储方式,而是转移到另一个抽象级别。

五重奏结构


本文的主要思想是用人工术语替换机器类型,并用对象替换变量。 不是通过那些需要构造函数,析构函数,接口和垃圾收集器的对象,而是通过客户处理的清晰的信息单元。 也就是说,如果客户说“客户”,那么要在介质上保存此声明的本质,就不需要程序员的专门知识。



仅将用户的注意力集中在对象的值上是有意义的,而对象的类型,父对象,顺序(在从属关系中)和标识符从上下文中应该是显而易见的,或者只是隐藏起来。 这意味着用户根本不了解五重奏,他只给出一个任务,确保正确地接受了该任务,然后开始执行。

基本概念


每个人都可以理解一组数据类型:字符串,数字,文件,文本,日期等。 这样一个简单的集合足以勾勒出解决方案,并对其实施所需的术语进行“编程”。 五重奏表示的基本类型可能如下所示:



在这种情况下,不使用五重奏的某些组件,而将五重奏本身用作基本类型。 这使系统内核在收集元数据时更易于导航。

背景


由于用户和程序员之间的分析差距,在概述项目的阶段会发生概念的重大变形。 如果从用户的角度进行评估,轻描淡写,难以理解和主动提出的建议通常会使客户的简单合理想法变成逻辑上不可能的混乱。



知识转移应该没有损失和扭曲。 此外,组织这些知识的存储,您应该更好地摆脱所选数据管理系统施加的限制。

我们现在如何存储数据


通常,服务器上有许多数据库。 它们每个都包含对数据方案的描述以及一组特定的详细信息-逻辑互连的数据。 它们以特定的顺序存储在数据介质上,理想情况下-最佳以减少检索工作。
所提出的信息存储系统是各种众所周知的方法之间的折衷:面向列,关系和NoSQL。 它旨在解决通常由这些方法之一执行的任务。

例如,面向列的DBMS的理论看起来很漂亮:我们只读取所需的列,而不读取整个记录的所有行。 但是,实际上,将数据放置在介质上的可能性不大,以方便检索许多不同的分析维度。 请注意,可以添加和删除属性和分析指标,有时快于我们重建列存储的速度。 更不用说数据库中的数据可以修改,由于不可避免的碎片化,这也将违反存储模式的美。

元数据


我们引入了一个概念(一个术语)来描述与我们一起使用的任何对象:实体,属性,请求,文件等。 我们将定义我们在业务领域中使用的所有术语。 在它们的帮助下,我们将描述所有具有详细信息的实体,包括实体之间关系的形式。 例如,属性-状态字典条目的链接。 该术语被写为数据五重奏。

一组术语描述是元数据,类似于常规数据库中表和字段的结构所表示的元数据。 例如,具有以下数据结构:在某个日期的服务请求,该请求具有内容(请求描述)和状态,生产过程的参与者向其中添加指示日期的注释。 在传统的数据库构造函数中,它将如下所示:



由于我们决定向用户隐藏所有非必需的细节,例如绑定ID,因此该方案将有所简化:删除ID的提及,并合并实体名称及其键值。

用户“绘制”任务:从今天的日期开始的请求,该请求具有状态(参考值),并且您可以在其中添加指示日期的注释:



现在,我们看到6个不同的数据字段,而不是9个,整个方案为我们提供了7个单词的阅读和理解,而不是13个单词。尽管这当然不是主要内容。

以下是由五重奏处理内核生成的用于描述此结构的五重奏:



为了清楚起见,提供了代替以灰色突出显示的五重音值的说明。 这些字段未填写,因为所有必需的信息均由其余组件明确确定。

了解五重奏之间的关系


我们在这里拥有:

  • ID为80、81、83的属性具有相同的父对象-请求
  • 五重奏#82是Comment的属性,而后者又是Request的属性
  • 属性#74是对五重奏#73所描述类型的引用,并用作请求的属性#81

对于人类来说,这可能看起来有些复杂,但是好消息是-人类将永远不会看到这一点。 内核将元数据表示为可理解的图表,并将数据表示为简单的平面表。

用户资料


让我展示一下如何为上述任务存储这样的数据集:



数据本身根据元数据存储在五重奏中。 我们可以像上面一样进行可视化处理:



我们看到使用诸如邻接列表方法之类的东西写下的熟悉的层次结构。

实体储存


数据以五位字节数据序列的形式写入到内存中。 为了按索引搜索,内核会根据基本类型为其定义的数据类型来处理那些字节的数据。
就是这样:五个数据项的庞大列表。

存储原理与RDBMS中的存储原理没有太大不同,这使我们能够对数据构建S​​QL查询,以进行数据检索,JOIN,聚合函数以及我们在关系数据库中喜欢的其他事情。
为了测试基于五重存储系统的开发平台的原型,我们使用关系数据库。

性能表现


上面的例子很简单,但是当结构复杂数千倍并且有千兆字节的数据时,会发生什么?

我们需要什么:

  1. 讨论的层次结构-1 pc。
  2. B树,用于按ID,父级和类型进行搜索-3个。

因此,我们数据库中的所有记录都将被索引,包括数据和元数据。 这种索引对于获得关系数据库的好处是必要的-关系数据库是最简单和最受欢迎的工具。 父索引实际上是复合索引(父ID +类型)。 按类型的索引也是复合的(类型+值),用于快速搜索给定类型的对象。

元数据使我们摆脱了递归:例如,要查找给定对象的所有详细信息,我们可以通过父ID使用索引。 如果您需要搜索某种类型的对象,那么我们将按类型ID使用索引。 类型是关系DBMS中表名和字段的类似物。



无论如何,我们不会扫描整个数据集,即使使用大量任何类型的值,也可以通过少量步骤找到所需的值。

开发平台的基础


根据图灵的说法,这样的数据库本身并不能自给自足地进行应用程序编程,并且不完整。 但是,我们在这里不仅在谈论数据库,而且还试图涵盖所有方面:除其他事项外,对象是可以启动的任意控制算法,它们将起作用。

结果,我们得到的是统一的信息字段,而不是复杂的数据库结构和单独存储的控制算法的源代码,受存储空间量的限制并受元数据控制。 数据本身以用户可以理解的形式呈现给用户-主题区域的结构和其中的相应条目。 用户可以随意更改结构和数据,包括对其进行批量操作。

我们没有发明任何新东西:所有数据已经​​存储在文件系统中,并且使用B树在文件系统或数据库中进行搜索。 我们只是重新组织了数据的表示形式,以使使用起来更加容易和清晰。



要使用此数据表示形式,您将需要一个非常紧凑的内核软件-我们的数据库引擎的大小小于计算机BIOS的大小,因此,如果不在硬件中实现,则至少可以做到与之相同的速度和错误-尽可能免费。 出于安全原因,它也可以是只读的。

在我最喜欢的.Net中向程序集中添加新类,我们仅在定义此类时就可以观察到200-300 MB RAM的丢失。 这些兆字节将无法放入适当级别的缓存中,从而导致系统在磁盘上进行交换,并因此而产生所有开销。 Java也有类似情况。 使用五重字节对同一类的描述将占用数十或数百个字节,因为该类仅使用原始操作来处理内核已经知道的数据。

您可能会认为这种方法已经在各种应用程序中实现了很多次,但事实并非如此。


我们在互联网和知识产权(专利)方面都进行了深入的搜索,没有人声称要采取完全相同的解决方案来打破构造函数, 单表解决方案和其他基于EAV的系统的性能极限。 但是,我们在这种五重态应用程序中放入了数百GB的数据,发现它运行良好。 如果您想查看证据,创建和测试自己的实例,请随时访问我们的github帐户。

我们构建的平台原型包含四个组件:

  1. Visual Type编辑器定义元数据
  2. 数据导航工具,如简单的SQL导航器
  3. 可视报表设计器来构建对数据的SQL查询
  4. 模板处理器,用于将模板与查询检索的数据结合在一起



按照预期,使用原型时,没有用户会认为里面有五重奏-这就像一个普通的构造函数。

如何处理不同的格式:RDBMS,NoSQL,列库
讨论的方法涵盖两个主要领域:RDBMS和NoSQL。 解决利用柱状数据库的问题时,我们需要告诉内核应该存储某些对象,同时考虑到对某种数据类型(我们的术语)的值进行大规模采样的优化。 因此,内核将能够以最有利可图的方式将数据放置在磁盘上。

因此,对于柱状DB,我们可以大大节省五重奏所占用的空间:仅使用其五个组成部分中的一个或两个来存储有用的数据,而不是使用五个,并且还使用索引仅表示数据链的开始。 在许多情况下,仅索引将用于从我们的柱状基础类似物中进行采样,而无需访问五重奏列表本身的数据。

应该注意的是,这种想法并非旨在从这三种类型的数据库中收集所有高级开发。 相反,新系统的引擎将尽可能减少,仅体现必要的最少功能-此处描述的概念涵盖DDL和DML请求的所有内容。


编程范例


所描述的方法不仅限于五重奏的使用,而且还提倡了一种不同于程序员习惯的范式。 我们提出查询语言而不是命令性,声明性或对象语言,而是让人类更熟悉,并允许我们直接将任务设置给计算机,从而绕过程序员和现有开发环境的不可穿透层。

当然,在大多数情况下,仍然需要从外行用户语言翻译成明确要求的语言。

将在带有示例和现有开发的单独文章中更详细地描述此主题。

因此,不久,它的工作方式如下:

  1. 我们曾经使用五重字符描述了原始数据类型:字符串,数字,文件,文本等,并且还训练了内核来使用它们。 培训意味着正确地呈现数据并执行简单的操作。
  2. 现在,我们以元数据的形式描述用户术语(数据类型)。 该描述只是为每种用户类型指定原始数据类型并确定关系。
  3. 我们根据元数据指定的结构输入数据五重奏。 每个数据五重体都包含一个指向其类型和父级的链接,使您可以在数据存储中快速找到它。
  4. 内核任务归结为获取数据并对其执行简单的操作,以实现用户定义的任意复杂的算法。
  5. 用户使用显示两者的可视界面来管理数据算法


基本要求的体现保证了整个系统的图灵完整性:内核可以执行顺序操作,有条件地分支,处理数据并在达到一定结果时停止工作。

对于一个人来说,好处是感知简单,例如,而不是声明一个涉及变量的循环

for (i = 0; i <length (A); i ++) if A [i] meets a condition do something with A [i] 


使用更易理解的形式,例如

 with every A, that match a condition, do something 


我们梦想从信息系统的底层细节中抽象出来:循环,构造函数,函数,清单,库-所有这些在程序员的大脑中占据了太多的空间,而为创新的工作和开发留出了很少的空间。

可扩展性


没有扩展的应用程序通常是无用的:需要无限的能力来扩展信息系统的负载能力。 在所描述的方法中,考虑到数据组织的极端简单性,结果证明扩展的组织方式不比现有体系结构复杂。

在上面带有服务请求的示例中,您可以例如通过它们的ID分隔它们,从而为不同的服务器生成具有固定HIGH字节的ID。 就是说,当使用32位存储ID时,根据需要,剩下的三,三或四位或更多位将指示存储这些应用程序的服务器。 因此,每个服务器将具有自己的ID池。

单个服务器的内核可以独立于其他服务器运行,而无需了解它们。 创建对象时,将使用最少的ID数为服务器赋予较高的优先级,以确保均匀的负载分配。

在这种数据组织中,由于请求和响应的可能变化范围有限,您将需要一个相当紧凑的调度程序,该调度程序可以在服务器之间分配请求并汇总其结果。

Source: https://habr.com/ru/post/zh-CN468927/


All Articles