数据库建立表的问题(一个表专门存放字段名称,另外一个专门存放数据)

BabyMason 发布于 2016/12/07 20:31
阅读 500
收藏 0

背景为:比如有教师档案、学生档案、职工档案三个档案类型。三个档案类型中对应的字段名称有一样的也有不一样的,比如教师有年龄和性别,学生也有年龄和性别,但是教师有职称、学历、婚姻状况等,学生没有这些;学生有监护人、班主任这些字段教师没有。原来的设计为教师对应表教师表,学生对应学生表。但是突然新增加了一个档案类型 比如为职工档案,我就要修改程序的源码,在数据库新增加一个表进行。这个为前提。同事提出一个设计思路为我建立表A如下:

建立表B如下:

表A主要存字段名称。表B存放数据,查询的时候进行处理,比如我要查询教师档案,我需要先从表A中查询教师档案对应的哪些字段,比如这里为教师职位:m1 教师学历m2 教师年龄m3 然后拼接sql,select m1,m2,m3 from B ;然后在前台显示;这样设计,如果我需要新增加一个档案类型或者教师档案需要新增加一个字段(比如教师 必须有“”婚姻状况“”),我只需要想表A中增加  “教师档案  婚姻状况  m4 ” 就可以了,现在遇到的问题是一 :我个人觉得这种设计思路不是很正确,可能是因为我没有见过或者我没想通。小白一直坚信存在的就是合理的,因为我没见过所以不敢同意。二是如果按照这种设计思路 我前段改如何显示,html中可以显示标题,但是具体下面的数据应该怎么显示。。。。。表A,和表B的字段都有预留的,所以字段数量这些不考虑,现在是前端获取是java后台实体类对应的肯定是所有的字段,所以前端不知道该如何显示,希望大家能帮忙解决下,感激不尽。

加载中
0
muyu
muyu
需求比较坑,关系数据库不好表达
0
JeffreyLin
JeffreyLin
标题都可以显示了,用A的属性名为key获取B中的值,不是很简单吗?
BabyMason
BabyMason
回复 @JeffreyLin :是动态显示表的字段 不是之前那种直接定死的 所以每步都需要自己处理 就有效率的问题了
JeffreyLin
JeffreyLin
回复 @BabyMason : B表是不是少设计了id字段?想不出你所担心的性能问题是什么?
BabyMason
BabyMason
回复 @JeffreyLin : 但是这样遇到一个问题 B表数据档案类型的 数据量非常大 这样做的的效率会不会差很多 因为每次我后台都要处理下
JeffreyLin
JeffreyLin
回复 @BabyMason : 可以用反射,b的实体类增加实现 map 接口,在页面就可以直接用这种方式取值了:${b[key]}
BabyMason
BabyMason
B中的数据是几十万的数据,key value这种肯定行不通的。刚才突然想到在jsp页面用反射,动态获取b表里面的值应该可以,但是这样速度会不会非常慢。。。
0
方棱
方棱
可以考虑专门处理非结构化数据的数据库。
0
sduixiang
sduixiang

如果是我的话,我会在后台先判断一下是学生还是老师,再去查询;查询的后台pojo对象所有字段,前台想显示什么内容用$取就行了啊


sduixiang
sduixiang
@BabyMason 不好意思回复错了
sduixiang
sduixiang
@BabyMason 回复@BabyMason : <c:forEach items="${ctrlDetailForm.photoList }" var="items" varStatus="status"> <c:forEach items="${items.photoList }" var="item" varStatus="status"> ...
sduixiang
sduixiang
@BabyMason 回复@BabyMason : <c:forEach items="${ctrlDetailForm.photoList }" var="items" varStatus="status"> <c:forEach items="${items.photoList }" var="item" varStatus="status"> ...
BabyMason
BabyMason
回复 @绺木恋晓 :不是A的档案类型,是获取A里面的字段数目,然后判断实体类B中前面哪几个字段是需要显示的,哪些是不需要显示。
看那条狗
看那条狗
回复 @BabyMason : 页面加载时,获取表A的几种档案类型,在前端拼接成几种表格,根据类型切换表格,这样可以吗?
下一页
0
19viw2
19viw2
横表用纵表表达有一定好处,注意表B需要主键,比如 id+类型 做联合主键。
返回顶部
顶部