从零开始,实现一个最简单的数据库:Property

因为自己对数据库了解不多,就只能走一步看一部了。先从模式(Schema)开始做起。但要做模式,就先要做属性(Property)。所以先实现一个类Property。

我的Property很简单,只有3个比较重要的字段:属性名,取值类型(如整型、字符串),键类型(主键、外键)。

在写这个类的时候,主要考虑2件事情:1,Property在内存中是怎么体现的,也就是这个类的字段;2,怎么保存到硬盘(metadata文件)中去。

下面仅把类的声明列出来,具体实现就算了,免得页面太凌乱、而且有凑字数之嫌。

先做到这里吧,下一步需要什么功能再添加进去。

简单做过1、2次测试,debug了大半天,终于问题解决可以(暂时)正常运行了。

// LzjSchema中的列
// 本对象为定长对象,故Serialize、Unserialize均较易
class LzjProperty{
public:
	enum LP_ValueType{	// 该属性的取值类型
		LP_Integer,	// 整型
		LP_Float,	// 浮点型
		LP_Date,	// 日期
		LP_Time,	// 时间
		LP_Char,	// 字符型
	};
	enum LP_KeyType{	// 本属性的键类型
		LP_None	= 0,	// 非主/外键
		LP_PrimaryKey	= 1<<0,	// 主键
		LP_ForeignKey	= 1<<1,	// 外键,即【本表所引用的表】的主键
	};
	enum LP_ConstraintType{	// 限制
//		LP_None	= 0,		// 无限制
		LP_NotNull	= 1<<0,	// 非Null
		LP_Unique	= 1<<1,	// 唯一性
	};
public:
	LString		m_strPropertyName;	// 属性名
	LP_ValueType	m_valueType;
	LP_KeyType	m_keyType;
	LP_ConstraintType	m_constraintType;
public:
	LzjProperty();
	LzjProperty(LString strPropertyName, LP_ValueType valueType, LP_KeyType keyType, LP_ConstraintType constraintType);
	void	SetProperty(LString strPropertyName, LP_ValueType valueType, LP_KeyType keyType, LP_ConstraintType constraintType);

	void	Serialize(LFile *pFile);	// 序列化,即:将本对象保存在文件中
	void	Unserialize(LFile *pFile);	// 反序列化,即:从文件中恢复本对象
};

下面是我在写这个类之前的头脑风暴,不过太乱了,基本上没人(包括我自己)看得懂。

时间: 06-07

从零开始,实现一个最简单的数据库:Property的相关文章

从零开始实现一个最简单的数据库_Step2:Schema

属性(Property)做好后,就到了模式(Schema)了.其实模式仅仅是属性的封装,属性写的稳健的话,模式做起来会轻松很多. 因为我是一点点的写的代码,写之前也没有做太多架构方面的东西(毕竟小程序),所以经常会有修改.基本上从周一改到了今天,接口方面改的还不是特别的多,但实现方面确实几经周折. 我在写模式的时候,考虑最多的也就,2件事情:1,在设计层面,模式应该包含哪些内容(当然主要是属性),又有哪些类需要用到模式(以及怎么使用它):2,模式在内存.硬盘中都是以何种方式进行存储的.最早的时候

从零开始实现一个最简单的数据库_Step4:Table

记录(Record)做好后,表(Table)就简单了. 基本上表要做的工作就是对记录的管理,增删改查那一套. 到了这里,基本上需要的功能都差不多了,目前能想到的就是这些.下一步打算是把代码优化一下,更稳健一些,毕竟里面大量使用了指针,很有可能在哪个角落里没有处理好对象的创建.删除,会导致后面程序的不健壮.然后就是把接口再优化一下,做一些Demo程序,来规范本数据库的使用.没问题了就可以考虑ERP了. 当然,在写ERP的时候肯定会对数据库提出各种各样的要求,到时候肯定会再回过头来修改这个数据库的.

从零开始实现一个最简单的数据库_Step3:Record

模式(Schema)做好后,接下来就是实际的数据了.也就是表(Table)和记录(Record).先从记录开始吧. 记录,也就是表中的一行数据.这里有个难点,就是表的模式是不定的,其属性的个数.值类型都是动态的,所以怎么样能在记录中保存[数量.类型不定的值]呢?这里我用的是保存指针的方法,也就是:Record中实际保存的是指针的列表,然后这些指针指向了实际要保存的数值:同时,这些指针在保存时都以DWORD*的类型保存,而Record中提供了GetPrptyType(int nPrptyIndex

PHP实现的一个简单的数据库操作类

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $username; private $password; public $default_db; public $link; // 声明构造函数 public f

PHP实现的一个简单的数据库操作类(修改版)

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $port; private $username; private $password; public $default_db; private $charset;

Mybatis_reveiw之Mybatis官方的一个很简单的Demo

上学的时候,一个老师讲了个故事,这个故事的大意是,我们有很多种方式去削苹果,第一种方式,使用指甲刀,第二种方式,使用机床,第三种方式,使用手摇的那种削平果小工具.我们当然都能够完成这个简单的需求,但是使用指甲刀削出来的苹果一定比较坑坑洼洼,不够美观,而且可能会让人感觉到有点没啥食欲.使用机床呢?可能会造成大量的浪费,原本一个美观大方的苹果变成了只能啃几口的正方形.第三个,因为是专门为了削苹果皮而设计的,理论上是最合适用来解决削苹果这个问题的解决方案. 一个好的架构,其实要做的事情是非常简单的,除

从零开始启动一个项目,需要哪些准备工作

原文链接这里 话题的由来 某天午饭前,项目组一同事挑起了这个话题,由于是马上要到饭点了,所以没有细聊,但公认的结论是,从零开始准备一个项目,花费的工作量不小. 由于最近我参与了一个全新的web项目,有切身的体验,所以记录下来. 主要的工作量包括如下几点: 代码开发环境准备 开源软件选择 版本管理软件 基础代码开发 问题处理 制度建设 代码开发环境准备 支持j2ee的eclipse,版本当然要最新的,插件则包括easyexplore.国际化资源编辑器: JDK1.8,注意不是JRE1.8,要附带源

手把手教你从零开始做一个好看的 APP

前言 从零开始,手把手带你实现一个「专注睡前的 APP」.睡觉之前如果能有一个 APP,能让我们写一写这一天的见闻或者心得,同时又能看一会段子.瞄一会好看的妹子,放松一下疲惫的身心那该多好,这也是我完成这个 APP 的原因.APP 的全部代码我已经分享到?Github?上了,需要的直接 点击这里,如果喜欢的话,麻烦给个 star,谢谢啦. 本文为这一系列文章的总述,如果觉得篇幅过长,请点击下面的连接 手把手教你从零开始做一个好看的 APP - Day one 手把手教你从零开始做一个好看的 AP

Mybatis实现简单的数据库增删改查操作

Mybatis实现简单的数据库增删改查操作 框架:mybatis(3.5.2) 数据库:mysql 工具:idea 1.新建一个maven项目,在pom文件中添加mybatis依赖及MySQL依赖 <!-- mybatis核心依赖 --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId&g