我想创建一个MySQL数据库,该数据库应该包含我网站的所有用户,并且还应该选择将其他用户添加为朋友。应该是数据库的领域。
答案 0 :(得分:0)
我无法分辨您的用户表应涵盖的内容。你需要了解自己。 ;)但你需要第二个表,例如“朋友”,持有两个字段:一个用于实际用户,一个用于该用户的朋友。因此,用户表与其自身之间存在m:n关系。
答案 1 :(得分:0)
SiteUser
UserID
-- anything else you want
UserFriend
UserID_1
UserID_2
-- timestamp, status?
关于这一点的坏处是,提取Friends
的所有User
的查询必须同时检查列UserID_1
和UserID_2
。作为替代方案:
UserFriend
UserID
FriendID
这将有两倍的行(每对两行),但查询速度要快得多。
答案 2 :(得分:0)
简单的例子 - 希望它有所帮助...
-- TABLES
drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varbinary(32) unique not null
)
engine=innodb;
drop table if exists user_friends;
create table user_friends
(
user_id int unsigned not null,
friend_user_id int unsigned not null,
created_date datetime not null,
primary key (user_id, friend_user_id) -- note clustered composite PK (innodb only)
)
engine=innodb;
-- TRIGGERS
delimiter #
create trigger user_friends_before_ins_trig before insert on user_friends
for each row
begin
set new.created_date = now();
end#
delimiter ;
-- STORED PROCEDURES
drop procedure if exists insert_user_friend;
delimiter #
create procedure insert_user_friend
(
in p_user_id int unsigned,
in p_friend_user_id int unsigned
)
proc_main:begin
if p_user_id = p_friend_user_id then
leave proc_main;
end if;
insert into user_friends (user_id, friend_user_id) values (p_user_id, p_friend_user_id);
end proc_main #
delimiter ;
drop procedure if exists list_user_friends;
delimiter #
create procedure list_user_friends
(
in p_user_id int unsigned
)
proc_main:begin
select
u.*,
uf.created_date,
date_format(uf.created_date, '%e-%b-%Y') as created_date_fmt
from
user_friends uf
inner join users u on uf.friend_user_id = u.user_id
where
uf.user_id = p_user_id
order by
u.username;
end proc_main #
delimiter ;
-- TEST DATA (call these sproc from your php !)
insert into users (username) values ('f00'),('bar'),('alpha'),('delta'),('omega'),('theta');
call insert_user_friend(1,2);
call insert_user_friend(1,3);
call insert_user_friend(1,4);
call insert_user_friend(1,1); -- oops
call insert_user_friend(2,1);
call insert_user_friend(2,5);
call insert_user_friend(4,1);
call insert_user_friend(6,1);
call list_user_friends(1);
答案 3 :(得分:0)
您只需要一个数据库,在此数据库中您需要两个表:
Users:
Username, id, otherstuffyouwanthere
Freinds:
UserID, FriendID
如果要调用用户freinds列表,只需找到用户ID并运行:
SELECT Users.Username FROM Friends JOIN Users ON Friends.FriendID=Users.id WHERE Friends.UserID="mycurrentid"
答案 4 :(得分:-1)
@Flinch:您可以使用邻接列表模型
在一个表中实现相同的效果但是......这是我使用的架构
CREATE TABLE
my_users (
ID为
int(5) unsigned NOT NULL auto_increment,
LOGIN_NAME
varchar(50) character set utf8 NOT NULL,
密码
varchar(255) character set utf8 NOT NULL default '',
FULL_NAME
varchar(255) character set utf8 NOT NULL,
user_department_code
varchar(255) character set utf8 default NULL,
电子邮件
varchar(255) character set utf8 default NULL,
优越
varchar(255) character set utf8 default NULL,
ACCESS_LEVEL
int(5) default '2',
秩
varchar(100) character set utf8 default '1',
ACCOUNT_STATUS
varchar(20) character set utf8 default NULL,
LFT
int(5) default NULL,
RGT
int(5) default NULL,
ID为
PRIMARY KEY (),
LOGIN_NAME
UNIQUE KEY(
LOGIN_NAME { {1}}
lft和rgt用于上级/下级计算(层次结构等) 你可以看到http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 有关mysql中hierarichal数据的更多信息