前言
探讨用文件存储数据的方式.这里的文件和操作系统里的文件系统有一点联系但关系不大
引入
前一篇帖子中用数据结构设计+数据库,是典型的软件架构.但不是唯一的.数据存储可以用文件的方式.数据库说到底是一种工具,再好用也是别人给的.而数据文件可以完全由自己掌控,有那么一些意义存在,心里踏实一些.
几个概念
在数据文件的实现中,笔者引入几个概念,有的是前面说过的,有的是自己增加的.
1.数据对象
数据对象是对现实事物的抽象,他是一个名词,例如:学校,年级,学生.
数据对象有其数据类型,以及基于数据类型的标识.详细内容见前面的贴
2.表
1)表的特点:只能描述字长单元长度以内的数据.表被作为数据文件中的++数据单元++.
**---**说明:CPU认识的基本数据单元是字节(位也能认识但需要操作),表作为数据单元方便分析
|-----|-----|-----|-----|-----|
| | 属性1 | 属性2 | 属性3 | 属性4 |
| 元组1 | | | | |
| 元组2 | | | | |
| 元组3 | | | | |
同时表自带"集合"形式,一个表可以含1个或多个元组
2)表和数据对象的关系:
数据对象由1个或多个表组成.当数据对象的属性全是简单数据类型时,数据对象由1个表描述
数据对象是对数据的一种抽象描述,而表可以看作是物理描述
3.数据文件
数据文件可以由一个表或多个表所组成.表是数据单元,文件由若干数据单元组成
例如:下面的文件里放了两个表
1.dat
|------|-------|-------|-------|
| | 面积 | 是否公立 | |
| 日出小学 | 10000 | 是 | |
| 东方小学 | 12000 | 是 | |
| 红星小学 | 9500 | 是 | |
| | | | |
| A市B区小学属性表 ||| |
| | | | |
| | 班数 | 所处教学楼 | 有无兴趣课 |
| 1年级 | 3 | 1栋 | 无 |
| 2年级 | 3 | 1栋 | 无 |
| 3年级 | 4 | 2栋 | 无 |
| 4年级 | 3 | 2栋 | 有 |
| 5年级 | 4 | 2栋 | 有 |
| 6年级 | 5 | 3栋 | 有 |
| | | | |
| 日出小学内容表--年级属性表 ||||
他们的属性个数是不一样的.这里再引入一个概念:如果两个表的属性个数不一样,或者属性个数一样但是表达的意思不一样,则他们属于不同的表---和代码层面判断不同数据类型是类似的.
数据文件内容的访问
表可以看作是可视化的数据 .例如上面的"日出小学内容表--年级属性表",在"1年级"所在的元组,表示所有1年级的内容在这一行.包括了他对应的属性(班数,所在教学楼等)的值
之前说过:数据文件的访问=指向文件的指针+偏移.对于数据文件来说,表是数据单元.对于表来说表中的属性也是数据单元.当需要访问1年级所在班数的值时,需要指针偏移n个单位.也就是说数据文件中的数据访问是个有序的过程,先访问行再访问列 .先访问++1年级++ (指针指向他),再用对应的数据偏移量访问++1年级的班数++ .所以先让++文件指针++指向1年级,要顺次从前往后计算他的偏移量.
有了以上两个分析,怎样构建准确的数据访问呢?
1.建立一个表检索数据文件内容
表的抽象形式如下:
|----|---------|--------------|----------------|
| 序号 | 属性1(表名) | 每个表的元组个数 | 每个元组数据所占空间 |
| 1 | 表1 | | |
| 2 | 表2 | | |
| 3 | | | |
| | | | |
| 映射数据文件的表 ||||
以上述1.dat为例,他的表如下:
|----|---------|----------|--------------------|
| 序号 | 属性1(表名) | 每个表的元组个数 | 每个元组数据所占空间 |
| 1 | A市B区小学表 | 3 | 9(double_8+char_1) |
| 2 | 日出小学年级表 | 6 | 3 |
| 3 | | | |
| | | | |
| 映射1.dat的表 ||||
这样做的目的是把数据文件分成正确的"块",而这些数据块映射了对象.
例如想要查找日出小学一年级的数据,需要找到"日出小学年级表",用代码表示如下:
//伪代码
File* fp=1.dat //文件指针指向1.dat
fp+=3x9; //文件指针偏移3x9=27,此时指向了日出小学表
说明:1.dat的设计显然是不合理的,1.dat映射表形成的文件,取个什么名好呢?暂时可以不管
2.输入+搜索算法保证准确查询
第一步的检索表解决了数据分块的问题.下面解决正确查询.
1.对输入进行约束,如下:
学校表添加序号,作为搜索条件
|----|------|
| 序号 | |
| 1 | 日出小学 |
| 2 | 东方小学 |
| 3 | 红星小学 |
年级表添加序号(也可以不加)
|----|-----|
| 序号 | |
| 1 | 1年级 |
| 2 | 2年级 |
| 3 | 3年级 |
| 4 | 4年级 |
| 5 | 5年级 |
| 6 | 6年级 |
2.根据序号,查找内容进行偏移
例如想查询日出小学3年级所在教学楼位置,输入2,3,2.文件指针偏移先找到"日出小学年级表",再偏移3x3=9,找到"3年级",再根据输入2,偏移2字节找到"所在教学楼"--2栋
数据文件的建立(表的填充)也是非常灵活和多样的,本贴只讲了数据部分,实际上文件的建立,要加上其他内容,例如文件戳,每个文件的头部有一些原始内容:文件建立时间,修改时间,字节大小,使用者等内容,这些都是需要空间的,根据操作系统不同有要求.
数据文件和操作系统间的交互
这部分内容和发布程序有关,笔者暂时没有相关内容,但可以作为一个思考方向
小结
数据文件可以作为数据的一种存储形式.在数据库应用如此广泛的今天,他给了程序员一些自由发挥的空间,增加一些筹码.