请教一个mysql建表-N个自定义字段的问题

你好 大师 ,我又有一个问题想请教你了,我想做个系统,记录学生的信息【身高 体重 性别 家庭地址 等等】,因为不同的学生,他的字段可能不一样,比如学生A,我可能只需要记录他的 身高体重 就可以了, 而学生b,我就需要记录很多东西,另外还可以会有一些自定义字段,比如X学生,我要额外记录他的Y属性,Z属性,那么如果这样的话,我用一张表来存所有会员的信息不太可能了,因为每个会员的字段有相同和不同【虽然可以设置某些字段为可空属性,太这个也太鸡肋了】,并且会有自定义字段产生,每个学生的学号是独立无二的,我初步的想法是,用学生的学号来建立一个表,然后里面放这个学生的信息,这样出现自定义字段了,直接添加上去即可,但是如果有10w的学生,那么就要10w的表,这个太浪费了 太可怕了, 不知道大师有什么方法

1 个回答

谢谢邀请(注:本人非大师、非专家,只是两三年的码农)

从当前这个问题和你上个问题可以看出你设计数据库表结构的一个共同思路:把单个对象做成一张表;上个问题中有N个学校,你做了N张学校年级表;N*M个年级,你做了N*M个年级活动表和N*M个年级考勤表。其实都只要一张表就够,只是加一个或几个字段作为来区别分类或所属集合。

我脚的数据库设计跟面向对象编程一样:一张表就是一个类,表示一个相同事物的集合;表里的每一条记录都是一个对象,表示一个具体的对象,一个学生、一个年级或者一个年级的活动信息。

对于这个问题,如果换做我的话,我会按照你的第一个方案设计成一张表,不管是学生共有还是特有的属性都作为表的字段,没有的属性就设置为空。毕竟他们都是同一类的东西,没有理由把他们拆分存到不同表中,更别说一人一表了。

之前给东南大学、厦门大学、西安交通大学做选课系统的时候,他们的学生学籍表有60多个字段(包括10来个外键,如果算上外键对应的表中的字段,那总共有100多个字段),当然不可能每个学生的所有字段都是有值的。所以你不用担心有的字段有值,有的字段为空。
Untitled2

补充:

如果所有学生的特殊属性的加起来数量过百过千了,甚至能达到每人都有一个或者多个特殊属性了,那就可以再建一张“特殊属性”表了,相当于一个键值对(属性名称-->属性值)。学生表和特殊属性表是一对多的关系。
BE266F978DA64843A79E3128FD663CC5

你的回答