2016-08-14 14 views
5

Chcę utworzyć prostą aplikację do obsługi wiadomości, która przechowuje wiadomości (podobnie jak wiadomości e-mail, ale po prostu wiadomości). Jak powinienem zaprojektować bazę danych?Przechowywanie wiadomości e-mail w bazie danych SQL

Tabela Users:

  • Nazwa użytkownika (klucz podstawowy)
  • userPassword

Tabela E-mails:

  • EMAILID (klucz podstawowy)
  • Od (klucz obcy do użytkownik)
  • Aby
  • Właściciel (klucz obcy do użytkownika)
  • Temat
  • Czas
  • zawartość email
  • układ E-mail (ewentualnie zawartość i układ w jednym polu? XAML)

Od kiedy wiadomość e-mail może zostać wysłana do wielu osób, jaki byłby najlepszy sposób przechowywania kolumny? Czy powinienem po prostu umieścić go jako ciąg, oddzielony przecinkami, a następnie pobrać wszystkich użytkowników z funkcją w moim kodzie? Czy istnieje lepszy sposób na rozwiązanie tego problemu?

+0

Jeśli wszyscy odbiorcy znajdują się w modelu (więc wiadomość na zewnątrz), to powinniście zapisać je jako tabelę odniesienia, a nie w ogóle w tabeli komunikatów. W ten sposób obejmiesz przetwarzanie wpisu i wszystkie adresy będą zawsze aktualne. – arkascha

+3

A generalnie nie, aby upewnić się, że pamiętasz: Należy _never_ przechowywać hasło użytkownika w bazie danych. – arkascha

+0

@arkascha Mam do przechowywania hasła w bazie danych, jak hash niefortunnie. – user3117628

Odpowiedz

5

tabeli użytkowników

  • użytkownika (klucz podstawowy)

  • UserPassword

tabeli E-mail

  • EMAILID (klucz podstawowy)

  • Od (klucz obcy dla użytkownika)

  • tematu

  • Czas

  • zawartość email

  • układ E-mail (ewentualnie zawartość i układ w jednym polu?XAML)

Email_Recipients Tabela

  • Odbiorca ID (Primary Key)

  • RecipientUserID (Klucz obcy z tabeli użytkownika)

  • EMAILID (Klucz obcy z poczty elektronicznej Tabela)

  • RecipientType // typy mogą być rzeczywista, CC, BCC

Kolejna tabela może być stworzony od EmailRecipientTypes

Jak EmailRecipientTypes Stołowych

  • TypeID (klucz podstawowy)
  • NazwaPunktu // może być rzeczywistą, CC lub BCC

W ten sposób można zmodyfikować Email_Recipients tabelę jako

Email_Recipients Stołowych

  • Odbiorca ID (Primary Key)
  • RecipientUserID (Klucz obcy z tabeli użytkownika)
  • EmailID (klucz obcy z tabeli e-mail)
  • RecipientTypeID (klucz obcy fr Tabela OM EmailRecipientTypes)

Chociaż czwarta tabela będzie zawierać tylko 3 rekordy ale pomoże w zmniejszeniu w replikacji danych i pomogą w grupowanie maili w pewnym wymaganym sposób, który chcesz (jest to być może)

+0

Dziękuję, świetna odpowiedź! – user3117628

+0

Serdecznie zapraszamy :) Z przyjemnością pomożemy :) –

6

Użytkownicy Tabela

  • userid
  • Nazwa użytkownika
  • Hasło

Emaile Tabela

  • EMAILID
  • Od (klucz obcy do Userid)
  • Właściciel (klucz obcy do UserId)
  • Temat
  • EmailContent
  • EmailLayout
  • Czas

Odbiorcy Tabela

  • Id
  • Email (Klucz obcy do EmailId)
  • Do (klucz obcy do UserId)

Więc odbiorców wiadomości e-mail są związane z pocztą elektroniczną, jak wiele do jednego mapowania.

W ten sposób można wybrać wszystkie odbiorców wiadomości e-mail, wybierając wszystkie wiersze w tabeli Recipients z odpowiednim EmailId

Na przykład e-mail wysłany do 2 użytkowników będą miały wiersze (jako przykład)

--------------------------- 
| Id | Email | To  | 
--------------------------- 
| 1 | 1  | 3 (User1) | 
--------------------------- 
| 2 | 1  | 4 (User2) | 

Is storing a delimited list in a database column really that bad? Dobrze podaje, dlaczego używanie wartości rozdzielonych przecinkami w tabeli bazy danych jest złą praktyką.

Powiązane problemy