Проектируем базу данных: система друзей в стиле Facebook
В этом уроке мы рассмотрим проектирование БД с использованием MySQL, подобных той, что используются на Facebook .
Проект БД
Для реализации поставленной задачи нам понадобится три таблицы:Users, Updates и Friends.
Таблица Users
Таблица пользователей будет содержать данные, которые юзеры оставляют при регистрации.
1 2 3 4 5 6 7 8 |
CREATE TABLE `users` ( `user_id` INT(11) NOT NULL AUTO_INCREMENT , `username` VARCHAR(45) , `password` VARCHAR(100) , `email` VARCHAR(45) , `friend_count` INT(11) , `profile_pic` VARCHAR(150), PRIMARY KEY (`user_id`)); |
Пароль будем хранить после хеширования функцией MD5.
Таблица Updates
Данная таблица будет хранить статусы пользователей. В данном случае user_id_fk это внешний ключ, который относится к users.user_id
1 2 3 4 5 6 7 8 |
CREATE TABLE `updates` ( `update_id` INT(11) AUTO_INCREMENT , `update` VARCHAR(45), `user_id_fk` VARCHAR(45), `created` INT(11) , `ip` VARCHAR(45), PRIMARY KEY (`update_id`), FOREIGN KEY (user_id_fk) REFERENCES users(user_id)); |
Таблица Friends
Данная таблица будет хранить связи пользователей. В данном контексте friend_one и friend_two это внешние ключи к users.user_id
1 2 3 4 5 6 7 |
CREATE TABLE `friends` ( `friend_one` INT(11) , `friend_two` INT(11) , `status` ENUM('0','1','2') DEFAULT '0', PRIMARY KEY (`friend_one`,`friend_two`), FOREIGN KEY (friend_one) REFERENCES users(user_id), FOREIGN KEY (friend_two) REFERENCES users(user_id)); |
friendsTable.png
Добавление в друзья
Для того, чтобы отправить запрос в друзья, воспользуйтесь следующим insert запросом:
1 2 3 4 |
INSERT INTO friends (friend_one,friend_two) VALUES ('$user_id','$friend_id'); |
Подтверждение дружбы
Для подтверждения дружбы или игнорирования запроса, выставите статус в 0 или 1:
1 2 3 4 5 6 |
UPDATE friends SET status="1" WHERE (friend_one="$user_id" OR friend_two="$user_id") AND (friend_one="$friend_id" OR friend_two="$friend_id"); |
Проверка дружат ли пользователи или нет
В данном случае, friend_one это инициатор запроса:
1 2 3 4 5 |
SELECT 'friend_one','friend_two','status' FROM friends WHERE (friend_one="$user_id" OR friend_two="$user_id") AND (friend_one="$friend_id" OR friend_two="$friend_id") |
PHP
Вот небольшой PHP код, который поможет вам вывести соответствующие кнопки на страницах пользователей.
1 2 3 |
} else { |
1 |
} |
Обновление списка друзей
Выборка данных согласно связям таблиц users, friends и updates.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT U.username, U.email, D.update_id, D.update, D.created FROM users U, updates D, friends F WHERE D.user_id_fk = U.user_id AND CASE WHEN F.friend_one = '$user_id' THEN F.friend_two = D.user_id_fk WHEN F.friend_two= '$user_id' THEN F.friend_one= D.user_id_fk END AND F.status > '0' ORDER BY D.update_id DESC; |
Списки друзей
В данном запросе мы отобразим связь между таблицами users и friends, для отображения списка друзей.
db.php
Напоследок приведём пример файла конфигурации базы данных.
define(‘DB_SERVER’, ‘localhost’);
1 2 3 4 |
define('DB_USERNAME', 'username'); define('DB_PASSWORD', 'password'); define('DB_DATABASE', 'database'); $connection = @mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE); |