关系型数据库的设计

范式

关系

注意:根据阿里开发规范,不再设置数据库的外键,在应用层保证外键逻辑即可

数据库设计

1:1

1:n

设想学生-班级案例,若在班级中保存所有学生的主键,则表长不好预测,表的数据亢余。

所以是在多的一方保存一次1的一方的主键

m:n

在中间多添加一个“关系”实体。

在关系中存储双方的主键,并将组合的主键作为自己的主键(这样两条记录中保存的双方id不会同时相同)

转化成了两个一对多关系,其中关系是多个一方,保存双方的主键

orm

一对多

在1的一方定义一个列表,保存多个’n’的对象

在n的一方保存一个1的对象

“要能找到信息啊,要不然还得再去数据库查,麻烦”

查询的时候通常是需要所有信息的,单单在n的一方知道1的主键没啥用,,另外,即使用了复杂查询,也要有个能在内存中表示出1:n关系的对象来保存。分别取出1和n的n+1个对象,再在内存中读取键值判断关系不方便。

<mapper namespace="studentNamespace">
 <resultMap type="zhongfucheng2.Student" id="studentMap">
 <id property="id" column="sid"/>
 <result property="name" column="sname"/>
 resultMap>
 
 
 <select id="findByGrade" parameterType="string" resultMap="studentMap">
 select s.sname,s.sid from zhongfucheng.students s,zhongfucheng.grades g
WHERE s.sgid=g.gid and g.gname=#{name};
 select>
mapper>

就是说光select学生表,把记录包装给grade的list里就行了。这个例子没有要查的学科表的信息