Domanda

Sono un po 'nuova per SQLite , e sto avendo un leggero dilemma circa la mia progettazione di database. Spiegherò. Supponiamo che voi ed i vostri amici utilizzare un certo numero di diversi soprannomi su Internet (può essere più di una per persona). Quello che abbiamo qui è un ID della persona e un elenco di tutti i nick che questa persona usa. Si tratta di una singola voce in un elenco di grandi dimensioni. L'obiettivo è quello di memorizzare questi dati utilizzando SQLite in modo SELECT può essere usato per andare a prendere tutte le voci che contengono il soprannome specificato.

ho pensato di creare una tabella con due colonne, essendo il primo (chiave primaria) ID e l'altro è un testo che contiene nomi in un formato CSV . Tuttavia, in questo esempio non so come scrivere l'istruzione select per la ricerca e la partita soprannomi memorizzati in formato CSV.

idee?

È stato utile?

Soluzione

Per cominciare, qui è quello che hai

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

Ma io consiglierei vivamente di avere un tavolo per i nomi, e un tavolo per i nick utilizzato, in modo tale che il soprannome ha un riferimento a nomi.

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

Troverete questo schema vi darà un maggiore controllo per modificare le voci, rimuoverli, ecc.

query che sia con un INNER JOIN:

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

o una query nidificate:

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

I due sono equivalenti (in questo caso) per specificare il join con una clausola WHERE. E ' lavori , ma è scarsa forma (non è chiaro come INNER JOIN):

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

Altri suggerimenti

Perché non basta avere le seguenti tabelle:

persona (colonne: person_id, PERSON_NAME)

Nickname (colonne: nickname_id, soprannome)

Person_Nickname (colonne: person_id, nickname_id)

Quindi si crea chiavi esterne da persona a Person_Nickname e dal nickname Person_Nickname. Questo permette una data persona di avere il maggior numero di soprannomi che vuoi.

Poi, per trovare tutte le persone che corrispondono a un dato soprannome, è possibile scrivere:

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

È necessario 2 tabelle:

  • utenti
  • soprannomi

Nella tabella "utenti" si dispone di id, nome, altre informazioni facoltative sull'utente. Nella tabella "soprannomi" che hai user_id soprannome.

E 'un uno a molti assosiation. Quindi per ottenere un elenco di tutti i nickname degli utenti si esegue una query in questo modo (utilizzando l'ID utente):

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

Come un database meno come implementazione si potrebbe fare questo:
utilizzare soltanto una tabella con 2 campi (utente, nickname). Quindi si ottiene una lista di tutti i soprannomi di John (è possibile utilizzare gli ID, anche) associato ad un utente con una query come questa:

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

Le opere approccio CSV, ma si avrebbe bisogno di implementare la propria funzione per aggiungere / rimuovere / analizzare soprannomi, e sarebbe quasi certamente più lento che le due implementazioni ho spiegato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top