Question

Je suis un peu nouveau pour SQLite, et je suis d'avoir un léger dilemme à propos de ma conception de base de données.Je vais vous expliquer.Supposons que vous et vos amis utilisez un certain nombre de différents pseudonymes sur Internet (peut-être plus d'un par personne).Ce que nous avons ici est un ID de la personne et une liste de tous les surnoms que cette personne utilise.C'est une entrée unique dans une grande liste.Le but ici est de stocker ces données en utilisant SQLite dans un moyen de l'instruction SELECT peut être utilisé pour récupérer toutes les entrées qui contiennent le surnom spécifié.

J'ai pensé à la création d'un tableau avec deux colonnes, la première étant l'IDENTIFIANT (clé primaire) et l'autre étant un TEXTE qui contient des surnoms dans un CSV format.Cependant, dans cet exemple, je ne sais pas comment écrire l'instruction select pour la recherche et le match des surnoms stockées dans un fichier CSV.

Des idées?

Était-ce utile?

La solution

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 les Pseudos utilisés, tels 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 schéma permettra de vous donner plus de contrôle de modifier les entrées, les supprimer, etc.

Requête soit avec un INNER JOIN:

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

Ou d'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 équivalentes (dans ce cas) pour la spécification de la jointure avec un WHERE la clause.Il fonctionne, mais c'est une 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';

Autres conseils

Pourquoi ne pas simplement avoir les tableaux suivants:

Personne (colonnes:person_id, person_name)

Surnom (colonnes:nickname_id, surnom)

Person_Nickname (colonnes:person_id, nickname_id)

Ensuite, vous créez des clés étrangères de la Personne à la Person_Nickname et à partir du Surnom de Person_Nickname.Cela permet à une personne d'avoir autant de surnoms que vous le souhaitez.

Alors, 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

Vous avez besoin de 2 tables:

  • les utilisateurs
  • surnoms

Dans la table "utilisateurs" vous avez l'id, le nom, l'autre facultatif des informations sur l'utilisateur.Dans le tableau "surnoms" vous avez user_id, surnom.

C'est l'une de beaucoup de assosiation.Ensuite, pour obtenir une liste de tous les utilisateurs des surnoms à vous de requête comme ceci (à l'aide de l'id d'utilisateur):

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

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

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

Le CSV approche fonctionne, mais vous devez mettre en place votre propre fonction pour ajouter/supprimer/analyser des surnoms, et il serait presque certainement être plus lent que les deux implémentations je l'ai expliqué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top