2009-11-17 6 views
1

Je suis un peu nouveau à SQLite, et j'ai un léger dilemme au sujet de la conception de ma base de données. Je vais t'expliquer. Supposons que vous et vos amis utilisiez un certain nombre de surnoms différents sur Internet (il peut y en avoir plus d'un par personne). Ce que nous avons ici est un identifiant de la personne et une liste de tous les surnoms que cette personne utilise. Ceci est une entrée unique dans une grande liste. Le but ici est de stocker ces données en utilisant SQLite d'une manière que l'instruction SELECT peut être utilisée pour récupérer toutes les entrées qui contiennent le surnom spécifié.SQLite - SELECT sur plusieurs entrées de la même colonne/données

J'ai pensé à créer une table avec deux colonnes, d'abord l'ID (clé primaire) et l'autre étant un TEXT qui contient des pseudonymes au format CSV. Cependant, dans cet exemple, je ne sais pas comment écrire l'instruction select pour rechercher et faire correspondre les pseudonymes stockés dans CSV.

Des idées?

+0

En tant ajouter, le problème lui-même est pas un de SQLite, mais la base de données intrigante. SQLite est tout aussi performant que n'importe quelle autre base de données décente supportant plusieurs tables. Tout commence avec un schéma approprié. – MPelletier

Répondre

5

Pour commencer, voici ce que vous avez

SELECT Name, Nickname FROM MyTable WHERE Nickname = 'Copper'; 

Mais je suggère fortement d'avoir une table pour les noms, et une table pour Surnoms utilisé, tel que le surnom a une référence à des noms.

CREATE TABLE Users (
    UserId INTEGER PRIMARY KEY, 
    Name TEXT 
    ); 
CREATE TABLE Nicknames (
    NickNameId INTEGER PRIMARY KEY, 
    UserId INTEGER REFERENCES Users(UserId), 
    NickName Text 
    ); 

Vous trouverez ce système vous donnera plus de contrôle pour modifier les entrées, les supprimer, etc.

la requête avec soit un INNER JOIN:

SELECT Users.Name, NickNames.NickName 
    FROM Users INNER JOIN NickNames ON User.UserId=NickNames.UserId 
    WHERE NickNames.NickName = 'Copper'; 

Ou une requête imbriquée:

SELECT Users.Name 
    FROM Users 
    WHERE User.UserId IN (
    SELECT NickNames.UserId 
     FROM NickNames 
     WHERE NickNames.NickName = 'Copper'); 

Les deux sont équivalents (dans ce cas) à la spécification de la jointure avec un WHERE clause. Il fonctionne , mais il est mauvaise forme (ce n'est pas aussi clair que INNER JOIN):

SELECT Users.Name, NickNames.NickName 
    FROM Users, NickNames 
    WHERE User.UserId = NickNames.UserId 
    AND NickNames.NickName = 'Copper'; 
1

Pourquoi ne pas avoir simplement les tableaux suivants:

personne (colonnes: person_id, person_name)

Pseudo (colonnes: nickname_id, surnom)

Person_Nickname (colonnes: person_id, nickname_id)

Ensuite, vous créez des clés étrangères de Person à Person_Nickname et de Nickname à Person_Nickname. Cela permet à une personne donnée d'avoir autant de surnoms que vous le souhaitez.

Ensuite, pour trouver toutes les personnes qui correspondent à un surnom donné, vous pouvez écrire:

SELECT p.person_name 
    FROM person.p 
    , nickname n 
    , person_nickname pn 
WHERE n.nickname = 'nickname of interest' 
    AND p.person_id = pn.person_id 
    AND n.nickname_id = pn.nickname_id 
1

Vous avez besoin de 2 tables:

  • utilisateurs
  • surnoms

En tableau "utilisateurs" vous avez id, nom, d'autres informations facultatives sur l'utilisateur. Dans la table "surnoms", vous avez id_utilisateur, pseudo.

C'est une assosiation de un à plusieurs. ensuite pour obtenir une liste de tous les surnoms utilisateur vous interrogez comme ceci (en utilisant l'ID utilisateur):

SELECT nicknames.nickname FROM nicknames WHERE nicknames.user_id=id 

En tant que base de données moins comme la mise en œuvre, vous pouvez le faire:
utiliser une seule table avec 2 champs (utilisateur, surnom). Ensuite, vous obtenez une liste de tous les surnoms de john (vous pouvez utiliser ids, aussi) associé à un utilisateur avec une requête comme ceci:

SELECT table.nickname FROM table WHERE table.user="john" 

Les travaux d'approche CSV, mais vous devez implémenter votre propre fonction pour ajouter/remove/parse les surnoms, et il serait presque certainement plus lent que les deux implémentations que j'ai expliqué.

Questions connexes