如何设计一个C语言面向结构体的内存数据库

内存数据库

一般所谓内存数据库,是指能够与应用运行在同一个进程内的数据库,也就是说能够被嵌入到进程内运行的数据库。

比较著名的内存数据库软件,例如,Sqlite;以及新生代的NOSql key-value数据库bdb(Berkeley DB)lmdb(Lighning Memory-Mapped Database)等。

数据库一般功能

  • 对增删改查CRUD操作的支持
  • 高效、丰富的索引,例如,对于Blob数据以及JSON数据的支持
  • 事务特性
  • 持久化要求

我们的需求

  • 能够直接操作结构体内存,避免数据库操作间的重复内存拷贝,要求内存数据库要面向结构体设计
  • 能够完成增、删、改、查CRUD等数据库常规操作
  • 提供高效、丰富的索引能力
  • 因为是受限使用场景,可以接受其它方面数据库功能的弱化

深入分析需求

我们使用内存数据库的场景相对小众,因为能够直接操作结构体内存,虽然避免传统的在内存数据库接口层的内存隔离拷贝,但,因为内存对使用者直接曝露,应用修改内存后,特别是涉及到索引字段的修改时,必须特殊调用UpdateIndex(...)接口,以保证数据库内信息的一致性。

但,特别地,如果不涉及索引字段修改,只涉及非索引相关字段,在查询获得结构体内存地址后,可以直接按照结构体的定义访问结构体的内存,而无需特殊数据库接口API动作。

这种特殊需求的内存数据库,可以称之为面向结构体的内存数据库需求。

因其简单、直接、高效之处,应该有其合适使用的舞台。

分析

我们知道传统的关系内存数据库,是能够与C语言的结构体,以及面向对象语言中的对象,做很好模型到数据库的映射。

但,对于能够按照结构体操作内存的需求,因为传统的Sqlite内存数据库,在接口处会进行拷贝隔离,会多引发一些拷贝。

而那些面向key-value的键值数据库,更无法简单地支持面向结构体的内存数据库操作需求。

看来只能另辟蹊径 😃

如何设计呢

玩具级别

数据结构如何使用
Queue做忙闲资源管理
MAP做索引管理
Array做结构体存储管理
typedef struct
{unsigned int rowid;/*柔性数组*/unsigned char anyStruct[0];
} TableRowtypedef struct 
{int i;int j;
} A;typedef struct
{TableRow row;A a;
} MemoryTableA;// 或动态申请内存
MemoryTableA atTableA[MAX_ROW];
  • 我们知道C语言对于MAP数据结构的支持能力很弱,而且单一使用MAP做索引管理,适应能力也不够全面,所以,可称之为玩具版面向结构体的内存数据库。

丰富高效的索引能力支持,还离不开B+树、红黑树等数据结构的支持

架构师水平的设计

组件如何使用
Queue做忙闲资源管理
Sqlit负责结构体成员索引管理,会根据建内存表时的索引配置,创建位于Sqlite的关系表,用做索引表
-索引表的列为结构体的特殊索引成员字段,并同时提供rowid列,或结构体内存指针列作为映射,见下表示意
Array做结构体内存存储管理

借助Sqlite丰富的索引支持能力,将面向结构体的内存数据库,特别是索引部分做的更通用和高效

Sqlite内索引表

field1 of structfield2 of structarray rowidstruct pointer

field*列上按照要求做唯一索引、非唯一索引、联合索引等

更高水平的要求

去除对于Sqlite组件的依赖,相当于重复制造必要的轮子,但也可以使这种面向结构体的内存数据库开宗立派了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础(十九):集合框架

目录 一、Java集合框架体系二、Collection接口及方法1、添加2、判断3、删除4、其它 三、Iterator(迭代器)接口1、Iterator接口2、迭代器的执行原理3、foreach循环 四、Collection子接口1:List1、List接口特点2、List接口方法3、List接口主要实现类:Array…

GuLi商城-商品服务-API-品牌管理-统一异常处理

每个方法都加这段校验太麻烦了 准备做一个统一异常处理@ControllerAdvice 后台代码: package com.nanjing.gulimall.product.exception;import com.nanjing.common.exception.BizCodeEnum; import com.nanjing.common.utils.R; import lombok.extern.slf4j.Slf4j; import org…

【Linux】任务管理

这个任务管理(job control)是用在bash环境下的,也就是说:【当我们登录系统获取bashshell之后,在单一终端下同时执行多个任务的操作管理】。 举例来说,我们在登录bash后,可以一边复制文件、一边查…

adb 常用的命令总结

1、adb logcat 抓取日志 adb logcat > d:\log.txt Ctrlc 结束日志抓取 adb logcat -c > d:\log.txt 清空旧日志 发生Native Crash 时,抓取错误报告 adb logcat -b crash 抓取筛选后的日志: adb logcat -s AndroidRuntime > d:\log…

