El esquema y los tipos
SQLite no comprueba los tipos como esperas: cómo funciona su afinidad, dónde guardar fechas, y las restricciones que conviene declarar aunque no lo parezca.
La afinidad de tipos
La defensa práctica no es pelearse con la afinidad: es que tu código pase por tipos de Rust, donde el compilador ya impide meter una cadena donde va un entero. Con eso, el 95% del problema desaparece antes de llegar a la base. Las restricciones cubren el resto.
Las restricciones que sí se cumplen
Estas no son sugerencias, y conviene ponerlas todas:
CREATE TABLE proyecto ( id INTEGER PRIMARY KEY, nombre TEXT NOT NULL CHECK (length(nombre) BETWEEN 1 AND 200), creado_en INTEGER NOT NULL, -- segundos desde la época archivado INTEGER NOT NULL DEFAULT 0 CHECK (archivado IN (0, 1)), carpeta_id INTEGER REFERENCES carpeta(id) ON DELETE CASCADE) STRICT;NOT NULL— se cumple, y es la que más protege. Un campo opcional que nunca debería serlo es el origen de la mitad de los fallos de datos.CHECK— se cumple, y sirve para lo que la afinidad no hace: rangos, longitudes, valores permitidos.REFERENCES— se cumple si activaste las claves foráneas del nivel 41.2. YON DELETE CASCADEte ahorra el borrado en cadena a mano.STRICT— la tabla estricta, que sí exige los tipos declarados. Es la respuesta directa a la afinidad y conviene usarla en tablas nuevas.
La última es la más importante de esta lección si tu versión de SQLite la soporta: convierte los tipos de sugerencias en reglas, que es lo que esperabas desde el principio.
Fechas, booleanos y estructuras
Tres decisiones que hay que tomar porque SQLite no tiene tipos para ellas:
Y la regla que las une: sé consistente. Un esquema donde unas fechas son números y otras texto es un esquema que va a producir comparaciones incorrectas, y el fallo no salta: devuelve resultados mal ordenados que nadie mira.
Los índices
Lo justo, porque es donde se equivoca la gente en las dos direcciones:
- Índice en lo que buscas y ordenas. Si una consulta filtra por una columna en una tabla que va a tener miles de filas, esa columna quiere índice.
- No índices en todo. Cada índice cuesta espacio y hace las escrituras más lentas.
- Y la clave primaria ya está indexada: no hace falta añadirle uno.
Con menos de mil filas casi nada importa. Los índices empiezan a decidir cuando hay decenas de miles, y en escritorio eso llega antes de lo que parece si guardas histórico.