123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- -- Schéma de la base de données SQLite pour Framed Tracker
- -- Table des utilisateurs
- CREATE TABLE users (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- username TEXT UNIQUE NOT NULL,
- password TEXT NOT NULL, -- Mot de passe hashé avec bcrypt
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
- -- Index sur le nom d'utilisateur pour accélérer les recherches
- CREATE UNIQUE INDEX idx_users_username ON users(username);
- -- Table des scores
- CREATE TABLE scores (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- user_id INTEGER NOT NULL, -- Référence à l'utilisateur
- date TEXT NOT NULL, -- Date au format YYYY-MM-DD
- game_type TEXT NOT NULL, -- "daily" ou "one"
- game_number INTEGER, -- Numéro optionnel du jeu
- score INTEGER NOT NULL, -- Score entre 1 et 6
- comment TEXT, -- Commentaire optionnel sur le jeu
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-
- -- Contrainte de clé étrangère pour assurer l'intégrité référentielle
- FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
- );
- -- Index sur user_id pour accélérer les recherches par utilisateur
- CREATE INDEX idx_scores_user_id ON scores(user_id);
- -- Index sur game_type pour accélérer les filtres par type de jeu
- CREATE INDEX idx_scores_game_type ON scores(game_type);
- -- Index composite pour les recherches fréquentes
- CREATE INDEX idx_scores_user_game_type ON scores(user_id, game_type);
- -- Vue pour les statistiques globales par utilisateur
- CREATE VIEW user_stats AS
- SELECT
- user_id,
- COUNT(*) AS total_games,
- AVG(score) AS average_score,
- MIN(score) AS best_score
- FROM scores
- GROUP BY user_id;
- -- Vue pour les statistiques par type de jeu et utilisateur
- CREATE VIEW user_game_type_stats AS
- SELECT
- user_id,
- game_type,
- COUNT(*) AS total_games,
- AVG(score) AS average_score,
- MIN(score) AS best_score
- FROM scores
- GROUP BY user_id, game_type;
- -- Vue pour le classement général
- CREATE VIEW leaderboard AS
- SELECT
- u.id,
- u.username,
- COUNT(s.id) AS total_games,
- AVG(s.score) AS average_score,
- MIN(s.score) AS best_score
- FROM users u
- JOIN scores s ON u.id = s.user_id
- GROUP BY u.id
- ORDER BY average_score ASC, best_score ASC;
- -- Vue pour le classement par type de jeu
- CREATE VIEW leaderboard_by_type AS
- SELECT
- u.id,
- u.username,
- s.game_type,
- COUNT(s.id) AS total_games,
- AVG(s.score) AS average_score,
- MIN(s.score) AS best_score
- FROM users u
- JOIN scores s ON u.id = s.user_id
- GROUP BY u.id, s.game_type
- ORDER BY s.game_type, average_score ASC, best_score ASC;
- -- Exemple d'insertion d'utilisateur (dans une application réelle, le mot de passe serait hashé)
- -- INSERT INTO users (username, password) VALUES ('joueur1', 'motdepasse_hashed');
- -- Exemple d'insertion de score
- -- INSERT INTO scores (user_id, date, game_type, game_number, score) VALUES (1, '2025-03-05', 'daily', 1090, 3);
|