解析Java中1000个常用类:EnumSet类,你学会了吗?

在线工具站 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站:…

CSS 单位中 px、em 和 rem 的区别?

在CSS中,px、em和rem是常用的长度单位,它们之间有一些区别: px(像素): px是相对长度单位,它是相对于显示器屏幕分辨率的一个点的大小。 px单位是固定的,不会随着父元…

代码随想录算法训练营第五十二天(图论)| 98. 所有可达路径、深度优先搜索、广度优先搜索

邻接矩阵 邻接矩阵是一种使用二维数组来表示图的方法。矩阵中的元素表示节点之间是否存在边。如果存在边,则对应的矩阵元素为1(或边的权重);否则为0。 特点: 空间复杂度高:无论图是否稀疏,邻…

前端Canvas入门——一些注意事项

创建渐变的三种方法: createLinearGradient() - 线性渐变 createRadialGradient() - 径向渐变(放射性渐变) createConicGradient() - 锥形渐变 这三种的核心观点都是: 创建一个gradient对象,然后调用addColorStop()方法…

【java】力扣 合并两个有序链表

文章目录 题目描述题目链接思路代码 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 题目链接 21. 合并两个有序链表 思路 先定义一个哨兵节点dummy,为了方便解题 然后定义一个节点pre&#xff0…

paddlepaddle2.6,paddleorc2.8,cuda12,cudnn,nccl,python10环境

1.安装英伟达显卡驱动 首先需要到NAVIDIA官网去查自己的电脑是不是支持GPU运算。 网址是:CUDA GPUs | NVIDIA Developer。打开后的界面大致如下,只要里边有对应的型号就可以用GPU运算,并且每一款设备都列出来相关的计算能力(Compu…

模板方法模式的实现

1. 引言: 交易管理系统中的模板方法模式 之前做过一个交易管理系统,其中有一个核心模块是“交易流程管理”,该模块需要处理不同类型的交易,比如期货交易、期权交易和股票交易。在构建交易管理系统的过程中,我们面临了一个核心挑战…

为二进制文件添加.gnu_debugdata调试信息

前言 在使用gcc/g编译二进制文件过程中,如果添加了-g参数,编译出来的二进制文件会带有debug信息,供调试使用。但是debug信息往往占用空间很大,导致二进制文件太大,在发布到生产环境时,一般会去掉调试信息&…

(南京观海微电子)——电容应用及选取

什么是电容器? 电容器是一种在内部电场中储存能量的电子器件。它与电阻器、电感器一样,都是基本的无源电子元件。所有电容器都具有相同的基本结构,两块导电极板中间由绝缘体隔开,该绝缘体称为电介质,可在施加电场后发…

时间轮算法理解、Kafka实现

概述 TimingWheel,时间轮,简单理解就是一种用来存储若干个定时任务的环状队列(或数组),工作原理和钟表的表盘类似。 关于环形队列,请参考环形队列。 时间轮由两个部分组成,一个环状数组&…

一文了解MySQL的表级锁

文章目录 ☃️概述☃️表级锁❄️❄️介绍❄️❄️表锁❄️❄️元数据锁❄️❄️意向锁⛷️⛷️⛷️ 介绍 ☃️概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外&#xff0…

Coze:如何使用团队空间?

你好,我是三桥君 团队空间,是一个允许我们组建团队并共享机器人、插件等资源的功能。 好的,让我们开始创建一个团队。我们将这个团队命名为“三桥君AI”,并在描述中也填写“这里是关于“三桥君AI”团队的描述”。点击确定后&…

VMware_centos8安装

目录 VMware Workstation Pro的安装 安装centos VMware Workstation Pro的安装 正版VMware 17百度网盘下载链接 (含秘钥) 链接:https://pan.baidu.com/s/16zB-7IAACM_1hwR1nsk12g?pwd1111 提取码:1111 第一次运行会要求输入秘钥 秘钥在上边的百度网盘…

【CUDA|CUDNN】安装

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 显卡驱动安装参考之前的文章 cuda、cudnn 安装 1. cuda 安装 访问https://developer.nvidia.com/cuda-toolkit-archive 选择需要的版本:h…

Selenium使用注意事项:

find_element 和 find_elements 的区别 WebDriver和WebElement的区别 问题: 会遇到报错: selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector",&…

双管正激小功率电源的设计与实现

正激变换由于拓扑简单, 升/ 降压范围宽, 广泛应用于中小功率电源变换场合。正激变换器的输出功率不象反激变换器那样受变压器储能的限制, 因此输出功率较反激变换器大, 但是正激变换器的开关管电压应力高, 为两倍输入电…