从零开始,实现一个最简单的数据库: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);	// 反序列化,即:从文件中恢复本对象
};

 

 

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

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。