SNS 数据库设计
时间:2022-05-03
本文章向大家介绍SNS 数据库设计,主要内容包括4.21. SNS 数据库设计、4.21.2. firend 表、4.21.3. 演示、4.21.4. network 表、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
本文节选自《Netkiller Architect 手札》
4.21. SNS 数据库设计
这里讲解SNS交友社区的数据库设计与实现
我们要实现下面几个功能
- 朋友之间的关系,多对多关系
- 朋友之间的维度,如3度4度....
- 朋友的查找
CREATE DATABASE `sns` /*!40100 COLLATE 'utf8_general_ci' */
4.21.1. people 表
people 是存储人,你可以用为user,member都可以
CREATE TABLE `people` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
)
COMMENT='Social Network Site - Six Degrees of Separation - http://www.netkiller.cn'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
存储具体的这人
4.21.2. firend 表
这个表的功能主要是维持朋友之间的关系网,这里使用了多对多方式并且使用外键防止产生脏数据。
CREATE TABLE `friend` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`people_id` INT(10) UNSIGNED NOT NULL,
`friend_id` INT(10) UNSIGNED NOT NULL,
`ctime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE INDEX `unique` (`people_id`, `friend_id`),
INDEX `FK_firend_people` (`people_id`),
INDEX `FK_firend_people_2` (`friend_id`),
CONSTRAINT `FK_firend_people` FOREIGN KEY (`people_id`) REFERENCES `people` (`id`),
CONSTRAINT `FK_firend_people_2` FOREIGN KEY (`friend_id`) REFERENCES `people` (`id`)
)
COMMENT='Social Network Site - Six Degrees of Separation - http://www.netkiller.cn'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
4.21.3. 演示
首先初始化用户数据
INSERT INTO `people` (`id`, `name`) VALUES
(1, 'Neo'),
(2, 'Luke'),
(3, 'Jack'),
(4, 'Joey'),
(5, 'Jam'),
(6, 'John');
建立朋友之间的关系
INSERT INTO `friend` (`id`, `people_id`, `friend_id`) VALUES
(1, 1, 2),
(2, 1, 3),
(3, 1, 4),
(4, 1, 5),
(5, 1, 6),
(6, 2, 1),
(7, 2, 3);
现在就可以查找你的朋友了
select people.* from friend, people where friend.people_id = 1 and friend.friend_id = people.id;
查找朋友的朋友就比较麻烦了,必须使用递归方法,一层一层查下去,反复执行SQL效率是很低的,所以我们准备了第三张表。
4.21.4. network 表
关系网表,主要功能是弥补firend表,用于快速检索(在不使用递归的情况下)
CREATE TABLE `network` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`people_id` INT(10) UNSIGNED NOT NULL,
`following_id` INT(10) UNSIGNED NOT NULL,
`friend_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`degrees` VARCHAR(250) NOT NULL,
`ctime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE INDEX `unique` (`people_id`, `friend_id`, `following_id`),
INDEX `FK_firend_people` (`people_id`),
INDEX `FK_firend_people_2` (`friend_id`),
INDEX `FK_friend_people_following_id` (`following_id`),
CONSTRAINT `FK_firend_people` FOREIGN KEY (`people_id`) REFERENCES `people` (`id`),
CONSTRAINT `FK_friend_people_following_id` FOREIGN KEY (`following_id`) REFERENCES `people` (`id`),
CONSTRAINT `FK_friend_people_friend_id` FOREIGN KEY (`friend_id`) REFERENCES `people` (`id`)
)
COMMENT='Social Network Site - Six Degrees of Separation - http://www.netkiller.cn'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
following 一个朋友, Neo following Jam
INSERT INTO `people` (`id`, `name`) VALUES
(1, 'Neo'),
(2, 'Luke'),
(3, 'Jack'),
(4, 'Joey'),
(5, 'Jam'),
(6, 'John');
INSERT INTO `network` (`people_id`, `following_id`, `friend_id`, `degrees`) VALUES ( 1, 5, NULL, '1.5');
之前Neo已经 following Jam,接下来查找Jam的朋友,现在Neo following John, John 是 Jam 的朋友,friend_id = NULL 表示 Jam 尚未有朋友
select * from network where people_id=1 and friend_id = 5;
INSERT INTO `sns`.`network` (`people_id`, `following_id`, `friend_id`, `degrees`) VALUES ('1', '6', '5', '1.5.6');
Neo following Joey, Joey 是 Luke 的朋友, 所以 Luke可能是 Neo的朋友
INSERT INTO `sns`.`network` (`people_id`, `following_id`, `friend_id`, `degrees`) VALUES ('1', '4', '2', '1.2.4');
查询不同维度下的所有好友,查询出的用户ID需要处理。
select * from network where people_id=1 and degrees like "1.%";
select * from network where people_id=1 and degrees like "1.2%";
select * from network where people_id=1 and degrees like "1.2.%";
至此社区管理网就建立起来了
上面的例子演示了 people_id=1 即 Neo 的关系网
- Swift 3.0介绍
- IntelliJ IDEA 安装目录的核心文件讲解
- 详述 IntelliJ IDEA 的使用界面
- WCF系列教程之消息交换模式之请求与答复模式(Request/Reply)
- Koa-router源码解读
- WCF系列教程之初识WCF
- IntelliJ IDEA 缓存和索引的介绍及清理方法
- Node.js原理
- WCF系列教程之WCF消息交换模式之单项模式
- React Native调用Android相机图库
- IntelliJ IDEA 之 HelloWorld 项目创建及相关配置文件介绍
- 设置 IntelliJ IDEA 主题和字体的方法
- 修改 IntelliJ IDEA 模板注释中的 user 内容
- Android仿京东、天猫商品详情页
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法