前言
软件层面的数据类表达已比较透彻,想再从硬件层面看数据类型是怎样表达的.
引入
如果从纯硬件的角度来看,他是不认识数据类型的,因为底层都是数字.所以用数据库中的"表"来模拟数据类型及对象.表的属性和软件的属性是相同的.而这种表示法可以看作是数据从软件向硬件的映射.
硬件数据类型
软件层面表达的数据类型回顾
在软件层面,数据类型要表达的内容可以抽象为"属性"和"内容"两部分.例如在上一篇帖子https://blog.csdn.net/jllws1/article/details/157152709?spm=1011.2124.3001.6209中"小学"的类型,内容 有Grade grades[6]这一项数据.现在此基础上做一些扩充,加入++公立/私立++ ,++面积++ ,++校长名++ ,这几项数据作为所有小学的属性,如下:
//小学定义
struct Primary_school{
Grade grades[6]; //6个年级
double square; //面积
string leader_name; //校长名称
bool if_public; //公立或私立,预设一个值如0表示私立,1表示公立
}
软件层面的数据类型是很灵活的,属于随时能改变,例如想表示每个小学种植有有若干种水果,可以加上vector<Fruit>对象,至于具体类型可以在后面设计.软件对数据的表达直观修改容易
表
数据库中的表可以看作是数据在硬件层面的表示,由"属性"和"元组"组成.
|-----|-----|-----|-----|-----|
| | 属性1 | 属性2 | 属性3 | 属性4 |
| 元组1 | | | | |
| 元组2 | | | | |
| 元组3 | | | | |
| | | | | |
| 表的抽象 |||||
软件和硬件对数据的描述本质上是一致的,也需要表达出++属性++ 和++内容++ .区别在于表无法表达复杂数据类型,即表是无法在单个属性里表达"指针"的,解决方法是使用多个表来表示指针.如小学类型有以下几个表
表1:小学属性
|------|-------|------|
| | 面积 | 是否公立 |
| 日出小学 | 10000 | 是 |
| 东方小学 | 12000 | 是 |
| 红星小学 | 9500 | 是 |
| | | |
| A市B区小学属性表 |||
从中可以看出用表来完成数据类型设计后,自带多个对象.他可以表示上一级---某范围内(这里用了A市B区)的所有小学的内容.
表2:校长名--属性
|---|----|
| | 字符 |
| 1 | 张 |
| 2 | 三 |
| 3 | 丰 |
| | |
| 日出小学校长姓名表 ||
软件层面的string类型实际上是字符的动态数组,vector<char>--C++表示或者char *--C语言表示
表3:年级表--内容
|-----|----|-------|-------|
| | 班数 | 所处教学楼 | 有无兴趣课 |
| 1年级 | 3 | 1栋 | 无 |
| 2年级 | 3 | 1栋 | 无 |
| 3年级 | 4 | 2栋 | 无 |
| 4年级 | 3 | 2栋 | 有 |
| 5年级 | 4 | 2栋 | 有 |
| 6年级 | 5 | 3栋 | 有 |
| | | | |
| 日出小学内容表--年级属性表 ||||
小学内容包含了多个年级,这个表同时等于年级 类型的属性表.与之对应的年级类型如下:
//年级定义
struct Gradel{
char building; //所在建筑
char number; //班个数
bool if_interest; //是否有兴趣班
string leader_name; //年级主任名称
vector<Ban> vb; //包含若干班
}
其中年级主任名称用一个表来表示.年级包含了若干班---年级内容表同时是班的属性表,两个表略
当A对象包含了多个B对象时,A类型的内容表等于B类型的属性表.
这里又回到上一帖中的数据自顶向下设计时的问题,因为数据对象"1年级","2年级"可能属于不同的数据类型.但可以在自底向上的设计中得到修正,无需担心.
用表来表达数据类型的特点
本贴说的是数据类型在硬件中的表达,但其实是数据库中如何表达数据类型.这里间接看出数据库使用的好处---数据库封装了数据和存储(例如文件)以及操作系统间的交互部分.
但同时也看到用表来表达数据类型的缺点是不如高级语言中的类型灵活.例如现在要添加一个vector<string> fruits对象,表达每个学校里种植了若干种水果.在软件层面添加一个对象即可.在数据库里添加一个表也行.但如果删改多了,在物理层面对数据的取用可能会有影响---数据的存取效率会降低.
这个问题应该在软件设计架构的时候考虑到,如果前期的数据类型不合理,后面陆陆续续的改,造成许多"碎片化"的数据---增加数据量不大的"小型"表格.当然也有解决方法:可以把服务停了更新,根据数据库操作把多个表合成一个表以提高效率.但这可能带来一些损失,尽量避免.
小结
站在表的层面看数据类型设计,加深一点对数据的理解,实际上可能用不到,是一种抽象的底层表达