Подтвердить что ты не робот

Разработка базы данных для системы обмена сообщениями электронной почты

Я хочу создать почтовую систему обмена сообщениями, такую ​​как gmail. Я хотел бы иметь следующий вариант: помеченные, корзины, спам, черновик, чтение, непрочитанные. Сейчас у меня есть следующая структура в моей базе данных:

CREATE TABLE [MyInbox](
    [InboxID] [int] IDENTITY(1,1) NOT NULL,
    [FromUserID] [int] NOT NULL,
    [ToUserID] [int] NOT NULL,
    [Created] [datetime] NOT NULL,
    [Subject] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Body] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [IsRead] [bit] NOT NULL,
    [IsReceived] [bit] NOT NULL,
    [IsSent] [bit] NOT NULL,
    [IsStar] [bit] NOT NULL CONSTRAINT [DF_MyInbox_IsStarred]  DEFAULT ((0)),
    [IsTrash] [bit] NOT NULL CONSTRAINT [DF_MyInbox_IsTrashed]  DEFAULT ((0)),
    [IsDraft] [bit] NOT NULL CONSTRAINT [DF_MyInbox_Isdrafted]  DEFAULT ((0))
) ON [PRIMARY]

Но я столкнулся с некоторыми проблемами с вышеуказанной структурой. Прямо сейчас, если пользователь A отправляет сообщение пользователю B, я сохраняю строку в этой таблице. Но если пользователь B удаляет это сообщение, он удаляется. Frm user. Отправленное сообщение тоже. Это неправильно, я хочу, чтобы это нормально, как обычная система обмена сообщениями электронной почты. Если A удаляет сообщение из отправленного объекта, B не следует удалять из своего почтового ящика. Я думаю о другой проблеме здесь, которая придет, предположим, что пользователь A отправил почту 500 пользователям одновременно, так как в моем дизайне у меня будет 500 строк с дублирующими телами, а не как эффективный способ хранения памяти. Могли бы вы, ребята, помочь мне в разработке дизайна системы обмена сообщениями?

4b9b3361

Ответ 1

Вам нужно разбить на стол таблицу. Вы можете иметь следующую схему и структуру

CREATE TABLE [Users]
    (
      [UserID] INT ,
      [UserName] NVARCHAR(50) ,
      [FirstName] NVARCHAR(50) ,
      [LastName] NVARCHAR(50)
    )

CREATE TABLE [Messages]
    (
      [MessageID] INT ,
      [Subject] NVARCHAR(MAX) ,
      [Body] NVARCHAR(MAX) ,
      [Date] DATETIME,
      [AuthorID] INT,
    )

CREATE TABLE [MessagePlaceHolders]
    (
      [PlaceHolderID] INT ,
      [PlaceHolder] NVARCHAR(255)--For example: InBox, SentItems, Draft, Trash, Spam 
    )

CREATE TABLE [Users_Messages_Mapped]
    (
      [MessageID] INT ,
      [UserID] INT ,
      [PlaceHolderID] INT,
      [IsRead] BIT ,
      [IsStarred] BIT 

    )

Диаграмма базы данных: alt text http://codeasp.net/Assets/Uploaded-CMS-Files/13f15882-7ed9-4e22-8e2c-20c6527522317-31-2010%2012-51-50%20AM.png

В таблице пользователей вы можете иметь пользователей. "Сообщения" обозначает таблицу для сообщений. "MessagePlaceHolders" обозначает таблицу для заполнителей для сообщений. Заполнители могут быть в папке "Входящие", отправленном элементе, черновике, спаме или корзине. "Users_Messages_Mapped" обозначает таблицу сопоставления для пользователей и сообщений. "UserID" и "PlaceHolderID" - это внешние ключи. "IsRead" и "IsStarred" означает, что означает их имя. Если в таблице "Users_Messages_Mapped" нет записи, найденной для определенного messageid, запись будет удалена из таблицы "Сообщения", поскольку она больше не нужна.

Ответ 2

Если вы работаете с документами, я предлагаю взглянуть на CouchDB. Это схема без ограничений, что означает, что такие проблемы исчезают.

Посмотрим на пример: A отправляет сообщение в B и удаляется B.

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

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

Ответ 3

Я думаю, вам нужно еще раз разложить схему. Храните электронные письма отдельно и сопоставляйте входящие сообщения с сообщениями, которые они содержат.

Ответ 4

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

Сделайте то же самое для мусора. Вы можете запустить cron или проверить вручную, если оба отправителя и получателя удаляют сообщение, а затем удаляют его из базы данных.

Ответ 5

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

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

Ответ 6

CREATE TABLE `mails` (  
  `message_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  `message` varchar(10000) NOT NULL DEFAULT '',  
  `file` longblob,  
  `mailingdate` varchar(40) DEFAULT NULL,  
  `starred_status` int(10) unsigned NOT NULL DEFAULT '0',  
  `sender_email` varchar(200) NOT NULL DEFAULT '',  
  `reciever_email` varchar(200) NOT NULL DEFAULT '',  
  `inbox_status` int(10) unsigned NOT NULL DEFAULT '0',   
  `sent_status` int(10) unsigned NOT NULL DEFAULT '0',  
  `draft_status` int(10) unsigned NOT NULL DEFAULT '0',  
  `trash_status` int(10) unsigned NOT NULL DEFAULT '0',  
  `subject` varchar(200) DEFAULT NULL,  
  `read_status` int(10) unsigned NOT NULL DEFAULT '0',  
  `delete_status` int(10) unsigned NOT NULL DEFAULT '0',  
  PRIMARY KEY (`message_id`)  
)

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

Ответ 7

Сообщение может быть только в одной папке за раз, поэтому вам нужна таблица папок (содержащая папки "Корзина", "Входящие", "Архив" и т.д.) и внешний ключ из сообщений в папки. Для ярлыков у вас есть отношение "многие ко многим", поэтому вам нужна таблица ярлыков, а также таблица ссылок (messages_labels). Для главной роли должен использоваться простой бит-столбец, то же самое для "непрочитанных".

Ответ 8

ПОЧЕМУ УДАЛИТЬ? Я думаю, что нет необходимости ничего удалять. Просто скройте его, от пользователей при удалении. Потому что это будет проблемой для проверки обеих сторон, когда отправитель отправляет одно сообщение многим получателям. Затем вы должны проверить и отметить всех получателей. Если все ОК, то удалите... Я думаю, что нет необходимости ничего удалять.