今天改代码的时候感觉原作者设计的表不合理,所以开始想起一些数据库设计的原理来。
一对多的表示
数据表,是一对一的数据结构,如何表示一对多呢?
班级对学生,是一对多,即一个班级有多个学生。
但是一个学生只属于一个班级,从学生角度看是一对一的,所以可以在学生表里加入班级字段或者班级ID字段。
小纠结
如果加入班级字段,班级就像是学生的一种属性。
如果加入班级ID字段,班级就像是一个独立的对象。
当然,实际概念虽然让人纠结;但是好的地方在于,要让表合理好用,只要搞清楚是一对一,还是一对多,还是多对多就好了。
纠结的是,就算我概念很清晰,我能像说话一样用这些概念来写程序吗?
很多时候,把这些概念装到不同的数据容器里,就够乱了。
多对多表示
学生和课程,是多对多,即一个学生可以选多门课,一门课也可以被多个学生选。
这时候,加入关系表,是最佳选择。
也就是:学生表存学生的唯一记录;课程表存课程的唯一记录;选课表存课程和学生的对应关系。
违规操作
有的时候,违规操作看起来也是挺合理的。
比如,在课程表中,加一个字段保存所有选了这门课的学生的ID。
这样就相当于表中套表了吧??
怎么存一棵树
一棵树,每个节点有个名字,要把这棵树存到表里。
节点表(id,节点名,父节点名)。
这样就行了。
怎么还原它
如果像XML一样
如果像XML一样,每个节点有很多属性。
那么我可以加一张表,专门存节点的属性。
关系型数据库,采用二维表来存储数据。
二位表中的行,是关系中的元组。
我们并不能拿纯粹的数据编程,总的有个容器,总得有个名字去代指。
就算同一个数据结构,就算都是表,编程的时候可能是不同的类型。
所以很麻烦。