Une base de données (simplifiée) de signets Internet. Je pensais que ce serait judicieux d'organiser les tables logiquement, comme ceci:Une manière optimale de joindre trois tables dans 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 » est l'ID unique, entier clé primaire)
À partir des signets marqués comme préféré que je dois sélectionner N récemment utilisé (pour remplir un menu lors de l'exécution pour plus de commodité). L'instruction fonctionne et semble suffisamment lisible, mais est-elle optimale?
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 table Bookmarks est destinée à contenir en moyenne 20 à 50 000 enregistrements (c'est-à-dire, pas votre gestionnaire de favoris de navigateur standard :-) L'application va exécuter 3 ou 4 instructions similaires au démarrage pour remplir les contrôles. Tous les champs utilisés dans l'exemple sont indexés.
Je m'apprends le langage SQL et j'ai trouvé le code ci-dessus, mais peut-être que je suis en train de négliger une syntaxe ou un idiome qui pourrait l'améliorer?
Si l'indicateur favori est stocké dans la table des utilisateurs, cela signifie que tous les signets associés à l'utilisateur sont favoris - il doit être au niveau du signet, sinon je ne comprends pas le but. –
J'ai tendance à trop expliquer dans mes questions, donc j'ai concocté un simple exemple simple pour éviter cela. La table des favoris principale sera mise à jour périodiquement. Au cours de la mise à jour, je ne veux pas toucher à des données que les utilisateurs ont saisies, comme la notation, le marquage comme favoris, etc. Il semblait plus propre à séparer les deux. De même, certains utilisateurs peuvent ne pas vouloir conserver l'historique, auquel cas l'application peut simplement effacer ou supprimer toute la table d'historique. (Ou, peut-être que le nom «Utilisateurs» est trompeur: il ne s'agit pas d'une table pour les données de compte utilisateur, mais pour les points de données saisis par les utilisateurs, c'est une application de bureau pour utilisateur unique). –