Pregunta

Soy un poco nuevo SQLite , y estoy teniendo un ligero dilema acerca de mi diseño de base de datos. Lo explicaré. Supongamos que usted y sus amigos utilizan un número de diferentes apodos en Internet (puede haber más de una por persona). Lo que tenemos aquí es un ID de la persona y una lista de todos los apodos que esta persona utiliza. Se trata de una única entrada en una lista grande. El objetivo aquí es la de almacenar estos datos mediante el uso de SQLite en una forma en que la instrucción SELECT se puede utilizar para recuperar todos los registros que contienen el apodo especificado.

He pensado en la creación de una tabla con dos columnas, siendo primero la (clave primaria) ID y el otro es un texto que sostiene apodos en un formato CSV . Sin embargo, en este ejemplo no sé cómo escribir la instrucción de selección para buscar y apodos de los partidos almacena en CSV.

Las ideas?

¿Fue útil?

Solución

Para empezar, aquí es lo que tiene

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

Pero me gustaría sugerir fuertemente que tiene una mesa de Nombres, y una mesa para apodos utilizados, de manera que el apodo tiene una referencia a nombres.

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

Encontrará este esquema le dará más control para editar las entradas, eliminarlos, etc.

query ya sea 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 consulta anidada:

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

Los dos son equivalente (en este caso) a la especificación de la unión con una cláusula WHERE. Es funciona , pero es mala forma (que no es tan claro como INNER JOIN):

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

Otros consejos

¿Por qué no tener las siguientes tablas:

persona (columnas: person_id, person_name)

sobrenombre (columnas: nickname_id, apodo)

Person_Nickname (columnas: person_id, nickname_id)

A continuación, se crea las claves externas de persona a Person_Nickname y desde Apodo a Person_Nickname. Esto permite que una persona determinada a tener tantos apodos como desee.

A continuación, para encontrar todas las personas que se ajustan a un apodo dado, se puede escribir:

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

Se necesitan 2 tablas:

  • usuarios
  • apodos

En los "usuarios" de mesa que tiene identificación, nombre, otra información opcional en el usuario. En "apodos" de mesa que ha USER_ID, apodo.

Es un uno a muchos assosiation. A continuación, para obtener una lista de todos los apodos de usuario se consulta como este (utilizando el identificador de usuario):

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

Como la base de datos como la aplicación de menos que podía hacer esto:
utilizar sólo una mesa con 2 campos (de usuario, apodo). A continuación, se obtiene una lista de todos los apodos de Juan (que podría utilizar los identificadores, también) asociada a un usuario con una consulta como la siguiente:

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

Las obras de aproximación CSV, pero lo que se necesita para implementar su propia función para añadir / eliminar / analizar apodos, y es casi seguro que sea más lento que las dos implementaciones me explicaron.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top