Frage

Ich bin ein bisschen neu zu SQLite , und ich habe einen leichten Dilemma über meine Datenbank Design. Ich erkläre es. Angenommen, Sie und Ihre Freunde verwenden, um eine Reihe von verschiedenen Spitznamen im Internet (kann mehr als eine pro Person). Was wir hier haben, ist eine ID der Person und eine Liste aller Spitznamen, dass diese Person Anwendungen. Dies ist ein einzelner Eintrag in einer großen Liste. Das Ziel hier ist es, diese Daten zu speichern, indem SQLite in einer Weise, die SELECT-Anweisung verwendet werden kann, um alle Einträge zu holen, die den angegebenen Nicknamen enthalten.

Ich habe darüber nachgedacht, eine Tabelle mit zwei Spalten erstellen, zuerst die ID (Primärschlüssel) und der andere ein TEXT ist, die Spitznamen in CSV Format. Jedoch ist in diesem Beispiel, das ich weiß nicht, wie die select-Anweisung schreiben Spitznamen in CSV gespeichert suchen und anzeigen lassen.

Ideen?

War es hilfreich?

Lösung

Für den Anfang, hier ist das, was Sie haben

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

Aber ich würde dringend empfehlen, einen Tisch für Namen mit, und eine Tabelle für Spitznamen verwendet, so dass der Spitzname einen Verweis auf Namen hat.

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

Sie werden dieses Schema Sie mehr Kontrolle zu bearbeiten Einträge finden geben, entfernen Sie diese, etc.

Abfrage es entweder mit einem INNER JOIN:

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

oder eine verschachtelte Abfrage:

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

Die beide sind äquivalent (in diesem Fall) zur Angabe der Verknüpfung mit einer WHERE Klausel. Es funktioniert , aber es ist eine schlechte Form (es ist nicht so klar, wie INNER JOIN):

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

Andere Tipps

Warum nicht einfach die folgenden Tabellen haben:

Person (Spalten: person_id, PERSON_NAME)

Spitzname (Spalt: nickname_id, Spitzname)

Person_Nickname (Spalten: person_id, nickname_id)

Dann erstellen Sie Fremdschlüssel von Person zu Person_Nickname und von Nicknamen zu Person_Nickname. Dies ermöglicht eine bestimmte Person so viele Spitznamen zu haben, wie Sie möchten.

Dann, um alle Personen zu finden, die einen gegebenen Spitznamen übereinstimmen, können Sie schreiben:

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

Sie müssen zwei Tabellen:

  • Benutzer
  • Spitznamen

In der Tabelle „Benutzer“ Sie haben id, name, andere optionale Informationen über den Benutzer. In der Tabelle "Spitznamen" Sie haben user_id, Spitznamen.

Es ist ein one to many Assosiation. Dann eine Liste aller Benutzer Spitznamen erhalten Sie es wie folgt abgefragt werden (unter Verwendung der Benutzer-ID):

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

Als weniger Datenbank wie Implementierung könnten Sie dies tun:
verwendet nur eine Tabelle mit 2 Feldern (Benutzer, Spitzname). Dann sind Sie eine Liste aller Spitznamen John bekommen (Sie ids verwenden könnte, auch) im Zusammenhang mit einem Benutzer mit einer Abfrage wie folgt aus:

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

Die CSV-Ansatz funktioniert, aber Sie müßten Ihre eigene Funktion implementieren Hinzufügen / Entfernen / Parse-Spitznamen, und es wäre mit ziemlicher Sicherheit langsamer sein, dass die beiden Implementierungen, erklärte ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top