Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой способ хранения данных выбрать? 
V
    Опции темы
Рыжий
Дата 8.6.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: нет
Всего: 20



Всем привет!
Есть такой вопрос:
Необходимо сделать групповую систему общения. Так что-бы пользователь мог отправить одно PM многим людям одновременно. 
Вопрос - как лучше хранить ID участников общения?

Наилучший способ который вижу я - это сделать поле:
participants - участники дискуссии
В котором размещать данные:
Код

|10|105|370|233|

Когда пользователь ID=370 достает свои сообщения, делать:
Код

SELECT * FROM messages WHERE participants LIKE "%|370|%"


Но возможно есть более быстрые способы это сделать?

Спасибо!

PM MAIL ICQ   Вверх
Artemon
Дата 8.6.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Users
---------
idUser
Login


Discussion
----------
idDiscussion
NameDiscussion


UsersInDiscussion
----------
id
idUser
idDiscussion


Messages
---------
idMessage
idUser
Message



Это сообщение отредактировал(а) Artemon - 8.6.2011, 13:21


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Akina
Дата 8.6.2011, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Рыжий, группа - динамически формируемая, или хранится постоянно по типу списка рассылки? Следует ли учитывать возможность нахождения абонента в оффлайне и хранить сообщение до его появления?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Рыжий
Дата 8.6.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: нет
Всего: 20



Artemon, Да, хороший вариант. 
Тогда для обсуждений необходимо даже 3 таблицы:

Discussion
----------
idDiscussion


UsersInDiscussion
----------
id
idUser
idDiscussion 


Messages
----------
id
idAuthor
idDiscussion 
textMessage


Хех, Таблица Discussion выглядит так одиноко с одним параметром id (А больше в ней ничего особого хранить не надо). Но оставим ее все равно нет более подходящего места для idDiscussion 


Akina, Это обыкновенная система Private Messages как на форуме, только в поле To можно указать много пользователей. Когда кто-то из участников отвечает - он отвечает всем сразу. Будет возможность удалить себя из группы

Цитата(Akina @  8.6.2011,  12:29 Найти цитируемый пост)
Следует ли учитывать возможность нахождения абонента в оффлайне и хранить сообщение до его появления? 

Да


Это сообщение отредактировал(а) Рыжий - 8.6.2011, 13:37
PM MAIL ICQ   Вверх
Akina
Дата 8.6.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Рыжий @  8.6.2011,  14:36 Найти цитируемый пост)
Цитата(Akina @  8.6.2011,  14:29 Найти цитируемый пост)
Следует ли учитывать возможность нахождения абонента в оффлайне и хранить сообщение до его появления? 

Да

В таком случае вышеописанная структура не подходит. Следует ввести таблицу, которая связывает пользователей с сообщениями, которые следует им доставить (idUser-idMessage). 
Это будет самая нагруженная таблица - в неё добавляются записи при написании сообщения (по количеству адресатов группы минус автор) и удаляются после пересылки. И чтобы немного разгрузить её - добавь туда поле-пометку о доставке, и по значению этого поля (а также по истечении времени жизни сообщения или при удалении абонента из группы) выполняй периодическую очистку (или снос в архив). Это намного лучше, чем удалять по одной записи сразу после доставки.


Это сообщение отредактировал(а) Akina - 8.6.2011, 14:10


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Рыжий
Дата 8.6.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: нет
Всего: 20



Akina, Мне кажется ты воспринял фразу "групповая система общения" слишком буквально. На деле же получится система скорее похожая на email чем на чат.

Цитата(Akina @  8.6.2011,  13:09 Найти цитируемый пост)
Следует ввести таблицу, которая связывает пользователей с сообщениями, которые следует им доставить

Я правильно понимаю, что ты за систему типа:

Messages
----------
id
idAuthor 
textMessage


Recipients
----------
id
idUser
idMessage

Где Messages будет содержать сообщение. А Recipients - значения idUser и ссылаться на messages.id?
А после того как человек прочел сообщение - удалять его из таблицы Recipients?

Но ведь это как бы гемор?  smile 



С тремя таблицами не лучше не хуже, но я понял так:
В таблице Discussion
Код

+------------+---------------------+
| id         | last_update         |
+------------+---------------------+
|          1 | 2011-06-08 14:11:30 |
|          2 | 2011-06-08 14:11:30 |
+------------+---------------------+

(last_update - время последнего сообщения в этой дискуссии, сделано для удобства сортировки)

В таблице Messages:
Код

+------------+-----------------+---------------+---------------+---------------------+
| id         | author_id       | discussion_id | message       | date                |
+------------+-----------------+---------------+---------------+---------------------+
|          1 |               5 |             2 | Hello guys!   | 2011-06-08 14:11:30 |
|          2 |              36 |             2 | Hey Akina!    | 2011-06-08 14:11:30 |
+------------+-----------------+---------------+---------------+---------------------+

Связь по discussion.id = messages.discussion_id

И в таблице Participants:
Код

+------------+-----------------+---------------+---------------+
| id         | user_id         | discussion_id | is_read       |
+------------+-----------------+---------------+---------------+
|          1 |               5 |             2 |             0 |
|          2 |              36 |             2 |             1 |
|          3 |              48 |             2 |             0 |
+------------+-----------------+---------------+---------------+

Все участники дискуссии с №2
Связь с discussion.id = participants.discussion_id


Автоматически удалять сообщения после их прочтения нет необходимости т.к. у юзера все будет идти и оставаться в inbox. Захочет удалить свои сообщения - пожалуйста. 
Захочет выйти из дискуссии - просто удалим его из таблицы participants с соответствующим ID дискуссии. 


Хотя, возможно, я тебя в корне неправильно понял? (
PM MAIL ICQ   Вверх
Akina
Дата 8.6.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Рыжий @  8.6.2011,  16:01 Найти цитируемый пост)
Я правильно понимаю, что ты за систему типа

да
Цитата(Рыжий @  8.6.2011,  16:01 Найти цитируемый пост)
Но ведь это как бы гемор?

?? чем?

Цитата(Рыжий @  8.6.2011,  16:01 Найти цитируемый пост)
С тремя таблицами не лучше не хуже, но я понял так:

Есть масса возражений - но тебе виднее...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Рыжий
Дата 8.6.2011, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: нет
Всего: 20



Akina, Да, ты оказался прав, третья "над"таблица связывающая Messages и Participants там ни к чему. 
Параметр discussion_id хорошо себя чувствует в messages таблице.

Из неудобств: для того, что бы выбрать  например 10 последних дискуссий в которых участвует пользователь запрос будет:

Код

SELECT DISTINCT messages.discussion_id
        FROM messages, discussions_participants
        WHERE discussions_participants.discussion_id = messages.discussion_id AND discussions_participants.user_id=1
        ORDER BY messages.date DESC LIMIT 10


В мануале mysql:
Цитата

DISTINCT combined with ORDER BY needs a temporary table in many cases. 

И при Explain - есть параметр "Using temporary". 

В остальном же все замечательно!
Большое спасибо AkinaArtemon!!!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0914 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.