Web开发中常用的数据关系

数据关系

Web开发中,需要使用数据库存储数据。这些数据大多数都是相互关联的,存储和使用这样的数据,我常用关系型数据库Mysql来实现。这里,我设计一个用户数据模型,用来举例说明这些数据之间的关系。

独立的数据

我规划了一张表user,用来存储用户基础信息,字段包含主键id和用户名username,看起来这张表是这样的:

id username
1 张三
2 李四
3 王五

当我们查询user表时,就会得到包含这两个字段的数据行。这样的数据,与其他表没有任何关联,和表本身也没有关联,可以被称为独立的数据,这样的数据,非常适合存储到非关系数据库中。不过,我们的用户表还会修改设计,因为,用户表会关联其他表。

一对一关系

我们的用户表中,字段太少了,不能描述用户的丰富属性。这时候,我们有两种选择:
  1. 给用户表增加字段
  2. 使用一张新的表格(用户信息表user_info)来存储用户扩展信息
直接给用户表增加字段,适合用户字段本身不多,并且增加的字段不会影响其他字段的情况;否则,我们可以新建一张表来存储这些用户信息。用户信息表设计如下:

id sex email
1 zs@test.com
2 ls@test.com
3 ww@test.com

那么,两张表如何关联呢?
根据设计要求,一条用户表的数据,对应一条用户信息表的数据,这样的对应关系,称为一对一关系。既然如此,我们可以给用户表增加一个字段,存储对应用户信息表的主键。这样一来,我们想要知道用户的扩展信息,需要两步操作:1、查找用户表,找到用户的关联用户信息表的主键。2、根据用户信息表的主键,查找到用户的扩展信息。
根据用户信息表的一条数据的主键,到用户表中,也可以查询到用户表中的具体数据。
更改后的用户表如下:

id username info_id
1 张三 1
2 李四 2
3 王五 3

当然,我们也可以将关联主键的字段放到用户信息表中,这样的话,可以保持用户表字段较少,那么我们就不要修改用户表,用户信息表修改如下:

id sex email user_id
1 zs@test.com 1
2 ls@test.com 2
3 ww@test.com 3

甚至,我们可以用户表存储用户信息表的对应主键,并且用户表存储用户信息表的主键,这样做会增加一些存储成本,不过可以提高可读性。

多对一关系

多对一关系,也叫作一对多关系。网站一般会对用户进行分组,我们也需要设计用户分组表,如下:

id groupname
1 管理员
2 会员

一个用户分组中包含了若干个用户,如何存储这样的关系呢?我们可以考虑,在用户组表中增加一个字段,来存储其包含的用户的主键,如下:

id groupname user_id_list
1 管理员 1,2
2 会员 3

我们知道,关系数据库的字段只能存储简单的数据类型,例如数字,字符串,时间等,不支持存储一个列表。所以这里,我们需要将列表数据转换成一个字符串来存储,取出来用的时候,我们需要再将其转换成列表。每次用户组的用户变动时,需要对字段user_id_list改动时,则变得麻烦。这时候,推荐另一种多对一的关联方式:在用户表中添加字段group_id,如下:

id username info_id group_id
1 张三 1 1
2 李四 2 1
3 王五 3 2

更改用户组的用户成员时候,只需要修改对用用户的group_id即可,查询时根据group_id查询即可。

多对多关系

不同的用户组权限不同,我们需要设计一张权限表,如下:

id permissions
1 禁用用户
2 修改自己的信息

管理员不仅可以修改自己的信息,还可以禁用其他用户,而会员只能修改自己的信息。这时候我们可以发现,管理员对应的权限有两个:禁用用户和修改自己的信息。而修改自己的信息这项权限,同时被两个用户组拥有:管理员和会员。想这样的关系,是典型的多对多关系。

如何根据这样的关系,设计表呢?
根据之前的经验,我们会想到,给用户组表或者权限表增加字段,用来存储其对应的关系表的主键。使用这样的办法,我们就会陷入到多对一关系中的不良案例中——利用一个字段存储多个关系主键。

这时候,我们需要跳出原有思维,新建一张用户组-权限关系表(group_permissions),来存储他们的多对多关系,如下:

id group_id permissions_id
1 1 1
2 1 2
3 2 2

使用查询语句select permissions_id from group_permissions where group_id=1来查询管理员拥有的权限id列表;使用查询语句select group_id from group_permissions where permissions_id=2来查询拥有需改自己的信息的用户组id列表。

自关联一对一关系

网站设计了推荐机制,如果一个用户通过另一个用户推荐注册,那么保存这个用户的推荐人。分析得知,一个用户的推荐人只能是另一个已存在的用户,这是一对一关系,区别是,这个一对一关系,关联的是用户表本身。

解决方案仍然是老办法,给用户表增加一个字段recommended_id,用来关联其对应的推荐人。用户表如下:

id username info_id group_id recommended_id
1 张三 1 1 null
2 李四 2 1 1
3 王五 3 2 2

自关联多对一关系

网站设计黑名单机制,用户可以拉黑不喜欢的其他用户。分析得知,一个用户可以拉黑多个其他用户,那么这是一个自关联的多对一关系。

就像之前的多对一关系那样,我们尝试使用增加字段的方式来解决这个问题。设计如下:

id username info_id group_id recommended_id blacklist_id_list
1 张三 1 1 null 2, 3
2 李四 2 1 1 1
3 王五 3 2 2 1, 2

可以看出来,又陷入到了单一字段存储多个关系主键的问题了。解决办法也一样,单独创建一张黑名单关系表(blacklist)来存储黑名单关系,如下:

id user_id blacklist_user_id
1 1 2
2 1 3
3 2 1
4 3 1
5 3 2

自关联多对多关系

网站需要增加粉丝和关注机制,用户可以关注其他用户,用户可以得知自己有哪些粉丝。分析得知,这是典型的自关联多对多关系。

尝试使用一张单独的粉丝关系表(fans)来存储分析关系,如下:

id user_id fans_id
1 1 2
2 1 3
3 2 1
4 3 1
5 3 2

经简单的验证,可以得知,这样的设计可以完全满足粉丝机制的需求。

总结

通过网站用户和权限的简单设计案例,我们梳理了独立数据、一对一关系、多对一关系、多对多关系、自关联一对一关系、自关联多对一关系和自关联多对多关系的需求分析和设计实现,可以自如地处理这些复杂的关联关系。

最终的字段和数据如下:
user

id username info_id group_id recommended_id
1 张三 1 1 null
2 李四 2 1 1
3 王五 3 2 2

user_info

id sex email
1 zs@test.com
2 ls@test.com
3 ww@test.com

group

id groupname
1 管理员
2 会员

permissions

id permissions
1 禁用用户
2 修改自己的信息

group_permissions

id group_id permissions_id
1 1 1
2 1 2
3 2 2

blacklist

id user_id blacklist_user_id
1 1 2
2 1 3
3 2 1
4 3 1
5 3 2

fans

id user_id fans_id
1 1 2
2 1 3
3 2 1
4 3 1
5 3 2

无戒365训练营 第九篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容