Chcę utworzyć system wiadomości e-mail, taki jak Gmail. Chciałbym mieć następującą opcję: Starred, Trash, Spam, Draft, Read, Unread. Obecnie mam poniższą strukturę w mojej bazie danych:Projektowanie bazy danych dla systemu wiadomości e-mail
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]
Ale mam pewne problemy z powyższą strukturą. W tej chwili, jeśli użytkownik A wyśle misaż do użytkownika B, przechowuję wiersz w tej tabeli, ale jeśli użytkownik B usunie tę wiadomość, to zostanie ona również usunięta. To jest złe, chcę dokładnie tak, jak robi to normalny system wiadomości e-mail. Jeśli A usunie wiadomość z wysłanego przedmiotu, B nie powinno zostać usunięte ze swojej skrzynki odbiorczej. Zastanawiam się nad innym problemem, który przyjdzie, przypuśćmy, że użytkownik A wysłał pocztę do 500 użytkowników naraz, tak jak na mój projekt będę miał 500 wierszy z duplikatami ciał, tj. Nie jest to skuteczny sposób przechowywania pamięci. Czy moglibyście mi pomóc w zaprojektowaniu systemu komunikacyjnego?
Czy możesz opisać, skąd możemy wiedzieć w tym projekcie, że jest od użytkownika i do użytkownika, którego wiadomość jest wysyłana. – zarpio
@ zarpio the authorID w tabeli komunikatów jest identyfikatorem nadawcy. –
Jeśli nie masz klucza złożonego w tabeli Users_Messages_Mapped? – user3308043