4 21 SNS 資料庫設計

2021-09-22 19:01:52 字數 4089 閱讀 7122

這裡講解sns交友社群的資料庫設計與實現

我們要實現下面幾個功能

朋友之間的關係,多對多關係

朋友之間的維度,如3度4度....

朋友的查詢

create database `sns` /*!40100 collate 'utf8_general_ci' */

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 - '

collate='utf8_general_ci'

engine=innodb;

儲存具體的這人

這個表的功能主要是維持朋友之間的關係網,這裡使用了多對多方式並且使用外來鍵防止產生髒資料。

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 - '

collate='utf8_general_ci'

engine=innodb;

首先初始化使用者資料

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效率是很低的,所以我們準備了第三張表。

關係網表,主要功能是彌補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 - '

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 的關係網

乙個SNS資料庫表設計的問題

遇到乙個資料庫設計的問題,比如有乙個sns的系統,資料庫中如何表示使用者關係,例如使用者和使用者之間的 關注 和 被關注 現在有兩種方案 1.設計乙個使用者關係表,欄位都是使用者id 2.使用者表加2個字段表示他關注的使用者id,例如 1,3,4,8,10 和他被關注的使用者id,例如 13,33,...

資料庫設計 設計資料庫之前

1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...

資料庫設計 設計資料庫之前

1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...