1
votes

Structure de base de données relationnelle pour stocker plusieurs loisirs d'un utilisateur

J'essaie d'enregistrer certains utilisateurs avec des détails de base comme le nom d'utilisateur / email, le mot de passe et leurs passe-temps respectifs comme la lecture, le sport, la danse, etc. et plus tard, les utilisateurs d'affichage ayant des passe-temps similaires. Le schéma actuel ressemble à ceci:

hobbies

 - id 
 - user_id 
 - sports(values true/false) 
 - reading(values true/false)
 - dance(values true/false)
Users

 - id 
 - email 
 - password 
 - country 
 - hobbies_id

Chaque passe-temps est placé sous forme de colonne dans le tableau des loisirs.

Quel sera le schéma le plus optimisé si j'augmente le nombre de loisirs de 3 à 20? En outre, quelqu'un peut-il m'aider avec une requête pour sélectionner des utilisateurs ayant des passe-temps / passe-temps similaires? Par exemple, si John aime la lecture et le sport, et Kim aime le sport et la danse, alors ils ont le sport comme passe-temps commun.

Merci d'avance.


2 commentaires

Supprimez hobby_id de la table des utilisateurs. De même, supprimez user_id de la table des hobbies. Hobbies est une entité en soi et ne devrait stocker que des informations liées à un hobby. Créer une table de mappage plusieurs-à-plusieurs entre l'utilisateur et le passe-temps


La création de plusieurs colonnes «similaires» (en termes d'entité de passe-temps) est un Antipattern SQL. Dans l'idéal, la table hobby devrait avoir deux choses (selon vos besoins actuels): hobby_id et hobby_name


3 Réponses :


2
votes

Suite aux commentaires de @Madhur Bhaiya, je voudrais aborder cela avec 3 tables:

users
 - id 
 - email 
 - password 
 - country 

hobbies
 - id
 - name (sports, reading, dance, ...)

user_hobbies
 - user_id
 - hobbie_id

La table users est la table maître pour les utilisateurs (un enregistrement par utilisateur).

Le tableau hobbies est le tableau maître des hobbies (un enregistrement par hobby). Lorsque de nouveaux loisirs sont créés, vous n’avez pas besoin de créer de nouvelles colonnes, ajoutez simplement de nouvelles lignes.

Le tableau user_hobbies associe les utilisateurs aux loisirs: il contient un enregistrement pour chaque tuple user_id / hobbie_id .


0 commentaires

1
votes

Pour cela, je recommanderais d'examiner la Normalisation de la base de données . Ce problème doit être résolu en implémentant la troisième forme normale (TNF). Pour cela, vous devez supprimer hobby_id de la table users et supprimer user_id de la table hobbies . Un exemple normalisé d'une solution à ce problème serait de créer une nouvelle table qui utilise user_id et hobby_id comme clé composite. Voir ci-dessous:

users:
  - id
  - email
  - password
  - country

user_hobby:
  - user_id
  - hobby_id

hobbies:
  - id
  - description
  - type

Dans cette situation, la table user_hobby aurait une relation plusieurs à plusieurs entre utilisateurs et loisirs . Si un utilisateur a plusieurs passe-temps, il aura plusieurs passe-temps liés à son identifiant dans le tableau user_hobby , mais chaque utilisateur et passe-temps ne doivent être répertoriés que une fois dans leurs tableaux respectifs.


0 commentaires

2
votes

nous pouvons faire avec deux solutions ::

  • La solution de @ GMB
  • suppression de la table de loisirs et enregistrement des données de loisirs uniquement dans la table utilisateur, en type de données json.

2 commentaires

Si nous l'enregistrons en tant que json, la récupération ne prendra-t-elle pas un peu de temps? Et j'ai déjà pensé au stockage en JSON, mais j'ai lu dans stackoverflow lui-même que ce n'est pas une bonne méthode.


non, ne tardez pas à aller chercher. quelle est la version mysql? J'utilise mysql 8. dev.mysql.com/ doc / refman / 8.0 / en / json-function-reference.html