mysql朋友表設計 設計朋友關係表的兩個方案

2021-10-17 18:28:32 字數 1941 閱讀 1923

需求:使用者a新增使用者b為好友後,a和b即互為好友。

這裡只考慮使用資料庫實現的方案,以mysql為例。

存在使用者表 users,有欄位 user_id,如何設計朋友關係表?

create table `users` (

`id` int(11) unsigned not null auto_increment,

`user_id` int(11) default null,

`name` varchar(255) default null,

primary key (`id`),

unique key `user_id` (`user_id`)

) engine=innodb auto_increment=3 default charset=utf8;

方案1create table `user_relation` (

`id` int(11) unsigned not null auto_increment,

`user_id` int(11) default null,

`friend_id` int(11) default null,

primary key (`id`),

unique key `user_id` (`user_id`,`friend_id`)

) engine=innodb auto_increment=2 default charset=utf8;

每次使用者a新增使用者b為好友後,即在資料庫中新增兩條記錄,通過唯一性約束來保證朋友關係不重複。

user_id: 10001, friend_id: 10002

user_id: 10002, friend_id: 10001獲取使用者a的朋友時 sql

select friend_id from user_relation where user_id = 10001;

優點:訪問邏輯比較簡單

缺點:user_relation 表中存在冗餘的資料

方案2create table `user_relation` (

`id` int(11) unsigned not null auto_increment,

`user_id` int(11) default null,

`friend_id` int(11) default null,

`sorted_key` varchar(255) default null,

primary key (`id`),

unique key `user_id` (`user_id`,`friend_id`),

key `sorted_uniq_key` (`sorted_key`)

) engine=innodb auto_increment=3 default charset=utf8;

每次使用者a新增使用者b為好友後,即在資料庫中新增一條記錄:

user_id: 10001, friend_id: 10002, sorted_key: 10001-10002

其中 sorted_key 是 (user_id, friend_id) 公升序排列後的拼接,通過這個值來做資料庫唯一性校驗。

獲取使用者a的朋友時 sql

select friend_id from user_relation where user_id = 10001;

select user_id from user_relation where friend_id = 10001;

或select friend_id as user_id from user_relation where user_id = 10001

union

select user_id from user_relation where friend_id = 10001;

優點:user_relation 表中沒有冗餘的資料

缺點:獲取邏輯比較複雜。唯一性校驗也要多佔乙個欄位的空間。

mysql設計表月份 mysql,表設計

閒著沒事搞了一下,歡迎指教。使用者表 create table usr uid int 11 not null,name char 10 default null,primary key uid engine innodb default charset utf8 吃飯記錄表 create tabl...

mysql表的設計 mysql,表設計

閒著沒事搞了一下,歡迎指教。使用者表 create table usr uid int 11 not null,name char 10 default null,primary key uid engine innodb default charset utf8 吃飯記錄表 create tabl...

mysql豎向表設計 mysql,表設計

閒著沒事搞了一下,歡迎指教。使用者表 create table usr uid int 11 not null,name char 10 default null,primary key uid engine innodb default charset utf8 吃飯記錄表 create tabl...