Список диалогов sql запрос

289
18 апреля 2017, 10:27

Нужно составить список диалогов между пользователями наподобии вконтакте. Имеется две таблицы для сообщений в диалоге межу пользователем использую такой запрос "SELECT * FROM inbox WHERE user='$login' AND author='$sobesednik' UNION ALL SELECT * FROM outbox WHERE user='$sobesednik' AND author='$login' ORDER BY time" не будет ли конфликтов между таблицами? название полей в таблицах одинаковые если что можно переименовать название полей на inbox_user, inbox_author и outbox _user, outbox _author. Пока справляюсь только с простыми sql запросами... Заранее спасибо.

Answer 1

Вредные советы

Когда есть одинаковые данные, но их нужно показывать разным пользователям или разделить по уровням доступа - создавайте для каждого уровня доступа/пользователя таблицы и пишите данные туда. Сколько уровней доступа/пользователей - столько и таблиц! Все просто :)

...а потом мучайтесь с запросами и другими вопросами..А теперь по делу...

Введение в проблему

Думаете будут только конфликты? Оставьте такую архитектуру...немного подождите и будет нарушение согласованности данных, излишнее дублирование приводящее к неграмотному использованию дискового пространства, а также проблемы производительности и построения запросов.

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

В базах данных часто не используют для удаления данных метод прямого исключения записи из памяти, а просто ставят флаг, кому эта запись больше не видна и не может быть использована. Например, в вашем случае можно было бы создать таблицу dialog_deleted_messages с полями message_id и user_id которая определяет сообщения, которые не видны определенному пользователю.

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

Почитайте про нормализацию базы данных - это вам пригодится для дальнейшего проектирования баз данных.

Примерная архитектура БД для диалогов

  1. Таблица для хранения общей информации по диалогу.

    • id INT
    • name VARCHAR(50)
    • created TIMESTAMP
  2. Таблица для хранения сообщений диалога - здесь будут храниться все сообщения привязанные к диалогу.

    • id INT
    • dialog_id INT
    • text TEXT
    • created TIMESTAMP
  3. Таблица участников диалога

    • dialog_id INT
    • user_id INT
    • joined TIMESTAMP (указывает, когда участник присоединился к диалогу, чтобы не показывать сообщения, которые были до того, как он присоединился, возможно заменить данное поле на смещение по Id, чтобы это работало быстрее)
  4. Таблица скрытых (удаленных) сообщений

    • message_id INT
    • user_id INT
READ ALSO
Как заменить имя объекта в json-файле

Как заменить имя объекта в json-файле

Есть json-файл сохранённый в строке вида {"Org1":[{"a":1,"b":2},{

224
Как спарсить только определённый тег (с помощью simple html dom)?

Как спарсить только определённый тег (с помощью simple html dom)?

ПриветствуюИспользую Simple HTML DOM для парсинга товаров интернет-магазина

376
Php скрипт отправки сообщения mail()

Php скрипт отправки сообщения mail()

Добрый день, можете помочь объяснить, почему после отправки сообщения, сообщение приходит со сломанной кириллицей? Правильно ли написаны...

276
вставка массива в массив [требует правки]

вставка массива в массив [требует правки]

Нужно вставить в вектор векторов еще один вектор векторов после k-той строки, но компилятор выдаёт ошибкуВот код: https://hastebin

269