2010-11-23 2 views
1

Я ищу лучшее решение для реализации обмена сообщениями с несколькими пользователями в системе (в стиле Facebook).Схема базы данных для обмена сообщениями нескольким пользователям

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

Может ли кто-нибудь предложить любое другое решение текущей проблемы? Или объясните, почему мое решение будет в порядке?

CREATE TABLE `message` (
    `msg_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `msg_text` TEXT NOT NULL , 
    `msg_date` DATETIME NOT NULL , 
    PRIMARY KEY (`msg_id`)); 

CREATE TABLE `message_chain` (
    `msgc_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `msgc_topic` VARCHAR(255) NULL , 
    PRIMARY KEY (`msgc_id`)); 

CREATE TABLE `message_status` (
    `msgsta_msg_id` BIGINT UNSIGNED NOT NULL , 
    `msgsta_usr_id` INT UNSIGNED NOT NULL , 
    `msgsta_msgc_id` INT UNSIGNED NOT NULL , 
    `msgsta_is_sender` TINYINT(1) NULL , 
    `msgsta_is_read` TINYINT(1) NULL DEFAULT NULL , 
    `msgsta_is_deleted` TINYINT(1) NULL , 
    PRIMARY KEY (`msgsta_msg_id`, `msgsta_usr_id`); 
+3

«Но я боюсь, что эта схема не очень эффективно использовать, когда есть миллионы сообщений в системе.» .. Я думаю, что вы должны сначала достичь этого предела, прежде чем слишком беспокоиться о некоторых деталях, преждевременная оптимизация - это корень всех зол :) – Jack 2010-11-23 13:59:25

+2

Не согласен :) Зрелая планировка = нет головной боли в будущем – Websirnik 2010-11-23 14:18:21

ответ

0

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

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

0

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

Например, если вы хотите отправить сообщение всем пользователям системы, вы размещаете «» в usr_id колонке, а затем programmmatically вы могли бы извлечь все сообщения, где usr_id = current_usr_id OR '. Затем вы можете сделать множество фильтров и создать свой собственный синтаксис для создания списков messager_user без хранения базы данных.

Похоже, компромисс между обработкой/хранением ...

Смежные вопросы