Una base de datos (simplificada) de marcadores de Internet. Pensé que tenga sentido para organizar las mesas lógicamente, así:Forma óptima de unir tres tablas en SQLite
Bookmarks (id, title, url; basically external data)
+------+------------+-----+
| suid | Title | ... |
+------+------------+-----+
User (user-specific data: favorites, ratings, etc)
+------+------------+-----+
| suid | IsFavorite | ... |
+ + (0 or 1) + +
+------+------------+-----+
History (last used, use count etc)
+------+------------+-----+
| suid | LastUsed | ... |
+ +(TDateTime) + +
+------+------------+-----+
('suid' es único ID, clave entera primaria)
de favoritos marcado como favorito necesito seleccionar N utilizado más recientemente (para llenar un menú en tiempo de ejecución como una conveniencia).
SELECT Bookmarks.suid, Title from Bookmarks
INNER JOIN User USING (suid)
INNER JOIN History USING (suid)
WHERE IsFavorite = 1
ORDER BY LastUsed DESC
LIMIT 15;
La declaración funciona, y parece lo suficientemente legible, pero ¿es óptima? La tabla Marcadores está destinada a contener entre 20 y 50 k registros en promedio (es decir, no el administrador de marcadores del navegador estándar :-) La aplicación ejecutará 3 o 4 declaraciones similares al inicio para completar los controles. Todos los campos utilizados en el ejemplo están indexados.
Me estoy enseñando a mí mismo SQL y se me ocurrió el código anterior, pero ¿tal vez estoy pasando por alto una sintaxis o un modismo que podría mejorarlo?
Si el indicador de favoritos está almacenado en la tabla de usuarios, inferiría que todos los marcadores asociados al usuario son favoritos, debe estar en el nivel de marcador o no entiendo bien el propósito. –
Tengo una tendencia a sobreexplicar en mis preguntas, así que he inventado un simple ejemplo básico para evitar eso. La tabla de marcadores principal se actualizará periódicamente. Durante la actualización, no quiero tocar ningún dato que los usuarios ingresaron, como calificar, marcar como favoritos, etc. Parecía más claro separar los dos. Del mismo modo, es posible que algunos usuarios no deseen mantener el historial, en cuyo caso la aplicación puede borrar o eliminar toda la tabla de historial. (O, tal vez, el nombre "Usuarios" es engañoso. No es una tabla para los datos de la cuenta de usuario, sino para los puntos de datos ingresados por los usuarios. Es una aplicación de escritorio de un solo usuario). –