Несколько получателей для сообщений (поле базы данных)

#mysql #database-design #multiple-instances

#mysql #база данных-дизайн #несколько экземпляров

Вопрос:

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

 CREATE TABLE IF NOT EXISTS `inbox` (
  `id` int(11) NOT NULL auto_increment,
  `id_usuario` int(11) NOT NULL,
  `id_to` int(11) NOT NULL,
  `mensaje` varchar(250) collate utf8_spanish_ci NOT NULL,
  `texto` text collate utf8_spanish_ci NOT NULL,
  `fecha` date NOT NULL,
  `visto` int(1) NOT NULL,
  `adjunto` int(1) NOT NULL,
  `item` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=1 ;
  

Для этого вопроса, я думаю, это актуально только:

  • id_usuario — уникальный идентификатор пользователя (отправителя)
  • id_to — уникальный идентификатор пользователя (получателя)
  • id — уникальный идентификатор сообщения

Мне интересно,

если я изменю тип ‘id_to’ с integer (только один идентификатор) на varchar, чтобы:

  • id_usuario — несколько уникальных идентификаторов, разделенных запятой от пользователей (получателей)

    и хранить несколько получателей, например (несколько идентификаторов): ‘333, 444, 555’

смогу ли я:

  • показывать каждому получателю сообщение?

Все еще выясняю запрос, будет ли это что-то вроде: "select * from inbox where sesionid IN (idto)" ??

  • показывать отправителю каждого получателя сообщения? Все еще выясняю запрос, будет ли это что-то вроде "select id_to from inbox where id = '254'" , а затем разнесется на ‘,’ ??

Или,

Должен ли я изменить свою схему?

Ответ №1:

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

При такой структуре вы можете запускать запросы с получателями, используя JOIN инструкции.

Ответ №2:

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

Я бы предложил создать таблицу под названием «MessageReceivers» или что-то в этом роде. Оно будет содержать MessageId и userId пользователя, получающего сообщение. Вы бы создали одну строку для каждого получателя.

Затем с помощью индексов вы можете быстро получить все сообщения для этого пользователя с помощью простого объединения.

Комментарии:

1. таким образом, я мог бы исключить id_usuarios и id_to из «входящих» и создать inbox_map(id, id_from, id_to, msgid) или как? Спасибо!