嵌入式系统架构浅谈 数据库系统(一) - 数据库设计

600 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. 数据库系统

数据库系统是实现有组织地、动态地存储大量关联数据。与硬件、操作系统无关。

在产品中,数据的存储可使用文件系统存储,数据库系统存储两种方式。嵌入式行业因资源受限,数据量小的特点,会考虑采用文件系统存储数据。文件系统可以使用标准协议XML等,也可能会根据项目自定义存储结构。

与文件系统相比,数据库系统的存储方式有以下特点:

  1. 采用复杂的数据模型表示数据结构,数据冗余小,易扩充。
  2. 保证了数据和程序的独立性,容易在不同的应用系统之间共享数据。
  3. 数据库系统为用户提供了方便的接口函数。
  4. 数据库系统具备成熟的并发控制,恢复,完整性和安全性数据控制机制。

如果在嵌入式linux系统中,建议优先考虑使用数据库系统。而在单片机中,几乎不可避免得使用到文件系统。所以根据具体项目情况,选择合适的方案,无需追求数据库系统。

2. SQLite

嵌入式系统资源较为有限,一般不需要考虑高并发,发布式的使用场景,不合适采用大型数据库系统。SQLite是一款轻型的数据库,非常适合在嵌入式产品中,并且支持大部分的SQL语句和事务功能。

2.1 SQlite3使用

不展开说,参考文章: 一文掌握SQLite3基本用法_克勤&克己的博客-CSDN博客_sqlite3

3. 数据库设计

3.1 规范理论

设有一个关系模式R(员工姓名、部门、部门经理,部门经理联系电话),仔细分析一下,我们就会发现这个模式存在存储异常的问题:

  1. 数据冗余:如果某部门有100个员工,那么在R关系中就要出现100个元组,这部门的部门经理和联系电话也随之重复出现100次。
  2. 修改异常:由于上述冗余问题,当需要修改这个部门经理联系电话时,就要同时修改100个元组的联系电话值。
  3. 插入异常:如果不知道员工名单,这个部门经理和联系电话就无法进入数据库,否则就要在员工姓名处插入空值。
  4. 删除异常:如果某部门的部门经理要更换,那么原来部门经理的联系电话也随之丢失。

因此上述的关系模式R非常不合理。如果把R分解成两个关系模式:R1(员工姓名,部门名)和R2(部门名,部门经理,部门经理联系电话),则有效消除上述的问题。

在模式R中,员工与部门有直接联系,部门经理与部门有直接联系,而员工和部门经理无直接联系,这就产生了模式R的异常。因此,模式设计强调“每个联系单独表达”是一条重要的设计原则。

3.1.1 关系模式分解

如果某数据库模式存在类似以上提到的异常问题,则可通过分解该关系模式来解决问题。把一个关系模式分解成几个子关系模式,需要可考虑的是该分解是否保持原有依赖,是否无损联接。

3.2 反规范化理论

在对数据模型进行规范化时,主要通过拆分的方式达到目的,而不断的拆分带来了新的问题。因为对多个拆分后的表进行查询操作时,需要涉及大量的连接操作,使得查询变得费时与低效。为了有效地解决此问题,提出了反规范化理论,希望达到提供查询效率的目标。

3.2.1 增加派生列

指增加的列由表中其他数据计算生产。作用是在查询时减少连接操作,避免使用集函数。例如表中有单价,也有数据,此时增加列总额。

3.2.2 增加冗余列

在多个表中具有相同的列,避免在查询时连接操作。当查询时过多连接另一张表某列数据时,可以在该表增加一冗余列,查询时即可在一张表得到数据,无需连接到另一张表。

3.2.3 重新组表

当许多时候需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。

3.2.4 分割表

  1. 当表很大时,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
  2. 表中数据本来就有独立性。例如表中的数据某些列常用,另一些列不常用。

4. 嵌入式数据库设计

与常见的服务器后台数据相比,所有嵌入式的产品中,一般会具备以下特点:

  1. 产品的数据独立,100台设备就具备自身的100个数据,两两设备之间数据互不干扰。
  2. 硬件问题可能会产品更换,导致数据需进行从旧设备迁移到新设备。
  3. 嵌入式产品软件升级不及时。当软件版本升级时候,每个现场有不同的情况,会使得软件无法同步升级,致使各个现场使用的软件版本可能不一样。
  4. 嵌入式产品根据客户,定制个性化开发的情况较多。

在这里提出针对嵌入式数据库设计的几个思路:

  1. 系统数据与用户数据分离,比如设计成两个表,甚至两个数据库文件。目的是方便数据的迁移。当出现旧设备数据迁移到新设备时,可直接迁移用户数据,而不导致系统数据被覆盖。
  2. 用户数据可分为标准数据和非标准数据,预留个性化开发时使用。尽量保证标准产品和非标准产品之间的通用性。
  3. 嵌入式开发一般资源较少,应考虑效率问题,提高查询,插入的效率。设计数据结构时,减少冗余数据。
  4. 嵌入式产品高并发情况较少,设计良好的程序代码框架,减少数据库上锁的消耗。
  5. 兼容软件版本与数据库版本的问题。
  6. 可考虑数据库系统和文件系统相互配合使用的方案。