Conception de base de données pour e-mail système de messagerie
Je veux faire un e-mail système de messagerie comme gmail ont. Je voudrais avoir l'option suivante: Étoilé, de déchets, de Spam, Projet de, lu, non Lu. Droit maintenant, j'ai le dessous de 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é à quelques problèmes avec la structure ci-dessus. Pour l'instant, si un utilisateur a envoie Un msessage à l'utilisateur B je suis le stockage d'une ligne dans cette table, Mais si l'utilisateur B supprime le message, il est supprimé frm de l'utilisateur Un message envoyé trop. C'est faux, je veux exactement comme normale, e-mail système de messagerie ne. Si supprime Un message à partir de son élément envoyé alors B ne doivent pas être supprimés à partir de sa boîte de réception. Je pense sur d'autres problème ici qui viendra supposons qu'un utilisateur A envoyé un mail à 500 utilisateurs à la fois si comme pour mon design, j'aurai 500 lignes en double dans des organismes de je.e pas une mémoire efficace moyen de stocker de. Pourriez-vous les gars merci de m'aider dans makeing la conception d'un système de messagerie ?
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de partager votre table pour elle. Vous pourriez avoir à la suite de schéma et la structure
Dans la table des utilisateurs, vous pouvez avoir des utilisateurs."Les Messages" désigne la table pour les messages. "MessagePlaceHolders" désigne la table pour les espaces réservés pour les messages. Des espaces réservés peuvent être de la boîte de réception, envoyés élément, le projet, de spam ou de la corbeille. "Users_Messages_Mapped" désigne la table de correspondance pour les utilisateurs et les messages. Le "nom d'utilisateur" et "PlaceHolderID" sont les clés étrangères."IsRead" et "IsStarred" signifie que leur nom est synonyme de.
Si il n'y a aucun dossier trouvé pour un particulier messageid dans "Users_Messages_Mapped" table que l'enregistrement sera supprimé de la table des Messages depuis nous n'avons plus besoin d'elle.
[AuthorID]
est l'Envoyé de l'utilisateur, et[UserID]
est le récepteur.Je pense que vous avez besoin de décomposer votre schéma un peu plus. Stocker les e-mails séparément, et la carte des boîtes de réception pour les messages qu'ils contiennent.
Si vous faites un document orienté sur le travail, je suggère de prendre un coup d'oeil à CouchDB. C'est le schéma, le sens les questions de ce genre disparaissent.
Prenons un coup d'oeil à l'exemple: a envoie Un message à B, et il est supprimé par B.
Vous avez une seule instance de document avec
recipients
répertorié comme un attribut de l'e-mail. Comme les utilisateurs de supprimer des messages, vous pouvez soit supprimer de la liste des destinataires ou les ajouter à une liste dedeleted_by
ou ce que vous choisissez.C'est une approche très différente de données que ce que vous êtes habitué, mais peut être très bénéfique à prendre le temps de considérer.
Si j'étais vous, je mettrais deux drapeaux de l'un pour l'émetteur et un autre pour le récepteur si les deux drapeaux sont vrai, alors le message doit être supprimé de la base de données ne gardez que dans la base de données, mais de le cacher de la personne qui l'a supprimé.
Faire la même chose pour les poubelles. Vous pouvez exécuter cron ou de vérifier manuellement si l'expéditeur et le récepteur supprimer le message, puis le retirer de la base de données.
Vous pouvez créer une table pour MessageContacts qui relie chaque message aux gens qui l'ont dans leurs boîtes aux lettres. Lorsqu'un utilisateur supprime un message, puis une ligne est supprimée de MessageContacts mais le message d'origine est conservé.
Vous pourriez le faire... mais je vous suggère de ne pas. Sauf si c'est un exercice académique définie par votre tuteur, alors il est sûrement une complète perte de temps pour développer votre propre système de messagerie. Si c'est devoirs, puis vous devez le dire. Si non, alors allez faire quelque chose de plus utile à la place.
Vous pouvez utiliser ce tableau pour stocker les e-mails et de manipuler les requêtes sur la base de boîtes aux lettres. Je suis évitant reste de la tables comme des détails de l'utilisateur et les détails de connexion de la table. Vous pouvez les faire en fonction de votre besoin.
Un message peut seulement être dans un dossier à la fois, si vous voulez une table de dossiers (dossiers contenant 'Corbeille', 'Inbox', 'Archive', etc.) et une clé étrangère de messages dans des dossiers.
Pour les étiquettes, vous avez une plusieurs-à-plusieurs, de relation, de sorte que vous besoin d'une des étiquettes de table et aussi une table de liaison (messages_labels).
Pour l'acteur, un peu simple colonne devrait le faire, même pour les "non lus'.
POURQUOI LES SUPPRIMER? Je pense qu'il n'est pas nécessaire de supprimer quoi que ce soit. Que de les masquer, à partir des utilisateurs quand il est supprimé. Car, il va de problème pour vérifier les deux côtés, lors de l'expéditeur d'envoyer un même message à plusieurs destinataires. Ensuite, vous devez vérifier et le drapeau de tous les destinataires. Si tout est OK, puis de les supprimer...
Je pense qu'il n'est pas nécessaire de supprimer quoi que ce soit.