术语
SmartEDB数据库系统的初衷是从嵌入式和低延迟系统的角度出发,设计提供高效的存储解决方案,为应用程序开发人员提供一个可以高效运营现代编程技术的数据库开发工具。
数据库 是为有效存储和检索而组织的相关数据的集合。任何更具体的数据库描述,都必定会联系到一个或多个特定数据库的实现。以下定义即描述了SmartEDB的实现。
每个数据库都有元素分组。我们把一组元素的定义为类,其他常用的术语是**“表”和“记录定义”**。
存储在数据库中类的实例称为对象,类似于记录和行。
术语**“类”**用于大多数面向对象语言,如C++、Java或C#。类定义对象的属性和用于控制对象行为的方法。这个定义对于SmartEDB类也适用——数据库类定义对象字段和访问方法。
字段
元素在SmartEDB中称为字段,其他常用术语是“属性”和“列”。字段有一个**"类型"属性。"类型"确定元素是否保存字符、整数、实数或二进制数据。我们不是将SmartEDB元素等同于关系数据库或其他数据库的元素,而是概述元素的层次结构**,并将其与熟悉的数据库架构元素进行对比。
- 简单字段是原子类型,如char、integer、string等。
- 复杂字段可以是简单类型的向量、结构(可能依次包含结构和向量)、结构的向量和blob。
SmartEDB通过**”blob”和“vector”**类型支持任意大的字段,并通过结构类型支持复杂字段。
blob - 是一个任意大的字节流,是未类型化的“不透明”数据。从SmartEDB的角度来看,它没有结构。经典的例子是音频流(.wav文件),视频流(.wav文件)。图形文件(.jpg文件),以及大于64k的文本流。
vector - 向量(vector)是任意大的类型化数据流(向量元素),例如2字节整数、字符串或结构体流。在SmartEDB中,您可以定义除blob以外的任何类型的向量。向量在描述现实世界的复杂对象(如树状数据结构)时非常有用。
结构
除了将字段分组到一个类中,SmartEDB还允许称为**“结构”的子分组。“结构”声明指定一个类型,并指定“结构”中可以具有不同类型的元素。“结构”和“简单类型”是构造类定义的构建块。“结构”可以用作其他结构(即嵌套结构)的元素。与其他元素类型一样,您可以使用“结构向量”**。
重要
注意:与C或C++结构相反,SmartEDB结构不能单独实例化,仅作为某个类的对象的一部分存在。
记录
在关系型或层次型数据模型中,**"记录"**是由基本数据类型字段构成的。内置数据类型和内置操作的集合是由业务数据处理应用程序的需求所推动的。然而,在许多工程或科学应用中,该集合并不足够。例如,在科学应用中,可能需要描述时间序列并使用适当的操作来存储和访问它。另一个常见的例子是在工程应用中广泛使用的树形结构,例如路由表或机顶盒上的“电子节目指南”实现。历史上,复杂的数据类型和操作通常使用由DBMS提供的基本数据类型和操作来模拟,这带来了极大的低效和复杂性。复杂的对象由多个基本表或记录表示,并定义它们之间的关系。
在使用传统的关系型或层次型数据模型时,应用程序开发人员会将他们的对象表示为表中的记录或行。在很多情况下,对象不能用单个记录表示,因此开发人员被迫将对象的部分存储在不同的表中,并定义对象部分之间的关系。在DBMS术语中,这些步骤被称为规范化和对象关系映射。然而,对象是实体,其所有部分都作为一个整体而工作。因此,开发人员通常会引入自己的API来存储和检索对象。这些API隐藏了对象内部的复杂性,但同时也引入了必须编写、调试和执行的额外层应用程序代码。
可以按照前面一段所描述的方式使用SmartEDB。或者,由于SmartEDB采用面向对象的开发方法,因此对象的性质可以比仅仅由一维字段组成的集合更为复杂。例如,SmartEDB的字段本身也可以具有复杂的结构,例如,一个字段可能是动态数组的结构;在这个数组中的结构也可以包含其他结构或数组。SmartEDB类访问方法允许以简单但非常高效的方式访问对象,而无需额外的导航代码层。
SmartEDB为C和C++数据类型扩展了符合ACID标准的数据访问方法(参阅ACID详细信息),为开发人员提供了一种简单、干净、高效且易于调整的数据库开发方法。同样,Java和.NET Framework开发人员可以通过简单的注释为Java和C#类添加SmartEDB持久性。
索引
SmartEDB和其他数据库一样,提供索引来根据关键值访问对象。索引定义包含来自给定类的任何字段、结构元素或向量元素的组合。索引可以有各种类型,最常见的是哈希索引或树(BTree)索引。树索引可以包含升序和降序组件,除了精确匹配搜索外,还可以用于排序和基于范围的检索。哈希索引用于快速存储和检索,但不支持排序或基于范围的访问。树索引和哈希索引都可以声明为唯一索引或非唯一索引,以排除或允许重复值。
SmartEDB还提供了一系列针对特定类型应用程序的专用索引,以优化对记录和记录组的访问,例如:
- Patricia Trie - 这些索引尤其适用于网络和电信应用,常用于快速执行IP地址前缀匹配,以查找IP子网、网络或路由表。
- R-Tree - 这些索引通常用于对经纬度和速度进行空间搜索;例如,查找包含给定点的矩形,或所有与指定矩形重叠的矩形。
- Kd-Tree - 使用一种组织k维空间中点的数据结构,Kd-树可以加快涉及多维搜索键的查找操作,最常用于按格式查询和按示例查询的情况。
索引还可以用于在不同类的对象之间建立关系,就像关系数据库中使用的主键和外键的概念一样。根据定义,主键是表中唯一标识每行的一列或多列。相应地,外键是另一张表的主键的值相匹配的一列或多列。在SmartEDB中,主键通常通过在类中的字段或字段组合上实现唯一索引来实现,而外键通常通过非唯一索引(允许出现重复项)实现,该索引的元素(字段)对应于数据库中其他类的主键。
对象标识符(oid)
除了索引之外,SmartEDB中的类还可以声明具有对象标识符(oid)。这些与主键不同,因为数据库中每个类的oid组成是相同的。一个类还可以通过声明一个数据类型为ref的字段来引用另一个类的对象,称为引用。ref是一
起初,人们可能会觉得奇怪,数据库中的每个类都必须具有相同的组成。实际上,在许多应用环境中,这种模型反映了现实世界。例如,一个从自动化源接收数据的系统将接收由源提供的标识对象。
例如,一个传感器网络中的每个传感器类的oid可能是传感器类型+传感器ID+测量时间戳。请注意,并非每个类都需要具有oid。
索引可以用于通过一个或多个关键字段实现对对象的快速随机访问、排序访问和范围检索。
oids 和 refs 通常是比索引更好的建立对象间关系的替代方案。一个对象可以有一个指向另一个对象的引用向量,作为实现类间一对多关系的一种方式。
autoid类型
SmartEDB还提供了autoid类型。autoid类似于其他DBMS中各种称为序列、序号、自动递增等的类型。autoid与oid类似,但autoid字段的结构和值由运行时系统决定。在C和C++应用程序中,应用程序使用autoid_t类型别名来声明用于存储autoid值和AutoID属性的程序变量。在Java和C#应用程序中,应用程序使用AutoID属性创建一个对象对另一个对象的autoid值的引用。autoid和autoid_t可以在自然oid不存在、过于繁琐或需要自动递增标识符时作为oid和ref的替代品使用。
模式
为了在C和C++项目中表达数据库的内容和组织结构,数据库设计师会使用数据定义语言(DDL)中的一些或所有组件来创建数据库**“模式”**。
“模式”是数据模型的文本描述。由SmartEDB模式编译器处理,以确保模式的语法正确,然后生成应用程序编程接口(API)头文件(.h)和实现文件(.c)。当应用程序编译时,从实现文件中生成数据库字典。数据库字典只是数据库运行时可以更高效使用的模式的二进制形式。
相反,在Java和C#项目中,“模式”由带有“Persistent”标记的本地语言类组成,数据库字典在运行时生成,当时通过反射机制获取数据库对象的属性。
提示
这里的“Persistent”仅意味着对象存储在SmartEDB数据库中,该数据库可能位于内存或文件系统中。“Persistent”注释仅用于区分这些类和普通的非持久化Java或C#类,这些类的对象不存储在数据库中。
注意
也可以构建结合Java或C#类实现与通过C或C++ API与SmartEDB数据库交互的模块或库的SmartEDB应用程序架构。在这种情况下,必须通过调用Database类的GenerateMcoFile()
方法从持久化的Java或C#类生成C或C++模块所需的Schema文件。然后可以使用Schema编译器mcocomp
处理该文件。
一个使用C或C++编写的SmartEDB应用程序使用由模式编译器生成的API来存储、读取和操作SmartEDB数据库中的对象。这与许多提供静态专有导航API或静态标准API(如SQL)的数据库产品不同。SmartEDB的API始终是针对应用程序的,因此与应用程序的集成自然而然地发生。它与由开发人员专门为应用程序需求编写的数据库接口非常相似,这也是设计之初的意图。在嵌入式系统领域,任何商业数据库产品的常见替代方案是“自研”数据库。SmartEDB提供了“自研”数据库的所有优点,即最佳性能和较小的占用空间,没有不必要的负担,以及与应用程序其他部分无缝集成的API,同时提供了离线数据库解决方案的优势:更低的开发成本、更低的维护成本和更短的上市时间。