Вопрос схемы почты / сообщений - PullRequest
2 голосов
/ 10 января 2011

Я создаю модуль связи с электронной почтой и обменом сообщениями на месте.4 вопроса:

1) При хранении сообщений он может принадлежать папкам (спам, корзина, входящие, исходящие и т. Д.).Являются ли эти отдельные таблицы или 1 таблица всего лишь столбцом для «папки», от FK до «таблицы поиска папок»?

2) Как и в Hotmail, пользователь может создать x количество пользовательских папок, как это представить в модели данных?Я могу сказать inbox = id 1, outbox = id 2 и т. Д., Но для пользовательских папок, таких как «электронная почта для отпуска», «рабочая электронная почта» и т. Д., Я не уверен, как показать это в модели данных, если сообщение находится в этой папке,

3) Одно письмо отправляется нескольким людям.Означает ли это, что мне нужно, чтобы на каждого пользователя отправлялась 1 строка?

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

Ответы [ 2 ]

8 голосов
/ 10 января 2011

1 & 2: Папки должны быть сущностью, отношение MessageFolder один ко многим с Message

3: объект MessageUser с идентификатором пользователя, идентификатором сообщения, типом (отправитель, получатель)

4: отдельная таблица для вложений (MessageAttachments).

Email message schema

CREATE TABLE `message`
  (
     `id`       INTEGER NOT NULL AUTO_INCREMENT,
     `author`   INTEGER NOT NULL,
     `contents` TEXT NOT NULL,
     `subject`  TEXT NOT NULL,
     PRIMARY KEY (`id`)
  );

CREATE TABLE `messagefolder`
  (
     `id`         INTEGER NOT NULL AUTO_INCREMENT,
     `id_message` INTEGER NOT NULL,
     `id_folder`  INTEGER NOT NULL,
     PRIMARY KEY (`id`)
  );

CREATE TABLE `folder`
  (
     `id`   INTEGER NOT NULL AUTO_INCREMENT,
     `name` VARCHAR(200) NOT NULL,
     PRIMARY KEY (`id`)
  );

CREATE TABLE `messageattachment`
  (
     `id`         INTEGER NOT NULL AUTO_INCREMENT,
     `fk_message` INTEGER NOT NULL,
     PRIMARY KEY (`id`)
  );

CREATE TABLE `user`
  (
     `id` INTEGER NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`id`)
  );

CREATE TABLE `messageuser`
  (
     `id`         INTEGER NOT NULL AUTO_INCREMENT,
     `fk_message` INTEGER NOT NULL,
     `type`       INTEGER NOT NULL,
     PRIMARY KEY (`id`)
  );;

ALTER TABLE `message` ADD FOREIGN KEY (author) REFERENCES `user` (`id`);
ALTER TABLE `messagefolder` ADD FOREIGN KEY (id_message) REFERENCES `message` (`id`);
ALTER TABLE `messagefolder` ADD FOREIGN KEY (id_folder) REFERENCES `folder` (`id`);
ALTER TABLE `messageattachment` ADD FOREIGN KEY (fk_message) REFERENCES `message` (`id`);
ALTER TABLE `messageuser` ADD FOREIGN KEY (fk_message) REFERENCES `message` (`id`); 
1 голос
/ 10 января 2011

1) При хранении сообщений оно может принадлежать папкам (спам, корзина, Входящие, Исходящие и т. д.). Это отдельные таблицы или 1 таблица с столбец для "папки", которая является FK для "таблицы поиска папок"?

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

2) Как и в Hotmail, пользователь может создать x количество пользовательских папок, чтобы как представить это в модели данных? Я могу сказать, входящие = id 1, outbox = id 2 и т. д., но для пользовательских папок, таких как "электронная почта для отдыха", я не уверен, как показать это в модели данных, если сообщение находится в этой папке.

Стандартные папки могут быть такими, как вы сказали ..., отправлено = id 3, спам = id 4, trash = id 5. После этого любая пользовательская папка будет иметь: отпускная почта = идентификатор 6 и т. Д.

Нет необходимости вносить какие-либо изменения в модель данных.

3) Одно письмо отправляется нескольким людям. Означает ли это, что мне нужно иметь 1 строка на пользователя отправлена?

Одно письмо, много получателей. Так что, да, если у вас есть таблица для отношений получателей электронной почты.

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

Да, как и ответ 3. (одно электронное письмо, много вложений).

Если, однако, вложение может быть во многих электронных письмах (например, если вы пересылаете электронное письмо и вложение), и вы хотите, чтобы в вашей модели это соотношение было много-ко-многим.

...