五重奏是描述主题领域的基本实体

五重奏是一种记录原子数据的方法,这些数据表明了它们在我们生活中的作用。 五重奏可以描述任何数据,而每个数据都包含有关您自己以及与其他五重奏的关系的详尽信息。 无论使用什么平台,它都代表域术语。 它的任务是简化数据存储并提高其表示的可见性。



我将讨论一种用于存储和处理信息的新方法,并分享我在此新范例中创建开发平台的想法。

五重奏具有以下属性:类型,值,父级,兄弟之间的顺序。 使用标识符,仅获得5个组件。 这是记录信息的最简单的通用形式,这是一种可能适合所有人的新标准。 五重奏存储在连续单调索引信息字段中的单一结构的文件系统中。

要记录信息,有无数的标准,方法和规则,使用这些记录所必需的知识。 标准是分开描述的,并不直接与数据相关。 如果使用五重奏,则可以获取其中的任何一个,有关其性质,属性和使用其主题领域的规则的相关信息。 它的标准在所有领域都是统一的。 五重奏对用户是隐藏的-元数据和数据以许多人熟悉的形式提供给用户。

五重奏不仅是信息,而且是可执行命令。 但最重要的是,它是您要存储,记录和检索的数据。 由于在我们的例子中,它们是直接寻址,连接和索引的,因此我们会将它们存储在一种数据库中。 例如,为了测试五重态数据存储系统的原型,我们使用了常规的关系数据库。

五重奏结构


本文的主要思想是用人工术语替换机器类型,并用对象替换变量。 不是通过需要构造函数,析构函数,接口和垃圾收集器的对象,而是通过客户操作的纯水晶信息单元。 也就是说,如果客户说“应用程序”,那么在媒体上保存此信息的本质就不需要程序员的专业知识。



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

基本概念


任何人都可以理解一组数据类型:字符串,数字,文件,文本,日期等。 这样一个简单的集合足以解决问题,并对问题及其实现所需的类型进行“编程”。 五重奏表示的基本类型可能如下所示:



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

背景知识


由于用户和程序员之间的分析差距,在解决问题的阶段会发生概念的重大变形。 从用户的角度来看,轻描淡写,难以理解和主动提出的建议通常会使客户的简单易懂的想法变成逻辑上不可能的组合。



知识转移必须没有损失或扭曲。 而且,将来,当组织这种知识的存储时,有必要摆脱所选数据管理系统所施加的限制。

如何储存资料


通常,服务器上有许多数据库;每个数据库都包含对实体结构的描述,并具有一组特定的属性-互连数据。 它们以特定顺序存储,最适合采样。
所提出的信息存储系统是各种众所周知的方法之间的折衷:列,字符串和NoSQL。 它旨在解决通常由这些方法之一执行的任务。

例如,列基础理论看起来很美:我们只读取所需的列,而不读取整个记录的所有行。 但是,实际上,数据不太可能放在介质上,因此它不适用于分析的许多不同部分。 请注意,可以添加和删除属性和分析指标,有时比我们重建此列经济性要快。 更不用说数据库中的数据可以调整的事实,由于不可避免的碎片化,这也将违反采样计划的美。

元数据


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

术语描述集是元数据,用于定义常规数据库中表和字段的结构。 例如,具有以下数据结构:具有内容(应用程序文本)和状态的日期的应用程序,生产过程中的参与者向其中添加指示日期的注释。 在传统的数据库构造函数中,它将如下所示:



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

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



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

以下是控制核心生成的用于描述此结构的五重奏:



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

了解五重奏之间的关系


用户资料


考虑为上述任务存储这样的数据集:



数据本身根据表示某些成员资格的结构以五组形式存储在五重奏中:



我们看到了使用aka Adjacency List方法存储的熟悉的层次结构。

性能表现


上面的示例非常简单,但是当结构复杂数千倍并且数据将达到千兆字节时,将会发生什么?

我们将需要:

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

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

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



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

开发平台的基础


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

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

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


要使用此数据表示形式,您需要一个非常紧凑的核心-我们的数据库引擎比计算机BIOS小一个数量级,因此,如果不使用硬件,则可以使其变得尽可能快和流畅。 出于安全原因,它也是只读的。

在我心爱的.Net的程序集中添加一个新类,我们只能观察到此类的描述而损失200-300 MB的RAM。 这些兆字节将无法放入正确级别的缓存中,从而导致系统陷入混乱。 Java也有类似情况。 用五重字节描述同一类将花费数十或数百个字节,因为该类仅使用原始技巧来处理内核已经熟悉的数据。

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

因此,对于列基础,我们可以显着节省五重奏占用的空间:仅使用其五个组成部分中的一个或两个来存储有用的数据(而不是五个),并且还仅使用索引来指示数据链的开始。 在许多情况下,仅索引将用于我们的模拟列基础中的样本,而无需访问表本身的数据。

应该注意的是,这个想法并没有设定从这三种类型的数据库中收集所有高级开发的目标。 相反,新系统的引擎将尽可能减少,仅体现必要的最少功能-此处描述的概念涵盖了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对其进行分隔,从而为不同的服务器生成具有固定高字节的ID。 也就是说,当使用32位进行ID存储时,根据需要,最高有效的三,三或四位或更多位将指示存储这些应用程序的服务器。 因此,每个服务器将具有自己的ID池。

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

鉴于单个数据组织的请求和响应的可能变化范围有限,您将需要一个相当紧凑的分派器,该分派器可在服务器之间分配请求并汇总其结果。

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


All Articles