当前位置: 首页 > news >正文

如何设计一个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组件的依赖,相当于重复制造必要的轮子,但也可以使这种面向结构体的内存数据库开宗立派了!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署MuseV (踩完了所有的坑):基于视觉条件并行去噪的无限长度和高保真虚拟人视频生成
  • 简谈设计模式之代理模式
  • 五、 计算机网络(考点篇)
  • 走进linux
  • C语言 | Leetcode C语言题解之第230题二叉搜索树中第K小的元素
  • 我的AI音乐梦:ChatGPT帮我做专辑
  • 【PyTorch单点知识】自动求导机制的原理与实践
  • Apache配置与应用(优化apache)
  • 【Excel】 批量跳转图片
  • C#,开发过程中技术点GPT问答记录
  • 深入理解FFmpeg--libavformat接口使用(一)
  • paddlepaddle2.6,paddleorc2.8,cuda12,cudnn,nccl,python10环境
  • c语言alpha-beta剪枝六子棋
  • 【C++深度探索】全面解析多态性机制(二)
  • 炒鸡清晰的防御综合实验(内含区域划分,安全策略,用户认证,NAT认证,智能选路,域名访问)
  • bearychat的java client
  • ECMAScript6(0):ES6简明参考手册
  • orm2 中文文档 3.1 模型属性
  • Python进阶细节
  • SQL 难点解决:记录的引用
  • Travix是如何部署应用程序到Kubernetes上的
  • vue-cli3搭建项目
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 番外篇1:在Windows环境下安装JDK
  • 前嗅ForeSpider教程:创建模板
  • 如何实现 font-size 的响应式
  • 通过npm或yarn自动生成vue组件
  • 学习笔记TF060:图像语音结合,看图说话
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 7行Python代码的人脸识别
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ![CDATA[ ]] 是什么东东
  • #07【面试问题整理】嵌入式软件工程师
  • #define、const、typedef的差别
  • #微信小程序(布局、渲染层基础知识)
  • (+4)2.2UML建模图
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C#)一个最简单的链表类
  • (k8s中)docker netty OOM问题记录
  • (苍穹外卖)day03菜品管理
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二十六)Java 数据结构
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core 3.0 linux,.NET Core 3.0 的新增功能