Conception de la base de données pour le système de messagerie électronique

je veux faire un système de messagerie électronique comme gmail ont. Je voudrais avoir l'option suivante: Starred, Trash, Spam, Draft, Read, Unread. En ce moment, j'ai la structure suivante dans ma base de données:

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]

mais je suis confronté à certains problèmes avec la structure ci-dessus. À l'heure actuelle, si un utilisateur A envoie un msessage à l'utilisateur B, je stocke une ligne dans cette table, mais si l'utilisateur B supprime ce message, il est supprimé. C'est faux, je veux exactement comme le système normal de messagerie e-mail le fait. Si un message de suppression de son élément envoyé alors B ne doit pas être supprimé de sa boîte de réception. Je pense sur un autre problème ici qui viendra supposons un utilisateur a envoyé un courrier à 500 utilisateurs à la fois de sorte que selon mon design j'aurai 500 lignes avec des corps dupliqués I. e n'est pas un moyen efficace de conserver la mémoire. Pourriez-vous les gars merci de m'aider dans makeing la conception d'un système de messagerie ?

20
demandé sur AsifQadri 2010-07-30 14:33:33

8 réponses

vous devez partager votre table pour cela. Vous pouvez avoir le schéma et la structure suivants

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 

    )

dans la table users vous pouvez avoir des utilisateurs."Messages" indique le tableau des messages. "MessagePlaceHolders" indique la table pour les placeholders pour les messages. Les espaces réservés peuvent être inbox, sent item, draft, spam ou trash. "Users_Messages_Mapped" indique la table de correspondance pour les utilisateurs et les messages. Les" UserID "et" PlaceHolderID " sont les clés étrangères."IsRead" et "IsStarred" signifie leur nom est synonyme de. S'il n'y a pas d'enregistrement trouvé pour un messageid particulier dans la table "Users_Messages_Mapped", cet enregistrement sera supprimé de la table Messages puisque nous n'en avons plus besoin.

31
répondu Raghav 2018-09-04 15:17:50

je pense que vous avez besoin de décomposer votre schéma un peu plus. Stockez les e-mails séparément, et faites la correspondance entre les boîtes de réception et les messages qu'ils contiennent.

4
répondu PaulJWilliams 2010-07-30 10:38:57

si vous faites du travail axé sur les documents, je vous suggère de jeter un coup d'oeil à CouchDB. C'est sans schéma, ce qui signifie que des problèmes comme celui-ci disparaissent.

prenons un coup d'oeil à l'exemple: a envoie Un message à B, et il est supprimé par B.

vous auriez une seule instance du document, avec recipients inscrit comme attribut du courriel. Comme les utilisateurs suppriment des messages, vous les supprimez de la liste des destinataires ou les ajoutez à une liste de deleted_by ou peu importe ce que vous choisir.

il s'agit d'une approche très différente de ce à quoi vous êtes habitué, mais peut être très bénéfique de prendre un certain temps à considérer.

4
répondu Tim McNamara 2010-07-30 11:21:02

si j'étais vous, je mettrais deux drapeaux l'un pour l'expéditeur et l'autre pour le destinataire.si les deux drapeaux sont vrais, alors le message devrait être supprimé de la base de données, sinon gardez-le dans la base de données, mais cachez-le à qui l'a supprimé.

faites la même chose pour les ordures. Vous pouvez lancer cron ou vérifier manuellement si l'expéditeur et le destinataire suppriment le message puis le suppriment de la base de données.

2
répondu Maximus 2010-07-30 11:21:04

vous pouvez créer une table pour MessageContacts qui relie chaque message aux personnes qui l'ont dans leurs boîtes aux lettres. Lorsqu'un utilisateur supprime un message, Une ligne est supprimée de MessageContacts, mais le message original est préservé.

Vous pourriez le faire... mais je vous conseille de ne pas le faire. Sauf s'il s'agit d'un exercice académique mis en place par votre tuteur, il est sûrement une perte de temps complète pour développer votre propre système de messagerie. S'il s'agit de devoirs, vous devez le dire. Si non, alors allez faire quelque chose de plus utile à la place.

1
répondu sqlvogel 2010-07-30 12:13:17

un message ne peut être que dans un dossier à la fois, donc vous voulez une table de dossiers (contenant les dossiers 'Trash', 'Inbox', 'Archive', etc.) et une clé étrangère des messages aux dossiers. Pour les étiquettes, vous avez une relation many-to-many, donc vous avez besoin d'une table labels et aussi d'une table link (messages_labels). Pour la mise en vedette, une simple colonne bit devrait faire, même pour "unread".

0
répondu tdammers 2010-07-30 10:41:42

POURQUOI SUPPRIMER? Je pense qu'il n'est pas nécessaire d'effacer quoi que ce soit. Il suffit de le cacher, aux utilisateurs une fois supprimé. Parce que, il sera difficile de vérifier les deux côtés, lorsque l'expéditeur envoyer le même message à de nombreux destinataires. Ensuite, vous devez vérifier et signaler tous les destinataires. Si tout est OK, puis sur supprimer... Je pense qu'il n'est pas nécessaire d'effacer quoi que ce soit.

0
répondu Elvin Nagiyev 2012-03-13 11:03:56
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`)  
)

Vous pouvez utiliser cette table pour stocker les mails et manipuler les requêtes selon les boîtes aux lettres. J'évite le reste des tableaux comme les détails utilisateur et les détails de connexion. Vous pouvez les faire selon vos besoins.

0
répondu Gaurav Singhal 2014-07-06 17:51:10