Je crée une petite base de données dans laquelle l'administrateur pourra acheter des modules à attribuer aux utilisateurs. De plus, l'administrateur sera en mesure de désaffecter un utilisateur d'un module (abandonnant cette licence) et de réaffecter un autre utilisateur au module. Je voudrais aussi tenir un journal de ces affectations, afin de voir à quelle fréquence ces changements sont faits.Conception de base de données et vitesse de requête SQL
Mon option est d'avoir une table du type:
User_Licenses(user_license_id, user_id, module_id, date_from, date_to)
où le date_to reste vide pour les utilisateurs actifs. Cela signifie que pour voir si un utilisateur a accès à ce module je dois vérifier avec:
SELECT user_id FROM User_Licenses
WHERE user_id = 1
AND module_id = 1
AND date_from <= TODAY
AND date_to = NIL
Mon autre option est d'avoir 2 tables du type:
User_Licenses(user_license_id, user_id, module_id, active_user_log_id)
Active_User_Log(active_user_log_id, date_from, date_to)
où Je ferais une entrée de journal chaque fois qu'une nouvelle licence a été assignée et mettre à jour le champ date_to chaque fois qu'une licence a été désaffectée.
Maintenant, je comprends qu'ils sont essentiellement la même chose, avec un peu plus frais généraux de programmation sur la deuxième option, mais pour vérifier si un utilisateur a accès à un module je sais que dois faire:
SELECT user_id FROM User_Licenses
WHERE user_id = 1
AND module_id = 1
et le journal est logiquement séparé de la "vérification quotidienne"
Ce que je voudrais savoir est ce qui est le plus couramment utilisé, et combien plus lent la première instruction SQL est à la seconde. Ceci est pour une application web, le nombre d'utilisateurs ne sera probablement pas supérieur à 100, et les changements dans les affectations d'utilisateurs aux modules devraient être minimes. La vérification de l'accès à un module se fera quotidiennement et les utilisateurs seront affectés à plusieurs modules.
Merci d'avance pour votre aide.
L'utilisateur actif est important pour moi dans les deux cas, simplement impliqué dans le premier. Le User_Log est là car chaque utilisateur aura une licence pour différents modules (sur une base par module), et s'il ne l'exige pas pendant un mois, il peut le "lâcher" et le racheter le mois suivant. J'ai besoin du journal pour m'assurer que les licences ne sont pas partagées. Quant à la suggestion, puisque la vitesse ne sera pas un facteur majeur, je pense que l'approche à deux tables est préférable car je préférerais garder le contenu d'une table spécifique à une entité. Merci pour le conseil: D –