深入理解数据库关系
我上面说过,我想为每个用户维护一个“粉丝”用户列表和“关注”用户列表。 不幸的是,关系型数据库没有列表类型的字段来保存它们,那么只能通过表的现有字段和他们之间的关系来实现。
数据库已有一个代表用户的表,所以剩下的就是如何正确地组织他们之间的关注与被关注的关系。 这正是回顾基本数据库关系类型的好时机:
一对多
我已经在 第四章 中用过了一对多关系。这是该关系的示意图(译者注:实际表名分别为 user 和 post):
用户和用户动态通过这个关系来关联。其中,一个用户拥有 多 条用户动态,而一条用户动态属于 一 个用户(作者)。数据库在 多 的这方使用了一个 外键 以表示一对多关系。在上面的一对多关系中,外键是 post
表的 user_id
字段,这个字段将用户的每条动态都与其作者关联了起来。
很明显, user_id
字段提供了直接访问给定用户动态的作者,但是反向呢? 透过这层关系,我如何通过给定的用户来获得其用户动态的列表? post
表中的 user_id
字段也足以回答这个问题,数据库具有索引,可以进行高效的查询“返回所有 user_id 字段等于 X 的用户动态”。
多对多
多对多关系会更加复杂,举个例子,数据库中有 students
表和 teachers
表,一名学生学习 多 位老师的课程,一位老师教授 多 名学生。这就像两个重叠的一对多关系。
对于这种类型的关系,我想要能够查询数据库来获取教授给定学生的教师的列表,以及某个教师课程中的学生的列表。 想要在关系型数据库中梳理这样的关系并非轻易而举,因为无法通过向现有表添加外键来完成此操作。
展现多对多关系需要使用额外的 关联表 。以下是数据库如何查找学生和教师的示例:
虽然起初看起来并不明显,但具有两个外键的关联表的确能够有效地回答所有多对多关系的查询。
多对一和一对一
多对一关系类似于一对多关系。 不同的是,这种关系是从“多”的角度来看的。
一对一的关系是一对多的特例。 实现是相似的,但是一个约束被添加到数据库,以防止“多”一方有多个链接。 虽然有这种类型的关系是有用的,但并不像其他类型那么普遍。
译者注:如果读者有兴趣,也可以看看我写的一篇类似的数据库关系文章—— Web 开发中常用的数据关系
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论