SQLite - SELECCIONAR sobre múltiples entradas de los mismos datos / columna
-
20-09-2019 - |
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?
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.