2010-01-09 5 views
0

J'ai eu une boîte de sélection où l'utilisateur va sélectionner la liste des villes qu'ils ont voyagé. Après cela, l'administrateur va rechercher les utilisateurs avec des villes particulières.Comment stocker plusieurs éléments dans la base de données. Confondu avec la structure de base de données

Je suis très confus avec la structure de la base de données. Il y a totalement 300 villes. Créer une colonne pour chaque ville et la stocker avec booléen on ou off, ressemble à une technique enfantine. Quelqu'un m'aider plz

Répondre

5

Je ne sais pas pourquoi vous avez balisé cette fois mysql et sql-server - utilisez-vous les deux?

Quoi qu'il en soit, c'est une norme beaucoup à plusieurs cartographie:

Tableau: Utilisateur

  • UserID (int, PK)
  • UserName (varchar (50), non null)

Tableau: Ville

  • CityID (int, PK)
  • CityName (varchar (50), non null)

Tableau: UserCity

  • AssociationID (int, PK)
  • UserID (int, Utilisateur FK, pas NULL)
  • CityID (int, FK City, non null)

Pour récupérer toutes les villes pour un utilisateur donné:

SELECT c.CityID, c.CityName 
FROM User u 
INNER JOIN UserCity uc 
    ON uc.UserID = u.UserID 
INNER JOIN City c 
    ON c.CityID = uc.CityID 
WHERE u.UserID = @UserID 
+0

J'ai toujours aimé utiliser les clauses 'et' à la place des jointures comme suit: sélectionnez c.CityId, c.CityName de l'utilisateur u, Ville c, UserCity uc où u.UserId = uc.UserId et c.CityId = uc.CityId et u.UserId = @UserId Je trouve que c'est plus facile à lire, mais savez-vous si c'est peut-être plus lent ou a d'autres inconvénients? – Sevas

+0

Merci beaucoup +1 – Rajasekar

+1

@Sevas - Les deux sont une syntaxe valide, mais la syntaxe de jointure explicite est la norme ANSI et devrait fonctionner sur tous les SGBD. La jointure implicite est spécifique à la plate-forme (Microsoft et mysql) et plus difficile à écrire correctement lors de la jonction de plusieurs tables; c'est valide, mais plus communément utilisé. – Aaronaught

0

Vous n'avez pas besoin de créer une colonne pour chaque ville. Vous créez simplement une colonne "Ville", où chaque ligne est une ville. Vous avez ensuite une colonne "Visited", où chaque ligne est un booléen. Au total, il n'y a que deux colonnes.

City  | Visited 

London |  1 
Paris  |  0 
New York |  1 

etc ...

+0

Donc, pour chaque utilisateur, je devais avoir la table séparée ???????????????? – Rajasekar

+0

Non Aaronaught a posté une réponse plus détaillée. Vous avez besoin d'une colonne appelée "UserID" qui contient un identifiant unique pour chaque utilisateur et de préférence une colonne pour UserName pour une description plus conviviale de l'utilisateur. – keyboardP

+0

Merci pour votre réponse – Rajasekar

Questions connexes