История действий юзера аля одноклассники

Сенсей

Новичок
История действий юзера аля одноклассники

Вот надо замутить историю действий пользователей (друзей) , что то вроде как на одноклассниках:



В основном нужно выводить действия на:

user_id=1 и user_id=2 подружились
user_id=1 изменил свой статус на bla bla bla
user_id=1 отметил вас на фотографии id=4545
user_id=1 отметил вас (user_id=2) на фотографии photo_id=4545
user_id=1 отметил СЕбЯ (user_id=1) на фотографии photo_id=5656

и т.д

Первая идея самая простая:

table : history | id | user_id | text | date |

То есть таблица вообще не знает что и кто кому сделал. Вывод данных - обычный селект.

Ввод - при любом из вышеперечисленных действий, генерируется html код где уже идет готовая информация что-то типа "Вася такой то отметил вас на фотографии такой то" - и весь этот текст записывается в таблицу с user_id кому это сообщение должно потом показываться.

Все просто но неэкономно. Писать полностью отформатированное сообщение в базу? Лишние kb + гибкости никакойю Например юзер отметил кого-то на фотке, тому юзеру отправилось сообщение. Через минуту юзер заметил что указал не того человек на фотографии и удалил его с нее. Удалить же отправленное сообщение уже не удастся - потому что кроме id новой записи в таблице history у нас ничего нет.

Еще есть мысль создать поле например type где если вписано PHOTO = значит брать при выводе откуда то id двух юзеров и id фотки, и при выводе состовлять уже сообщение "Вася такой то отметил вас на фотографии такой то".

Но вот тут уже голова не слишком работает как базу организовать. Делать одну таблицу - получится каша, ведь действий много, в одном действии используются id юзеров, в другом id фоток, в третьем еще что-то...

Вобщем кто сталкивался, посоветуйте что нибудь. Хоть намек как лучше организовать что бы потом меньше проблем было.
 

DiMA

php.spb.ru
Команда форума
сделай колонки str1,str2,str3... и пишу туда заменяемые слова, если они в других колонках не значатся
а потом sprintf(шаблон из код, str1, str2..) собирай текст при показе
для разных типов событий str1 используется под разные типы слов
 

Сенсей

Новичок
Пока вот что придумал:

Активность друзей:

1. Пользователь ID оставил комментарий к фото с вами.
(user_id | friend_id | photo_id) | comment
2. Пользователь ID установил статус ("бла бла бла")
(user_id | friend_id) | status
3. Пользователь ID и пользователь ID теперь друзья
(user_id | friend_id | new_friend_id) | friends
4. Ваши друзья ID, ID, ID идут на вечеринку ID
(user_id | friend_id | event_id) | go_event
5. Пользователь ID добавил личные фотографии
(user_id | friend_id) | profile_photos
6. Пользователь ID засветился на фотографии с вечеринки ID
(user_id | friend_id | photo_id) | set_on_photo

user_id - пользователь которому показывается история
friend_id - пользователь совершивший действие

actions: comment, status, friends, go_event, profile_photos, set_on_photo

PHP:
CREATE TABLE `users_history` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `user_id` int(10) unsigned NOT NULL default '0',
  `friend_id` int(10) unsigned NOT NULL default '0',
  `new_friend_id` int(10) unsigned NOT NULL default '0',
  `photo_id` int(10) unsigned NOT NULL default '0',
  `event_id` int(10) unsigned NOT NULL default '0',
  `action` varchar(255) NOT NULL,
  `date` datetime default NULL,
  PRIMARY KEY  (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
В итоге например когда пользователь выделил себя на фотографии (6-ое действие с верхнего списка, мы выбираем id друзей пользователя, и заносим в базу данные:



При выводе взависимости от action будем уже состовлять соответствующее сообщение. Придется правда джоинить 3 таблицы что бы узнать nick friend_id и new_friend_id (если друг пользователя подружился с кем-то) и название event

1. Что посоветуете?
2. Стоит ли иди дальше и нормализовать данные? Т.Е раделить на 2 таблицы - в одной данные дейсвия с id итемов скажем так. И в другой таблице - связь (то есть только user_id и friend_id)?

Боюсь кашу заварить что сам потом не расхлебаю...
 

LONGMAN

Dark Side of the Moon..
Интересно, а как всё это сделано на одноклассниках?
 
Сверху