2009-07-27 4 views
0

Angenommen, ich möchte, dass Benutzer eine oder mehrere Kontaktmethoden auswählen (E-Mail, Telefon, Fax, usw.). Und wenn sie sich für eine andere entscheiden, können sie eine eigene Kontaktmethode eingeben. Was ist der beste Weg, um dies in einer Datenbank zu speichern? Ich sehe drei Möglichkeiten:Die beste Methode zum Implementieren von Viele-zu-Viele-Nachschlagetabellen mit benutzerdefinierten Daten

  1. Verwenden Sie eine Spalte set datatype plus eine einzelne Spalte "other_contact" varchar, um den optionalen vom Benutzer eingegebenen Wert zu speichern.
  2. Verwenden Sie number-to-many und eine vom Benutzer eingegebene Spalte. Es gäbe also eine Benutzertabelle, eine contact_method -Tabelle und eine user_contact_method -Tabelle, die die beiden verbindet. Außerdem eine user.other_contact varchar-Spalte, um den optionalen vom Benutzer eingegebenen Wert zu speichern.
  3. Verwenden Sie einfach viele-zu-viele. Gleiches Setup wie 2, aber Benutzer können Einträge zur Tabelle contact_method hinzufügen. Aber das bedeutet, dass ich eine Spalte hinzufügen muss, um die "System" -Werte zu verfolgen (diese können nicht von Benutzern geändert oder gelöscht werden, und nur diese werden in einem Dropdown angezeigt). Außerdem muss ich zusätzliche Logik hinzufügen, damit ihre Benutzerwerte geändert werden können.

Alle Kommentare zu den oben genannten, oder gibt es eine bessere Lösung?

Antwort

0

Wenn Sie einen Benutzer und mehrere Kontaktmethodenmöglichkeiten haben, ist es höchstwahrscheinlich eine Eins-zu-viele-Beziehung. (Ich möchte vermeiden, many-to-many, wo immer Sie können, wegen der zusätzlichen Komplexität und die Verlangsamung solcher Modelle von Abfragen.)

users_table 
id INTEGER 
name VARCHAR 
etc. 

contacts_table 
user_id INTEGER -- foreign key on user.id 
contact_method ENUM('email', 'phone', 'mail', 'other') 
contact_address VARCHAR 
etc. 
+0

Ich sehe, wohin du gehst, und Ich mag die Komplexität einer Entfernung Viele-zu-viele-Lösung. Das einzige Problem ist, wenn ich eine andere Tabelle hatte, die auch Kontaktmethoden benötigt. Ich müsste für jeden eine ähnliche Tabelle erstellen, oder? –

+0

Sie könnten für jede Tabelle eine Tabelle erstellen, wenn Sie Hochleistungs-SELECT-Anweisungen und daher foreign_keys benötigen. Eine andere Lösung wäre, "user_id" in "foreign_id" umzubenennen und eine zusätzliche Spalte "table" hinzuzufügen. (Die zweite Lösung ist irgendwie polymorph objektorientiert.) Für einen Benutzer contacts_table-Eintrag würde die Foreign_id die [Benutzer-ID] speichern und im Feld "table" würden Sie die Zeichenfolge "users_table" haben. – Beffa