schema.sql 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. -- Schéma de la base de données SQLite pour Framed Tracker
  2. -- Table des utilisateurs
  3. CREATE TABLE users (
  4. id INTEGER PRIMARY KEY AUTOINCREMENT,
  5. username TEXT UNIQUE NOT NULL,
  6. password TEXT NOT NULL, -- Mot de passe hashé avec bcrypt
  7. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  8. );
  9. -- Index sur le nom d'utilisateur pour accélérer les recherches
  10. CREATE UNIQUE INDEX idx_users_username ON users(username);
  11. -- Table des scores
  12. CREATE TABLE scores (
  13. id INTEGER PRIMARY KEY AUTOINCREMENT,
  14. user_id INTEGER NOT NULL, -- Référence à l'utilisateur
  15. date TEXT NOT NULL, -- Date au format YYYY-MM-DD
  16. game_type TEXT NOT NULL, -- "daily" ou "one"
  17. game_number INTEGER, -- Numéro optionnel du jeu
  18. score INTEGER NOT NULL, -- Score entre 1 et 6
  19. comment TEXT, -- Commentaire optionnel sur le jeu
  20. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  21. -- Contrainte de clé étrangère pour assurer l'intégrité référentielle
  22. FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
  23. );
  24. -- Index sur user_id pour accélérer les recherches par utilisateur
  25. CREATE INDEX idx_scores_user_id ON scores(user_id);
  26. -- Index sur game_type pour accélérer les filtres par type de jeu
  27. CREATE INDEX idx_scores_game_type ON scores(game_type);
  28. -- Index composite pour les recherches fréquentes
  29. CREATE INDEX idx_scores_user_game_type ON scores(user_id, game_type);
  30. -- Vue pour les statistiques globales par utilisateur
  31. CREATE VIEW user_stats AS
  32. SELECT
  33. user_id,
  34. COUNT(*) AS total_games,
  35. AVG(score) AS average_score,
  36. MIN(score) AS best_score
  37. FROM scores
  38. GROUP BY user_id;
  39. -- Vue pour les statistiques par type de jeu et utilisateur
  40. CREATE VIEW user_game_type_stats AS
  41. SELECT
  42. user_id,
  43. game_type,
  44. COUNT(*) AS total_games,
  45. AVG(score) AS average_score,
  46. MIN(score) AS best_score
  47. FROM scores
  48. GROUP BY user_id, game_type;
  49. -- Vue pour le classement général
  50. CREATE VIEW leaderboard AS
  51. SELECT
  52. u.id,
  53. u.username,
  54. COUNT(s.id) AS total_games,
  55. AVG(s.score) AS average_score,
  56. MIN(s.score) AS best_score
  57. FROM users u
  58. JOIN scores s ON u.id = s.user_id
  59. GROUP BY u.id
  60. ORDER BY average_score ASC, best_score ASC;
  61. -- Vue pour le classement par type de jeu
  62. CREATE VIEW leaderboard_by_type AS
  63. SELECT
  64. u.id,
  65. u.username,
  66. s.game_type,
  67. COUNT(s.id) AS total_games,
  68. AVG(s.score) AS average_score,
  69. MIN(s.score) AS best_score
  70. FROM users u
  71. JOIN scores s ON u.id = s.user_id
  72. GROUP BY u.id, s.game_type
  73. ORDER BY s.game_type, average_score ASC, best_score ASC;
  74. -- Exemple d'insertion d'utilisateur (dans une application réelle, le mot de passe serait hashé)
  75. -- INSERT INTO users (username, password) VALUES ('joueur1', 'motdepasse_hashed');
  76. -- Exemple d'insertion de score
  77. -- INSERT INTO scores (user_id, date, game_type, game_number, score) VALUES (1, '2025-03-05', 'daily', 1090, 3);