Не нашел подходящего раздела на форуме ( Проектирование БД), поэтому пишу сюда. Необходимо создать приложение для связи клиента и менеджера. То есть менеджер может общаться с несколькими клиентами, а клиент только с одним. Прочитал подобные темы на других форумах, там решают это проблему создавая две таблицы: Диалоги, Сообщения. Я решил тоже использовать эту схему. Получаеться я имею следующие таблицы: Клиенты, Менеджеры, Диалоги, Сообщения. Не буду расписывать все атрибуты напишу только важные. Таблица Клиенты: id клиента. Таблица Менеджеры: id менеджера. Таблица Диалоги: id диалога, id клиента, id менеджера. Таблица Сообщения: id сообщения, id отправителя, id диалога, текст, дата. Получаеться при удалении диалога менеджером, сообщения остаются и клиент их может читать. Вот тут и проблема, как сделать так чтобы при написании нового сообщения менеджер видел только его, а не старые.( то есть нужно как то раздвоить диалоги)
Новое сообщение не выводя старые. То есть у меня сообщения привязаны к диалогам по id диалога, но когда я удаляю диалог менеджером, то id диалога которого удалили тоже удаляется из таблицы сообщения, т. е. получаеться в таблице сообщения у нас будут сообщения в которых поле id диалога будет пустым. Но у клиента эти сообщения должны остаться. Как это сделать?
На самом деле там всё интереснее гораздо. Если конечное хранилище реляционная база данных, то таблицы с сообщениями у вас должны создаваться сами при заполнении N-ным количеством сообщений существующих, но не суть, не будем усложнять. Как правильно написали выше, в вашей структуре в таблице "Диалоги" у вас должен быть параметр "закрыт" или "удалён". Если происходит зачем-то реальное удаление записи из этой таблицы, то, соответственно, в связанной таблице сообщений у вас для каждой записи должен быть параметр "удалён диалог" (причем на это поле можете сразу вешать индекс), если при удалении связанной записи из таблицы Диалоги вы хотите сохранить сами сообщения и показывать их одним пользователям, скрывая от других.
Это я понял. А еще один вопрос. У меня сообщения привязаны к диалогам, а как мне связать таблицу сообщения и таблицы клиенты, таблицу менеджеры. Понятно что id отправителя я записывать значение из сессии. А как мне потом по этому id выводить имя???
Ну а ты смотрел вообще как люди делают? Связывают (join) таблицы по нужному id и тогда имя из связанной таблицы становится доступно.
y ну это понятно просто мне придется проверять две таблицы, так как отправитель может быть как клиентом так и менеджером будет большая нагрузка на сервак и это очень долго Добавлено спустя 40 минут 24 секунды: Если мы в сообщениях создадим отправитель и получатель, то получиться двойная связь, т.к. и клиент и менеджер могут быть и тем, и тем
То есть ты уже начал "оптимизировать хайлоад"? ))) Тогда избавься от двух таблиц про одно и то же: пусть будет только Пользователи.
Тогда подробнее опишу ситуацию. У меня есть несколько менеджеров. У каждого менеджера есть по несколько клиентов. То есть между таблицей менеджеры и клиенты связь один ко многим. Ее не как не убрать. Нужно создать систему диалогов по типу контакта( со стороны менеджера) и по типу чата с одним пользователем( со стороны клиента). Вот я еще придумал: К примеру если я создам две таблицы: Сообщения менеджеров и Сообщения клиентов. И их свяжу с таблицей диалоги по id диалогу. То есть буду к примеру в таблицу диалоги записывать между какими пользователями идет диалог. Далее к примеру, если пишет менеджер, то в таблицу менеджеры я записываю id диалога, который открыт, id менеджера, дату сообщения. Вопрос: К примеру если оба переписывались, можно ли потом сделать выборку из двух таблиц ( Сообщения Пользователя, Сообщения Клиента) по id диалога , сортировать ее по дате и вывести?
Не надо плодить сущности. У тебя есть пользователи с разным набором прав. В данной задаче не суть как хранятся права. Ты проектируешь переписку, так? Ну так проектируй! ))) Как вариант: * Пользователь(ид, имя); * Диалог(ид, дата, заголовок_темы, ид_участника_инициатора, ид_участника_адресата, состояние); * Сообщение(ид, дата, ид_диалога, ид_автора_сообщения, текст_сообщения). Чего-то не хватает? Добавлено спустя 7 минут 12 секунд: P.S. Я для одной системы недавно писал "сообщения". Там непривелегированные пользователи могут обращаться просто в "службу поддержки", т.е. без указания получателя. Фактически в получатели проставляется предопределенный системный аккаунт. А модераторы имеют доступ к ящику этого аккаунта. И могут "забрать" тему к себе (то есть подставить себя в поле "адресат"). Каждый модератор видит индикатор сколько сейчас неразобранных тем. Хозяин бизнеса может судить о продуктивности модераторов по тому, сколько тем они забирают. У темы может быть статус "закрыто". Удаляться переписки не должны ни при каких обстоятельствах!
Вот из твоей конструкции: вывести имя автора сообщения, если знаем из какой таблицы его брать легко. Я в моей не понятно как? Вот я и хочу чтобы подсказали. У меня как ты пишешь сделать нельзя. У одного менеджера есть клиенты и клиент принадлежит одному менеджеру. То есть нужно сделать так как я и написал. Пользователь не может писать в никуда. У него будет доступ по логину и паролю к этому чату с менеджером. Если делать одну таблицу с пользователями. Тогда я не понимаю: как назначить менеджеру клиентов и в будущем при добавлении нового клиента или менеджера это делать. Добавлено спустя 1 минуту 41 секунду: Мне нужно понять как вывести имя автора если оно может быть и из таблицы клиенты, и из таблицы менеджеры. А как я писал можно ли обьединить два запроса???
Пишите в таблицу сообщений отправителя и адресата. Если диалог предполагает общение только с одним адресатом-менеджером то это поле не обязательно, однако, если, как вы указали, диалоги у вас физически удаляются из таблицы, то адресата в виде манагера указывать обязательно. Добавлено спустя 3 минуты 56 секунд: Заново написали LiveZillу
Всё из указанного она умеет по крайней мере а если взять версию чуть постарше ещё и бесплатно. Добавлено спустя 3 минуты 42 секунды: Назначение менеджеру клиентов ничего общего со структурами ответственными за модуль сообщений иметь не должно.
Просто мне тут написали использовать использовать одну таблицу, я написал что при такой структуре я не могу назначить клиента определенному менеджеру. С модулем сообщений это связано на прямую. Так как с одной таблицей вывести имя по id легко. Вот с двумя проблема. Добавлено спустя 1 минуту 47 секунд: Так я тоже думал, но получаеться двойная связь так как клиент может быть как отправителем и получателем.
И что плохого в двойной связи в вашем конкретном случае? Даже не что плохого, а у вас связь адресата с отправителем идет через таблицу диалогов. Если у вас удаляется диалог то откуда вы знаете кому отправлено сообщение? Если вы не удаляете физически диалоги, а только меняете их статус, то это поле не нужно и достаточно иметь связь с диалогами в таблице сообщений
отсюда следует, что тебе нужна только такая структура, с которой возникает проблема ))) чувак, представим, что в таблице Пользователи есть логическое поле Менеджер. у менеджеров оно == 1. можешь с этого момента считать, что у тебя "две таблицы", потому что когда понадобится ты сможешь наложить условие manager=1 или manager=0 Код (Text): CREATE VIEW `managers` AS SELECT * FROM `users` WHERE `is_manager`=1; CREATE VIEW `clients` AS SELECT * FROM `users` WHERE `is_manager`=0; и всё! остается беспроблемная структура. когда надо вывести имя, неважно менеджер это или клиент, это просто юзер: Код (Text): -- сообщения одной из тем SELECT p.`created_at`, u.`username`, p.`message` FROM `posts` AS p INNER JOIN `users` AS u ON u.`id`=p.`creator_id` WHERE p.`dialog_id`=2 ORDER BY p.`created_at` ASC; и еще раз: операция назначение клиентов менеджеру к структуре диалогов отношения не имеет. просто поверь "назначения" повлияют на форму, на значение, подставляемое в поле "адресат". но не на структуру базы. всегда стремись к простоте и воздастся тебе!
Ну к примеру я записи удалять из таблицы Диалоги не буду, а только заведу атрибут статус. Тогда я вас не сильно понимаю. Если я удаляю поля с клиентом и менеджером из таблицы диалоги, то она мне вообще не нужна. То тогда встает вопрос, а как группировать диалоги. Получаеться, что только использовать двойную связь, хотя в универе на курсе БД нам ее не рекомендовали использовать, но тут без нее никак .[/quote] Добавлено спустя 2 минуты 43 секунды: Просто менеджер будут общаться в диалогах с ему назначенными клиентами, это требование.
и? Добавлено спустя 2 минуты 37 секунд: у тебя как-то от "менеджеру будут назначены клиенты" происходит скачёк к "нужны проблемы в ссылках на пользователя". вот этот момент лично мне непонятен. где тут причино-следственные связи?
Не понял откуда ты это взял? Вот все, что нужно. Нужна помощь в проектирование БД для системы диалогов между клиентами и менеджерами. Суть такая 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 клиента, дата). Тут смысл следующий после выбора диалога делать запрос в две таблицы и и сортировать по дате. Во всех вариантах имеются минусы не знаю какой выбрать.