#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) или как? Спасибо!