Meilleure façon d'implémenter une table de recherche de plusieurs à plusieurs avec des données intentées par l'utilisateur

StackOverflow https://stackoverflow.com/questions/1186736

  •  19-09-2019
  •  | 
  •  

Question

Dites que je souhaite que les utilisateurs choisissent une ou plusieurs méthodes de contact (e-mail, téléphone, fax, autres, etc.). Et s'ils choisissent d'autres, ils peuvent entrer leur propre méthode de contact. Quelle est la meilleure façon de stocker cela dans une base de données? Je vois trois possibilités:

  1. Utilisez une colonne SET DATATYPE, plus une seule colonne VARCHAR "autre" autre_Contact "pour stocker la valeur en option intentée par l'utilisateur.
  2. Utilisez plusieurs à plusieurs et une colonne entre l'utilisateur. Il y aurait donc une table d'utilisateurs, une table Contact_Method et une table user_contact_method qui relie les deux. Plus une colonne User.other_Contact VARCHAR pour stocker la valeur en option intenté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 modifiées ou supprimées par les utilisateurs, et seules celles-ci apparaissent dans une liste déroulante). De plus, je vais devoir ajouter une logique supplémentaire pour permettre à leur valeur intentée par l'utilisateur de modifier.

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

Était-ce utile?

La solution

Si vous avez un utilisateur et plusieurs possibilités de méthode de contact, c'est très probablement une relation un-à-plusieurs. (J'éviterais plusieurs à plusieurs là où vous le pouvez, en raison de la complexité supplémentaire et du ralentissement de l'interrogation de tels 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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top