1

我对SQLite有点陌生,我对我的数据库设计有点进退两难。我会解释的。假设您和您的朋友在 Internet 上使用多个不同的昵称(每人可能不止一个)。我们这里有一个人的 ID 和这个人使用的所有昵称的列表。这是大列表中的单个条目。这里的目标是通过使用 SQLite 以一种 SELECT 语句可用于获取包含指定昵称的所有条目的方式存储此数据。

我考虑过创建一个包含两列的表,第一列是 ID(主键),另一列是包含CSV格式昵称的 TEXT。但是在这个例子中,我不知道如何编写 select 语句来搜索和匹配存储在 CSV 中的昵称。

想法?

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子句指定连接。它有效,但它的形式很差(它不像 那样清楚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、昵称。

这是一对多的关联。然后要获取所有用户昵称的列表,您可以像这样查询它(使用用户 ID):

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

作为一个不太像数据库的实现,你可以这样做:
只使用一个包含 2 个字段(用户、昵称)的表。然后,您将获得与用户相关联的所有 john 昵称的列表(您也可以使用 id),查询如下:

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

CSV 方法有效,但您需要实现自己的函数来添加/删除/解析昵称,而且我解释的两种实现几乎肯定会更慢。

于 2009-11-17T20:20:49.370 回答