這裡講解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` (following 乙個朋友, neo following jam`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;
insert into `people` (`id`, `name`) values之前neo已經 following jam,接下來查詢jam的朋友,現在neo following john, john 是 jam 的朋友,friend_id = null 表示 jam 尚未有朋友(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');
select * from network where people_id=1 and friend_id = 5;neo following joey, joey 是 luke 的朋友, 所以 luke可能是 neo的朋友insert into `sns`.`network` (`people_id`, `following_id`, `friend_id`, `degrees`) values ('1', '6', '5', '1.5.6');
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.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...