上图是一幅很普通的外键关系示例,途中stu代表一个学生,category代表为学生建立的一个分类如:大学生、小学生、初中生。如果stu中的category_id不允许为空,那么在出入stu记录前必须保证此category_id 的存在,这个我想谁都没有问题。那么插入stu前该做哪些事情呢,必须知道当前的stu属于那个类别,如果category_id可以为恐则不需要这么做,换句话说插入stu记录中凡是有category_id的记录必须先做检查,如果此category不存在要先插入。
这个时候另一个问题出来了,有的人说插入了category但是不知道它的id,因为id是由数据库自动维护的。其实这个根本不是问题,它是另一个问题的表象。因为id是用来标识一张表的,而实际上category的名字也是用来唯一标识,准确的说id是次要的。我们把上边这张表完全可以简化为一张表,也就是带category_title的stu表,如果只是一个字段那么冗余度没那么高,当字段多了,冗余度就非常高了,为了降低冗余度但又不破坏数据的关系,所以才有了上面两张表的格局,这个时候我们唯一冗余的就是一个32位的整型字段,忽略不计。当然有人提出了更好的、代替32位整型的数据类型作为id,在此我们不做累述。那么回到刚才的问题,插入了category后是不知道当前插入了记录的id(如果你说按时间查询,首先这很蠢,而且没道理,我相信大部分人不会这么干,比如有很多并发请求的时候可能查询出的是别人的记录。),但是有stu的记录,根据stu查出它的类型,然后存储,说的详细点,也就是说出这个问题的人是在设计上出现了问题。