|
|
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
День добрый. Все голову поломал. Не получается спроектировать БД для диалогов между пользователями. Переписка между двумя пользователми это и есть диалог. Нужно вывести список всех диалогов для конкретного пользователя с последним сообщением в диалоге. Т.е. вот так: Каждый пользователь может удалять свои сообщения. Пока удалось связать таблицы так: users (id, name) messages(id, name) users_has_messages(id, user_id, messages_id) Запрос на получения списка диалогов, как на рисунке, не получается. Подскажите, пожалуйста, где я ошибаюсь в проектировании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 12:18 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
xing, Можно добавить еще одну таблицу, имеющую два поля: user_id и id из таблицы users_has_messages. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 13:28 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
А что это дает? Запрос получается монструозный и с if .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 13:30 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
Можно будет заселектить все элементы из этой таблицы по нужному нам пользователю... Т.е. - получится вариант, который Вы описали на рисунке. Разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 13:37 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
Блин, кажись протупил... А почему бы не добавить в таблицу users_has_messages еще два поля: id_user'a (которому это сообщение было адресовано) и сам текст этого сообщения... и можно ее как-нить по другому обозвать (имеется ввиду таблицу). Вот... а при добавлении нового сообщения делать проверку на совпадение id'шок пользователей и подменять текст сообщения (в данном случае, конечно же, будет два обращения к таблице: удаление и добавление). Что-то типа... Как-то так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 13:55 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
... ... ... Спасибо, за ответы. Так пробовал делать, и добавлял в таблицу users_has_messages, id отправител и id получателя. Все равно красиво свернуть все это дело в диалог - не получается ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 14:04 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
Мне кажется что изначально спроектировал таблицы неправильно. От того запрос составить не получается. А вот как правильно подобрать архитектуру пока хз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 14:06 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
xing users (id, name) messages(id, name) Что, одно сообщение может иметь множество отправителей и получателей??? Мне кажется, схема должна быть такая: users (id, name) messages(id, name, id отправителя, id получателя) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 14:21 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
alexeyvgxing users (id, name) messages(id, name) Что, одно сообщение может иметь множество отправителей и получателей??? Мне кажется, схема должна быть такая: users (id, name) messages(id, name, id отправителя, id получателя) Нет. 2 ссылки на одно сообщение (от отправители и получателя). Чтобы каждый пользователь мог удалить сообщение у себя, но при этом у другого пользователя оно отображалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 14:35 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
Мысль, наверное, абсурдная но она имеет право на "жизнь"... что если в таблицу messages (дропаем users_has_messages) добавить четыре поля (в догонку к имеющимся message_id и message_text): - id_user_from; - id_user_to; - flag_for_user_from; - flag_for_user_to. Последние два поля составляют костяк абсурда :) Идея такая - при удалении одним из пользователей выставлять соответствующий флаг в определенное значение (0 например), когда оба флага выставлены в 0 удалять сообщение из таблицы окончательно. С количеством ссылок не проканает (личное мнение) потому, что мы не будем знать "чья" ссылка осталась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 15:47 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
... ... ... , ммм..не очень понял, как это поможет вывести диалоги. Удаление вроде как не проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2011, 15:56 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
Почему-то казалось, что основная проблема - удаление :) Ну да ладно... Вывод диалога: селектим все элементы из таблицы по id (скорее всего по полю "to") нужного нам пользователя и выводим, соответственно, от кого и текст сообщения. Может чего не допонимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 07:14 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
xing... ... ... , ммм..не очень понял, как это поможет вывести диалоги. Удаление вроде как не проблема. Вывести простым селектом. Непонятно, какая может быть проблема? По крайней мере, такая модель данных наиболее полно соответствует бизнес-требованиям. xingНет. 2 ссылки на одно сообщение (от отправители и получателя). Чтобы каждый пользователь мог удалить сообщение у себя, но при этом у другого пользователя оно отображалось.Нет, у вас пользователь не может удалить сообщение у себя. Вы сохраняете этот факт - создано сообщение от пользователя А пользователю Б. И сам факт вы не удаляете (т.к. второй пользователь может посмотреть это сообщение). Кроме того, вам не нужно посылать одно сообщение от пользователей А, Б и В пользователям Г и Д. Так зачем это такую возможность предусматривать в схеме данных? Это усложнит разработку и сопровождление базы. Вам нужно только предусмотреть возможность не-показа сообщения какому-то из 2-х пользователей. Это всё учитывается в моём варианте и в варианте "... ... ..." Я только сразу не предусмотрел этих флагов - не знал о необходимости удаления показа. ... ... ...Последние два поля составляют костяк абсурда :)Да вполне нормальные поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 09:15 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Все гладко только в теории. Попробуйте по вашей схеме вывести список последних сообщений всех диалогов которые ведет пользователь, причем не важно кто автор последнего сообщения (либо сам пользователь либо его собеседник), оно должно выводиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 10:49 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
авторКроме того, вам не нужно посылать одно сообщение от пользователей А, Б и В пользователям Г и Д. Так зачем это такую возможность предусматривать в схеме данных? Это усложнит разработку и сопровождление базы. Вам нужно только предусмотреть возможность не-показа сообщения какому-то из 2-х пользователей. users (id, name) 1 Иван Иванов 2 Дмитрий Сидоров Первый пользователь пишет второму : messages(id, name) 1 Текст_Сообщения users_has_messages(id, user_id, messages_id) 1 1 1 2 2 1 Если же один из пользователей, например второй, удаляет сообщение у себя. Первый пользователь его все равно видеть будет..так как ссылка на сообщение, для первого пользователя в users_has_messages остается. А вот для второго юзера сообщение выводиться не будет. В чем недостаток схемы, не понимаю что-то. Объясните, пожалуйста, примером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 11:01 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
три простых таблицы: [Пользователи] Id Caption [Диалоги] Id IdFrom IdTo Caption [Сообщения] ID IdDialog IdUser Message ShowWriter (0/1) ShowReader (0/1) все поставленные задачи решаются элементарными запросами ставить галочку "не показывать мне" может кто угодно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 11:44 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
Chop, можно пример запроса на считываение диалогов юзера, с последним сообщением в нем? На всякий выкладываю дамп бд: http://narod.ru/disk/16994212001/test.sql.html И собственно запрос, который получает список диалогов с последним сообщением в нем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 11:53 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
Вопрос как раз, можно ли это сделать проще ? Chop, как в вашей реализации будет выглядеть подобный запрос? Приведите, пожалуйста, пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 11:59 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
xingalexeyvg, Все гладко только в теории. Попробуйте по вашей схеме вывести список последних сообщений всех диалогов которые ведет пользователь, причем не важно кто автор последнего сообщения (либо сам пользователь либо его собеседник), оно должно выводиться. select * from message where user_id in (user_id_from, user_id_to) где user_id - идентификатор пользователя (переменная или константа). xingВ чем недостаток схемы, не понимаю что-то. Объясните, пожалуйста, примером.Недостаток схемы в том, что она не отражает реальных процессов. Если вы сделаете схему, которая просто позволит показать на экране то, что вам надо, это называется "простокод", а такие программисты - "простокодеры" :-) Вы, как разработчик мождели БД, должны создать такую модель данных, чтобы никакой программист не смог ввести неправильные данные или написать программу, которая покажет на экране что то невразумительное. Просто что бы у него сама собой для этой модели данных получалась хорошая программа, а для написания ошибок ему пришлось бы сильно поломать голову. Например, для вашей схемы программист сможет заполнить таблицу такими данными users_has_messages(id, user_id, messages_id) 1,1,1 2,1,1 3,2,1 4,3,1 5,4,1 Что нужно отобразить на экране? Кто, кому и какое сообщение отправил? Разумеется, создавать правильные модели необязательно, и заботиться о том, что там будет после вас - тоже, но если есть желание сделать хорошую модель данных, то она ИМХО непохожа на вашу. Или я неправильно понимаю задачу (вам конечно виднее, вы же её знаете). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 12:09 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
xingChop, можно пример запроса на считываение диалогов юзера, с последним сообщением в нем? можно где-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 12:14 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
alexeyvg , спасибо за помощь. Код: plaintext 1. Chop , большое спасибо за помощь. Наши запросы идейно похожи. Именно поэтому создал тему, чтобы попробовать уйти от такого громоздкого варианта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 12:59 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
xing...создал тему, чтобы попробовать уйти от такого громоздкого варианта.да куда уже проще... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 13:39 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
ндаа... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Здесь, если юзер отметит последнее сообщение как удаленное, диалог исчезнет из списка (до появления нового сообщения в диалоге) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 14:05 |
|
||
|
Диалоги между пользователями.
|
|||
|---|---|---|---|
|
#18+
xingЭтим запросом выводятся все сообщения всех диалогов. А нужно именно как на рисунке, все диалоги юзера с текстом последнего сообщения в нем.А, именно как на рисунке? Ну чего же проще-то... select u.name, ( select top 1 m.name from messages m where u.user_id in (m.user_id_from, m.user_id_to) order by m.date desc ) as messages_name from users u ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2011, 15:00 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37323015&tid=1542104]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
399ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 707ms |

| 0 / 0 |
