晒一种数据库设计

来源:互联网 发布:环球易购 知乎 编辑:程序博客网 时间:2024/04/30 17:42

最近接触了一个有关人员管理的数据库设计,对其设计风格十分不解。

 

首先,是一个基础数据表,table name: table01

表的设计

设置联合主键:ctype和ccode

columntype ctypestringnot nullccode stirngnot nullcnamestringnot null

 

数据示例

ctypeccodecname ctypeccodecname0001性别 0002学历0003科目 0004成绩等级0005技术级别 0006关系0111男 0112女0211专科 0212本科0213硕士 0214博士0311A编程语言JAVA 0311B编程语言Ruby0312面向对象 0313数据库泛型0411可 0412差0413良 0414优0511工程师 0512高级工程师0611父母 0612子女0613配偶 0614兄弟姐妹

 

在这张表中,ctype为'00'的是类别,这些类别的ccode在其余的记录中,被用为ctype,以便给各个记录分组。例如“优、良、可、差”属于“成绩等级”组。

这个结构有点类似于“parent-child”的family表,即ctype类似于parentID,ccode类似于ID,但是由于ctype不可空,也不可能在parentID设置外键。这样,无法在数据库的层面上保证所有记录都有一个分组。

另外,由于存在“11A”“11B”这样的ccode,将ctype和ccode类型设置为string。这样一来,not null的限制作用就被削减了,因为string 类型可以有string.empty的情况,它不是null,但也不是合法值。

 

之后,其他表都会引用这个基础数据表,table name: table02

表的设计

columntype idstringnot nullnamestirngnot nullgenderstringnot nulleducationlevelstringnot nullskilllevelstringnot null

 

数据示例

idnamegendereducation_levelskill_level00001111某A11111100001112某B12 11

 

在这张表中,gender、educationlevel、skilllevel本应是引用到table01的外键,但是ccode并不是唯一键,不能被引用。必须是ctype和ccode的联合唯一键才有意义。也就是说,需要gender引用table01的联合主键,这样的结构数据库并不支持。

本例采用的方式是不设置任何外键约束,在gender中直接填写与“男”或“女”ccode相符的字串(当然并不能排除string.empty或"11"、"11"以外的值),而此处的“11”到底是代表“男”还是“初级工程师”还是“父亲”,完全hard code在程序里。就是类似于if(column.name is gender) then {find in table01 where ctype is '01' and ccode = column.value}

只能赌定table01中的数据永远不变化。

 

还有诸如家属表,会用引用到ctype是00的数据;成绩表会用到ctype是03和04的数据;等等。

它们都和table02有相同的问题。

 

问题是,table01中的ctype不同的数据,是会被不同的表引用的,将其全部归结到一张表里,用意究竟在哪里呢?

原创粉丝点击