数据库关系以及各种关系下如何设计数据库

1.一对一

        比如一张表存储用户的用户名密码用以用户登录验证,一张表存储用户详细信息如:真实姓名,家庭住址等用以用户执行敏感操作时做验证。

                                                        user表

idusernamepassword
1zhangsan123
2lisi123

                                                        user_info 表

idrealnameaddress
1张三陕西
2李四山西

 对于各种操作比如修改用户的真实姓名,如果在一张表可以:

update user_info set realname=*** where username=***

但还要写成:

update user_info set real_name=*** where id=(select id from user where username=***)

这两张表都是对同一个用户,一个用户提交给平台的信息一定是一一对应着,但是明明都是同一个用户的还这样设计表,尽管这样使每一个表的字段数量减少但也会因为增加表的数量使表的关系变得很乱,当设计一个简单表关系时这样也许不会怎样,但是表的数量一增加,表与表之间的关系就变得更加重要。所以设计表的时候尽可能让两个一对一的表合成一个表。

2.一对多(多对一)

        这种设计用于一般对于像不复杂的关系,比如员工与老板之间的关系(一个员工受一个固定的老板管理,但一个老板管理多个员工)

                                                employee表

idnameemployer_id
1zhangsan1
2lisi1
3wangwu1
4tiegen2

                                                 employer表

idname
1蔡徐坤
2鸡哥

如果根据员工查询老板:

select name 
from employer
join on employee
where employee.employer_id = employer.id

最后的结果就是一条信息

但是根据老板查询员工:

select name 
from employee
join on employer
where employee.employer_id=employer.id

最后查询的结果就是多条数据

这里有注意点:

添加数据时先给主表添加数据(如老板表)添加数据,再给子表(如员工表),因为不可能没有老板就让员工上班。如果有可以给我介绍一下(dogo)

删除数据先删除子表数据,再删除主表数据,也不可能让老板直接离职,然后再给员工分配新的岗位.

3.多对多

这种数据库关系在像用户与角色之类的关系是基本一定会有的。

                                  user 表

idusername
1坤坤
2kun
3菜虚困
4鸡哥

                                role表

idrolename
1ikun
2小黑子

他们之间的关系可能如下图一样

 他们之间会有复杂的关系,要表示他们之间的关系不能只使用两张表,因为如果user表中一个字段专门表示身份的话(或者role表的id)由于一个user可能有两个身份而sql又不能使用一个字段存取两个值;同理由于有很多user是某一个身份,也不能在role表使用一个字段映射到user。

        这时就需要有一个中间表user_role

user_idrole_id
11
12
21
31
32
41

来存储他们之间的关系

因为user表中没有任何与role表有关的字role表中没有任何与user表有关的字段,到时候使用查询语句就需要三个表关联。

比如查询kun的身份:

select rolename
from role r join user_role ur
on r.id=ur.role_id
join user u
on ur.user_id=(selec id 
                from user
                where username=kun)

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值