表与表的关系
表与表的关系有三种:一对一,一对多(多对一),多对多。在确定表与表的关系的时候需要确定主表和从表,依赖性更强的是从表,必须存在的是主表,这样就可以知道外键该设置在那个表中了。
一对多:一个部门可以有多个员工,一个员工只能属于一个部门; 一个客户对应多个联系人,一个联系人只能属于某一个客户。
一对多建表原则:在多的一方创建外键对应一的一方的主键。
多对多:一个学生可以选择多门课程,一门课程可以被多个学生选择;一个订单可以包含多个商品,一个商品可以在多个订单中;一个用户可以选择多个角色,一个角色可以被多个用户选择。
多对多建表原则:创建中间表,中间表中至少有两个字段分别作为外键指向多对多双方的主键。(主键对应)
一对一:一般都建一张表。
一对一建表原则:唯一外键对应/主键对应。(不常用,且可合并)
一对一
Ø 一对一是将数据表“垂直切分”,其实是不常见,或不常用的。也就是 A 表的一条记录对应 B 表的一条记录,为什么要这样的设计呢,不是增加了程度的复杂性吗,然而并不一定,举例说明:
1) 一个系统必然有 Employee(员工表)(包含字段:EmployeeId、姓名、性别、年龄、电话、地址等),每个员工都为一个用户,所以还有张 User 表(包含字段:UserId(关联 EmployeeId)、用户名、密码、角色等),这样你会发现,整合为一张表是否不太妥当?因为,User 的记录只会在登录时用到,感觉有点违背三大范式中的“确保每列都和主键列直接关联,而不是间接关联”。
2) 还有种情况,这就要根据具体的业务来决定了。如果,当一张表的字段过于太多,而很多字段可能只有在某些情况下,才会使用到,这时也可以考虑使用一对一设计。
Ø 优点
1. 便于管理、可提高一定的查询速度
2. 减轻 CPU 的 IO 读写,提高存取效率。
3. 符合数据库设计的三大范式。
4. 符合关系性数据库的特性。
Ø 缺点
1. 增加一定的复杂程度,程序中的读写难度加大。