За последние 24 часа нас посетили 21919 программистов и 988 роботов. Сейчас ищет 671 программист ...

Создание чата между менеджерами и клиентами

Тема в разделе "PHP и базы данных", создана пользователем RazerVG, 21 янв 2015.

  1. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Не нашел подходящего раздела на форуме ( Проектирование БД), поэтому пишу сюда.

    Необходимо создать приложение для связи клиента и менеджера. То есть менеджер может общаться с несколькими клиентами, а клиент только с одним.

    Прочитал подобные темы на других форумах, там решают это проблему создавая две таблицы: Диалоги, Сообщения.

    Я решил тоже использовать эту схему. Получаеться я имею следующие таблицы: Клиенты, Менеджеры, Диалоги, Сообщения.

    Не буду расписывать все атрибуты напишу только важные.

    Таблица Клиенты: id клиента.

    Таблица Менеджеры: id менеджера.

    Таблица Диалоги: id диалога, id клиента, id менеджера.

    Таблица Сообщения: id сообщения, id отправителя, id диалога, текст, дата.

    Получаеться при удалении диалога менеджером, сообщения остаются и клиент их может читать.

    Вот тут и проблема, как сделать так чтобы при написании нового сообщения менеджер видел только его, а не старые.( то есть нужно как то раздвоить диалоги)
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Кого его?
     
  3. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Новое сообщение не выводя старые. То есть у меня сообщения привязаны к диалогам по id диалога, но когда я удаляю диалог менеджером, то id диалога которого удалили тоже удаляется из таблицы сообщения, т. е. получаеться в таблице сообщения у нас будут сообщения в которых поле id диалога будет пустым.

    Но у клиента эти сообщения должны остаться. Как это сделать?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    RazerVG, просто не надо удалять. заведи признак "в архиве".
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    у клиента всегда должна быть история переписки а у манагера только его конкретная сессия чатика?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Автоинкремент ещё загугли.
     
  7. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Да именно это и нужно.

    Ну все поля с id у меня и так автоинкремет
     
  8. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    На самом деле там всё интереснее гораздо. Если конечное хранилище реляционная база данных, то таблицы с сообщениями у вас должны создаваться сами при заполнении N-ным количеством сообщений существующих, но не суть, не будем усложнять.

    Как правильно написали выше, в вашей структуре в таблице "Диалоги" у вас должен быть параметр "закрыт" или "удалён". Если происходит зачем-то реальное удаление записи из этой таблицы, то, соответственно, в связанной таблице сообщений у вас для каждой записи должен быть параметр "удалён диалог" (причем на это поле можете сразу вешать индекс), если при удалении связанной записи из таблицы Диалоги вы хотите сохранить сами сообщения и показывать их одним пользователям, скрывая от других.
     
  9. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Это я понял. А еще один вопрос.

    У меня сообщения привязаны к диалогам, а как мне связать таблицу сообщения и таблицы клиенты, таблицу менеджеры. Понятно что id отправителя я записывать значение из сессии. А как мне потом по этому id выводить имя???
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Ну а ты смотрел вообще как люди делают? Связывают (join) таблицы по нужному id и тогда имя из связанной таблицы становится доступно.
     
  11. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    y
    ну это понятно просто мне придется проверять две таблицы, так как отправитель может быть как клиентом так и менеджером

    будет большая нагрузка на сервак и это очень долго

    Добавлено спустя 40 минут 24 секунды:
    Если мы в сообщениях создадим отправитель и получатель, то получиться двойная связь, т.к. и клиент и менеджер могут быть и тем, и тем
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    То есть ты уже начал "оптимизировать хайлоад"? ))) Тогда избавься от двух таблиц про одно и то же: пусть будет только Пользователи.
     
  13. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Тогда подробнее опишу ситуацию. У меня есть несколько менеджеров. У каждого менеджера есть по несколько клиентов. То есть между таблицей менеджеры и клиенты связь один ко многим. Ее не как не убрать.

    Нужно создать систему диалогов по типу контакта( со стороны менеджера) и по типу чата с одним пользователем( со стороны клиента).

    Вот я еще придумал: К примеру если я создам две таблицы: Сообщения менеджеров и Сообщения клиентов. И их свяжу с таблицей диалоги по id диалогу. То есть буду к примеру в таблицу диалоги записывать между какими пользователями идет диалог. Далее к примеру, если пишет менеджер, то в таблицу менеджеры я записываю id диалога, который открыт, id менеджера, дату сообщения.

    Вопрос: К примеру если оба переписывались, можно ли потом сделать выборку из двух таблиц ( Сообщения Пользователя, Сообщения Клиента) по id диалога , сортировать ее по дате и вывести?
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Не надо плодить сущности. У тебя есть пользователи с разным набором прав. В данной задаче не суть как хранятся права. Ты проектируешь переписку, так? Ну так проектируй! ))) Как вариант:
    * Пользователь(ид, имя);
    * Диалог(ид, дата, заголовок_темы, ид_участника_инициатора, ид_участника_адресата, состояние);
    * Сообщение(ид, дата, ид_диалога, ид_автора_сообщения, текст_сообщения).

    Чего-то не хватает?

    Добавлено спустя 7 минут 12 секунд:
    P.S. Я для одной системы недавно писал "сообщения". Там непривелегированные пользователи могут обращаться просто в "службу поддержки", т.е. без указания получателя. Фактически в получатели проставляется предопределенный системный аккаунт. А модераторы имеют доступ к ящику этого аккаунта. И могут "забрать" тему к себе (то есть подставить себя в поле "адресат").
    Каждый модератор видит индикатор сколько сейчас неразобранных тем. Хозяин бизнеса может судить о продуктивности модераторов по тому, сколько тем они забирают.
    У темы может быть статус "закрыто". Удаляться переписки не должны ни при каких обстоятельствах!
     
  15. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Вот из твоей конструкции: вывести имя автора сообщения, если знаем из какой таблицы его брать легко.

    Я в моей не понятно как? Вот я и хочу чтобы подсказали.

    У меня как ты пишешь сделать нельзя. У одного менеджера есть клиенты и клиент принадлежит одному менеджеру. То есть нужно сделать так как я и написал. Пользователь не может писать в никуда. У него будет доступ по логину и паролю к этому чату с менеджером.

    Если делать одну таблицу с пользователями. Тогда я не понимаю: как назначить менеджеру клиентов и в будущем при добавлении нового клиента или менеджера это делать.

    Добавлено спустя 1 минуту 41 секунду:
    Мне нужно понять как вывести имя автора если оно может быть и из таблицы клиенты, и из таблицы менеджеры.

    А как я писал можно ли обьединить два запроса???
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    да, можно потрюкачить и выводить из разных таблиц. но это решение через Ж. я тебе тут не советчик.
     
  17. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Пишите в таблицу сообщений отправителя и адресата. Если диалог предполагает общение только с одним адресатом-менеджером то это поле не обязательно, однако, если, как вы указали, диалоги у вас физически удаляются из таблицы, то адресата в виде манагера указывать обязательно.

    Добавлено спустя 3 минуты 56 секунд:
    Заново написали LiveZillу
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    дык, даже не удивлюсь если что-то в чем-то повторил. )))
     
  19. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Всё из указанного она умеет по крайней мере а если взять версию чуть постарше ещё и бесплатно.

    Добавлено спустя 3 минуты 42 секунды:
    Назначение менеджеру клиентов ничего общего со структурами ответственными за модуль сообщений иметь не должно.
     
  20. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Просто мне тут написали использовать использовать одну таблицу, я написал что при такой структуре я не могу назначить клиента определенному менеджеру. С модулем сообщений это связано на прямую. Так как с одной таблицей вывести имя по id легко. Вот с двумя проблема.

    Добавлено спустя 1 минуту 47 секунд:
    Так я тоже думал, но получаеться двойная связь так как клиент может быть как отправителем и получателем.
     
  21. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    И что плохого в двойной связи в вашем конкретном случае? Даже не что плохого, а у вас связь адресата с отправителем идет через таблицу диалогов. Если у вас удаляется диалог то откуда вы знаете кому отправлено сообщение? Если вы не удаляете физически диалоги, а только меняете их статус, то это поле не нужно и достаточно иметь связь с диалогами в таблице сообщений
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    отсюда следует, что тебе нужна только такая структура, с которой возникает проблема )))

    чувак, представим, что в таблице Пользователи есть логическое поле Менеджер. у менеджеров оно == 1. можешь с этого момента считать, что у тебя "две таблицы", потому что когда понадобится ты сможешь наложить условие manager=1 или manager=0
    Код (Text):
    1. CREATE VIEW `managers` AS SELECT * FROM `users` WHERE `is_manager`=1;
    2. CREATE VIEW `clients`  AS SELECT * FROM `users` WHERE `is_manager`=0;
    и всё! остается беспроблемная структура.
    когда надо вывести имя, неважно менеджер это или клиент, это просто юзер:
    Код (Text):
    1. -- сообщения одной из тем
    2. SELECT p.`created_at`, u.`username`, p.`message`
    3. FROM
    4.   `posts` AS p INNER JOIN
    5.   `users` AS u ON u.`id`=p.`creator_id`
    6. WHERE p.`dialog_id`=2
    7. ORDER BY p.`created_at` ASC;
    и еще раз: операция назначение клиентов менеджеру к структуре диалогов отношения не имеет. просто поверь :)
    "назначения" повлияют на форму, на значение, подставляемое в поле "адресат". но не на структуру базы.

    всегда стремись к простоте и воздастся тебе!
     
  23. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Ну к примеру я записи удалять из таблицы Диалоги не буду, а только заведу атрибут статус. Тогда я вас не сильно понимаю.

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

    Получаеться, что только использовать двойную связь, хотя в универе на курсе БД нам ее не рекомендовали использовать, но тут без нее никак .[/quote]

    Добавлено спустя 2 минуты 43 секунды:
    Просто менеджер будут общаться в диалогах с ему назначенными клиентами, это требование.
     
  24. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    и?

    Добавлено спустя 2 минуты 37 секунд:
    у тебя как-то от "менеджеру будут назначены клиенты" происходит скачёк к "нужны проблемы в ссылках на пользователя". вот этот момент лично мне непонятен. где тут причино-следственные связи?
     
  25. RazerVG

    RazerVG Активный пользователь

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Не понял откуда ты это взял?


    Вот все, что нужно. Нужна помощь в проектирование БД для системы диалогов между клиентами и менеджерами. Суть такая VIP клиентам предприятия будут выдаваться Логин и Пароль для личного кабинета на сайте этого предприятия. В ЛК клиента будет пункт "Связь с менеджером", тут стоит сразу написать условие у каждого клиента есть свое менеджер, а у каждого менеджера есть свои клиенты. То есть при переходе в этот пункт меню клиент может писать закрепленному за ним менеджеру.

    Теперь опишу кабинет менеджера. Они будут также входить в свой личный кабинет, но при переходе по пункту меню сообщения у него будет выводиться список диалогов с клиентами( в диалоге может быть только один менеджер и клиент!!!) и по нажатию на один из них будут выводиться сообщения.

    Я попробовал по спроектировать, но не пойму какой лучший вариант. Опишу все варианты и их проблемы.

    1) Нашел данный вариант на форме. Сделать 3 таблицы: Менеджеры( id ), Клиенты( id ), Сообщение(id, id клиента, id менеджера). В данном варианте проблема следующая: не знаю как формировать список диалогов менеджеру.

    2) Использовать таблицу диалоги. То есть использовать 4 таблицы: Менеджеры( id ), Клиенты( id ), Диалоги(id, id клиента, id менеджера), Сообщение(id, id диалога, id отправителя). Тут проблема в том, что нужно вывести имя отправившего сообщение и проходиться совершать два запроса к разным таблицам, так как отправитель может быть и клиент, и менеджер.

    3) Также как и во втором, только использовать другую структуру таблицы Сообщение: Сообщение(id, id диалога, id отправителя, id получателя), но тут проблема увеличивается. К тому же здесь двойная связь.

    4) В ней сомневаюсь так как пришлось пойти на увеличение таблиц. Сделать 5 таблиц: Менеджеры( id ), Клиенты( id ), Диалоги(id, id клиента, id менеджера), Сообщения менеджера (id, id диалога, id менеджера, дата) и Сообщения клиента(id, id диалога, id клиента, дата). Тут смысл следующий после выбора диалога делать запрос в две таблицы и и сортировать по дате.

    Во всех вариантах имеются минусы не знаю какой выбрать.