2011-10-31 6 views
0

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.

Répondre

0

Je donnerai mon opinion, mais il y a d'autres questions à répondre et des sujets à aborder en premier. Pour commencer, si vous utilisez le premier cas, vous dites aussi que le concept d'un «utilisateur actif» n'est pas si important pour vous. Dans le second cas, vous dites que c'est le cas. En d'autres termes, vous ne parlez ici que d'un type de requête, mais il y aura aussi des besoins pour d'autres requêtes, et si elles concernent des "utilisateurs actifs", cela devrait vous aider à décider.

Aussi, je soupçonne que lorsque vous écrivez le code pour comparer les valeurs nulles, vous devrez dire "date_to est nul" au lieu de "date_to = nil". Les bases de données font souvent (presque toujours?) La différence entre les valeurs NULL et les valeurs vides, et l'une d'entre elles consiste à comparer les colonnes aux valeurs NULL.

Je pense aussi que, d'après mon expérience avec Licensing, vous concédez quelque chose pour une période de temps spécifique, donc la méthode d'une table, avec NULL comme indicateur, ne me plaît pas. Je préférerais voir une date, et vous pourriez alors demander si la date actuelle est postérieure à la date d'expiration. Cette question ne serait pas décisive, mais j'ai pensé qu'il était raisonnable de le mentionner.

Enfin, la table Active_User_Log semble louche. Avez-vous aussi une table USER? J'aurais été avec une table d'utilisateur, et ai ajouté un statut à cette table, par exemple USER.STATUS. Vous devriez toujours vous joindre à la table des licences, mais les tables refléteraient la réalité un peu mieux à mon avis.

Ma réponse? La différence de vitesse entre les deux requêtes ne serait pas visible, tant que vous avez indexé les tables sous-jacentes de manière appropriée. Mais je voterais pour l'approche à deux tables, et garderais le contenu d'une seule table spécifique à cette entité.

+0

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 –

Questions connexes