2009-07-27 5 views
0

Dites que je souhaite que les utilisateurs choisissent une ou plusieurs méthodes de contact (email, téléphone, fax, autre, etc.). Et s'ils en choisissent d'autres, ils peuvent entrer une méthode de contact unique. Quelle est la meilleure façon de stocker cela dans une base de données? Je vois trois possibilités:Meilleure façon d'implémenter une table de correspondance plusieurs-à-plusieurs avec des données entrées par l'utilisateur

  1. Utilisez une colonne de type de données set, plus une seule colonne varchar "other_contact" pour stocker la valeur facultative entrée par l'utilisateur.
  2. Utilisez plusieurs-à-plusieurs et une colonne entrée par l'utilisateur. Il y aurait donc une table utilisateur, une table contact_method et une table user_contact_method connectant les deux. Plus une colonne user.other_contact varchar pour stocker la valeur facultative entrée par l'utilisateur.
  3. Utilisez simplement plusieurs-à-plusieurs. Même configuration que 2, mais laissez les utilisateurs ajouter des entrées à la table contact_method. Mais cela signifie que je devrai ajouter une colonne pour garder une trace des valeurs "système" (celles-ci ne peuvent pas être changées ou supprimées par les utilisateurs, et seulement celles-ci apparaissent dans une liste déroulante). De plus, je devrai ajouter une logique supplémentaire pour permettre à leurs valeurs entrées par l'utilisateur d'être modifiées.

Aucun commentaire sur ce qui précède, ou y a-t-il une meilleure solution?

Répondre

0

Si vous avez un utilisateur et plusieurs possibilités de méthode de contact, il s'agit probablement d'une relation un-à-plusieurs. (Je voudrais éviter beaucoup à beaucoup où vous pouvez, en raison de la complexité et le ralentissement de l'interrogation de ces modèles.)

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

Je vois où vous allez, et j'aime enlever la complexité d'un solution plusieurs-à-plusieurs. Le seul problème est si j'avais une autre table qui a aussi besoin de méthodes de contact. Je devrais créer une table similaire pour chacun, non? –

+0

vous pouvez créer une table pour chacun, si vous avez besoin de sélections select hautes performances et donc de foreign_keys. Une autre solution serait de renommer "user_id" en "foreign_id" et d'ajouter une colonne supplémentaire "table". (La deuxième solution est en quelque sorte un objet polymorphe orienté.) Pour une entrée contacts_table, l'identifiant foreign_id stocke l'identifiant [users id] et dans le champ "table", la chaîne "users_table". – Beffa

Questions connexes