Conception de base de données de message privé
Bien, donc je pense que je suis assez proche pour avoir ce dont j'ai besoin, mais je n'en suis pas sûr au sujet d'un couple de choses:
TABLE messages
message_id
message_type
sender_id
timestamp
TABLE message_type
message_type_code (1, 2, 3)
name (global, company, personal)
TABLE message_to_user
message_id
receiver_id
status (read/unread)
Objectifs:
- Être en mesure d'envoyer des messages GLOBAUX pour tous les utilisateurs.
- Envoyer des messages PERSONNELS entre 1 ou plusieurs utilisateurs.
- De déterminer si l'un de ces messages ont été lus ou non par le récepteur.
Questions:
- Mon schéma de prendre soin de tout ce qu'il doit?
- Ce qui serait un exemple de requête SQL ressemble à remplir quelqu'un à la boîte de réception, amenant des messages GLOBAUX ainsi que des messages PERSONNELS, je voudrais être en mesure de déterminer qui est qui pour l'INTERFACE utilisateur.
Et s'il vous plaît n'hésitez pas à ajouter à mon schéma si vous vous sentez qu'il serait bénéfique.
source d'informationauteur dcolumbus
Vous devez vous connecter pour publier un commentaire.
Schéma dirait qu'il va travailler. Doit probablement avoir une date de création. Il n'y a aucun moyen de savoir si vous avez lu un message global, mais sans créer des entrées pour tout le monde.
Voici quelques SQL:
[MODIFIER]
Problème: Tous les utilisateurs ont besoin d'avoir leur propre état "lu" global e-mails. Vous avez sans doute aussi leur donner la possibilité de "supprimer"/masquer cette adresse e-mail et ils n'ont pas à le regarder tout le temps. Il n'y a pas moyen de contourner cela sans créer une ligne pour chaque e-mail que il va sortir, ce qui est probablement la taxation à faire que de nombreux INSÈRE tout à la fois...ou mieux encore, ne pas créer un statut jusqu'à ce qu'il est lu. De cette façon, les INSERTS global e-mails ne se fera que lorsque le message est lu.
[MODIFIER]
Si l'utilisation de message_type comme une table DB ou tout simplement comme des paramètres à l'intérieur de votre code est en partie une question de préférence personnelle et en partie à vos besoins. Si vous avez besoin d'interroger la base de données et voir le texte "personnels" et "global" directement à partir de votre requête, alors vous voulez utiliser la message_type table. Toutefois, si vous avez seulement besoin de "type" pour gérer votre entreprise logique, mais n'avez pas besoin de le voir dans les résultats de la requête, puis j'irais avec un "Enum" approche de style. Les énumérations sont un C# chose...en PHP, le plus proche que vous avez est une classe avec des constantes...quelque chose comme:
Donc, votre question pourrait être:
WHERE ... message_type=".MessageTypes::Global."...
Une méthode peut être de séparer les messages globaux de l', les messages personnels que je pense que vous avez essayé de le faire déjà.
Pour obtenir un statut de lecture pour un message global, vous devez ajouter une table avec une clé composite contenant le global_message_id et user_id ensemble.
Sinon fusionner les
messages_tbl
etglobal_message_tbl
de sorte qu'ils chaque utilisateur est envoyé un message global personnellement dans une boucle. Cela réduit votre schéma à droite vers le bas à une seule table.Si vous souhaitez avoir la possibilité de normaliser votre table un peu mieux, et de le rendre plus facile d'ajouter des types de message dans le futur, déplacer message_type son propre table à nouveau, et de faire
message_type
un FK de lamessage_type_id
Mise À Jour De L'Échantillon Le Tableau (Tableau 1)
message_tbl
user_tbl
Le ci-dessus suppose que les utilisateurs de 2, 3 et 4 sont en général les utilisateurs qui envoient des messages les uns aux autres, l'utilisateur 1 est le compte admin qui sera utilisé pour envoyer des messages globaux (livré directement à chaque utilisateur individuellement) vous permettant de voir les mêmes informations que s'il s'agissait d'un message personnel.
Pour envoyer un message global dans ce format, vous serait tout simplement une boucle sur la table des utilisateurs pour obtenir tous les ID que vous souhaitez envoyer le message global, puis il suffit de
INSERT
les lignes pour chaque utilisateur dans lemessages_tbl
.Si vous n'avez pas anticiper vos utilisateurs d'envoyer des millions de messages par jour ainsi que régulièrement des messages globaux à des millions d'utilisateurs, puis le nombre de lignes ne devrait pas être un problème. Vous pouvez toujours purge des anciens de lire les messages des utilisateurs par la création d'un script de nettoyage.