Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Структура БД (аналог личной почты)
 
 автор: smash   (13.08.2009 в 13:17)   письмо автору
 
 

Здравствуйте, опыта проектирования бд не имею, поэтому хочу узнать мнение профессионалов в правильном ли направлении я иду.

Делаю аналог личной почты на сайте, т.е. входящие/исходящие сообщения для пользователей сайта.

1 таблица (пользователи)
id пользователя
id отправленных сообщений
id входящих сообщений


2 таблица (сообщения всех пользователей)
id сообщения
от кого (id пользователя)
кому (id пользователя)
текст сообшения

Мне кажется, что получается не очень. Особенно не нравится, что придется в первой таблице в ячейке id отправленных сообщений хранить и каждый раз дописывать id отправленных сообщений в каком-то таком виде: 123123|435435|325325|54757|3654356| и каждый раз обрабатывать на php эту ячейку, выуживая там id сообщений.

Наверняка есть какие-то более простые способы, буду рад любым советам. Спасибо.

  Ответить  
 
 автор: а-я   (13.08.2009 в 13:29)   письмо автору
 
   для: smash   (13.08.2009 в 13:17)
 

так не храните там кол-во сообщений...
делайте 2 запроса или многотаблич. запросы.

  Ответить  
 
 автор: Trianon   (13.08.2009 в 13:36)   письмо автору
 
   для: а-я   (13.08.2009 в 13:29)
 

он количество вроде и не хранит.
Хотя ужас-ужас - это да.

Автору:
users(id, username)
messages(id, author_id, subject, creationdate, msgtext)
folders(id, user_id, foldername)
posts(id, folder_id, message_id, to_user_id, read_flag, read_date, answer_id)

Папки в приципе можно убрать.

  Ответить  
 
 автор: smash   (13.08.2009 в 13:50)   письмо автору
 
   для: Trianon   (13.08.2009 в 13:36)
 

Именно кол-во автор и хранит и даже понимает, что это не правильно, потому на форум и пришел.

Trianon
Спасибо большое, я предполагал такую структуру, но не понимаю как из нее БЫСТРО получить входящие или исходящие?
Выдержит ли такая база, если на сайте уже более 1000 пользователей онлайн?

  Ответить  
 
 автор: Trianon   (13.08.2009 в 16:45)   письмо автору
 
   для: smash   (13.08.2009 в 13:50)
 

>Именно кол-во автор и хранит и даже понимает, что это не правильно, потому на форум и пришел.

Я не увидел. Увидел что Вы храните список ключей в поле.

>Спасибо большое, я предполагал такую структуру, но не понимаю как из нее БЫСТРО получить входящие или исходящие?

Быстро получить сами входящие/исходящие или их количество?

SELECT COUNT(*) FROM posts WHERE to_user_id = $userid
SELECT COUNT(*) FROM posts WHERE author_id = $userid
author_id можно в принципе продублировать в posts


>Выдержит ли такая база, если на сайте уже более 1000 пользователей онлайн?

Думаете - рухнет?

  Ответить  
 
 автор: smash   (13.08.2009 в 13:41)   письмо автору
 
   для: а-я   (13.08.2009 в 13:29)
 

Каких 2 запроса? Можно немного подробнее? Спасибо

  Ответить  
 
 автор: а-я   (13.08.2009 в 14:22)   письмо автору
 
   для: smash   (13.08.2009 в 13:17)
 

Я так понял, у Вас проблемы с счетчиком, кол-во вход. и исходящих.
можно так поступить!
НЕ ТЕСТИРОВАЛ

<?
$sql 
'
SELECT 
 COUNT( * ) AS `all` , 
 (`user_1` = '
.$user_id.') AS `type` 
FROM 
 `messages`
GROUP BY 
 `type`
'
;

$ms mysql_query($sql) or die(mysql_error());

for(
$data=array(0,0); $result mysql_fetch_assoc($ms); $data[$result['type']] = $result['all']);

?>
входящих: <?=$data[0]?><br />
исходящих: <?=$data[1]?><br />




--------
UPDATE:

только заметил, что в 1ой табл. Вы хотите хранить id всех исход. сообщений!
так делать нельзя.!

при авторизации юзера у Вас есть его id/
храните в сессиях?

потом просто в запросах ставите условие, на вход и исход по этому id

  Ответить  
 
 автор: smash   (13.08.2009 в 15:14)   письмо автору
 
   для: а-я   (13.08.2009 в 14:22)
 

а-я, спасибо за помощь, буду пробовать.

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

SELECT message FROM message_table WHERE id = 167892332 ORDER BY
 date


а сразу обращаться к нужным сообщениям, но видимо по другому никак.

  Ответить  
 
 автор: а-я   (13.08.2009 в 15:28)   письмо автору
 
   для: smash   (13.08.2009 в 15:14)
 

ну.. чтоб не терять скорость, необходимо использовать index'ы!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования