2010-11-15 2 views
-1

Я хочу создать базу данных MySQL, которая должна содержать всех пользователей моего сайта, а также должна быть возможность добавления других пользователей в качестве друзей. Какими должны быть поля базы данных.Создание базы данных Mysql

+5

Слишком широкий вопросы здесь. Прочтите несколько обучающих руководств для начинающих по MySQL и спросите более конкретные инструкции, если у вас есть особые проблемы. – Kibbee

+0

База данных с одной таблицей «Пользователи» кажется достаточно, имея в этой таблице несколько полей типа «Id», «Name», «Login», «Pass» и «TypeOfUser» ... В зависимости от того, как вы будете использовать свою базу данных , но один стол кажется достаточно. – naruu

+0

Нет, вам нужна таблица отношений для обработки функции «Фрейндс» –

ответ

0

Я не могу сказать, что должна покрыть таблица ваших пользователей. Вы должны знать сами. ;) Но вам нужна вторая таблица, например. «друг», держащий два поля: один для фактического пользователя и один для друга этого пользователя. Итак, у вас есть отношение m: n между пользовательской таблицей и самим собой.

0
SiteUser 
    UserID 
    -- anything else you want 

UserFriend 
    UserID_1 
    UserID_2 
    -- timestamp, status? 

Плохая вещь о том, что запрос, чтобы вытащить все Friends из User бы проверить обе колонки UserID_1 и UserID_2. В качестве альтернативы:

UserFriend 
    UserID 
    FriendID 

Это будет иметь в два раза больше строк (по два для каждой пары), но будет намного быстрее запрашивать.

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); 
0

Вам нужно только одну базу данных, в этой базе данных требуются две таблицы:

Users: 
Username, id, otherstuffyouwanthere 

Freinds: 
UserID, FriendID 

Если вы хотите, чтобы вызвать из пользователей Freinds список, просто найдите идентификатор пользователя и запустите это:

SELECT Users.Username FROM Friends JOIN Users ON Friends.FriendID=Users.id WHERE Friends.UserID="mycurrentid" 
-1

@Flinch: вы можете добиться такого же эффекта с помощью одной таблицы u петь смежности Список Модель

, но ... это схема я использую

CREATE TABLE my_users (
идентификаторов 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,
PRIMARY KEY (
id ),
UNIQUE KEY
имя_пользователя ( имя_пользователя )
) ENGINE=MyISAM AUTO_INCREMENT=01 DEFAULT CHARSET=latin1

LFT и РТГ предназначен для высшего/расчета подчиняет (иерархия и т.д.) вы можете увидеть http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ для получения дополнительной информации о hierarichal данных в MySQL

+0

Я не уверен, как вы будете хранить информацию о произвольном количестве друзей, используя модель списка смежности. Любое количество друзей не будет иерархическим деревом, а скорее более общим графиком. – Kibbee

+0

Он не запрашивал функцию друзей. –

Смежные вопросы