1

私はSQLiteに少し慣れていないため、データベースの設計について少しジレンマを抱えています。説明します。あなたとあなたの友人がインターネット上でさまざまなニックネームを使用しているとします (1 人あたり複数のニックネームを使用できます)。ここにあるのは、その人物の ID と、この人物が使用するすべてのニックネームのリストです。これは、大きなリストの 1 つのエントリです。ここでの目標は、SQLite を使用してこのデータを格納し、SELECT ステートメントを使用して指定されたニックネームを含むすべてのエントリをフェッチできるようにすることです。

最初は ID (主キー) で、もう 1 つはニックネームをCSV形式で保持する TEXT の 2 つの列を持つテーブルを作成することを考えました。ただし、この例では、CSV に保存されているニックネームを検索して一致させるための select ステートメントの書き方がわかりません。

アイデア?

4

3 に答える 3

5

手始めに、ここにあなたが持っているものがあります

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

ただし、ニックネームが名前への参照を持つように、名前のテーブルと使用されるニックネームのテーブルを用意することを強くお勧めします。

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

このスキームにより、エントリの編集、削除などをより細かく制御できるようになります。

INNER JOIN:のいずれかでクエリします。

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

またはネストされたクエリ:

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

WHEREこの2つは、(この場合)句を使用して結合を指定することと同じです。それは動作しますが、それは貧弱な形式です(それはそれほど明確ではありませんINNER JOIN):

SELECT Users.Name, NickNames.NickName 
    FROM Users, NickNames 
    WHERE User.UserId = NickNames.UserId
    AND NickNames.NickName = 'Copper';
于 2009-11-17T20:23:37.923 に答える
1

次の表を用意してみませんか。

人 (列: person_id、person_name)

ニックネーム(列:nickname_id、ニックネーム)

Person_Nickname (列: person_id、nickname_id)

次に、Person から Person_Nickname へ、および Nickname から Person_Nickname への外部キーを作成します。これにより、特定の人に好きなだけニックネームを付けることができます。

次に、特定のニックネームに一致するすべての人を見つけるには、次のように記述できます。

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
于 2009-11-17T20:20:06.283 に答える
1

2 つのテーブルが必要です。

  • ユーザー
  • ニックネーム

テーブル「ユーザー」には、ユーザーに関するID、名前、その他のオプションの情報があります。テーブル「ニックネーム」には、user_id、ニックネームがあります。

これは 1 対多の関連付けです。次に、すべてのユーザー ニックネームのリストを取得するには、次のようにクエリを実行します (ユーザー ID を使用):

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

データベースに似ていない実装として、これを行うことができます:
2 つのフィールド (ユーザー、ニックネーム) を持つ 1 つのテーブルのみを使用します。次に、次のようなクエリを使用して、ユーザーに関連付けられたすべてのジョンのニックネーム (ID も使用できます) のリストを取得します。

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

CSV アプローチは機能しますが、ニックネームを追加/削除/解析するには独自の関数を実装する必要があり、説明した 2 つの実装よりもほぼ確実に遅くなります。

于 2009-11-17T20:20:49.370 に答える