3 votes

Conception de schéma mySQL conseil

Question: Comment puis-je utiliser le schéma ci-dessous pour obtenir une liste d'utilisateurs qui n'ont PAS signé un document SI ils ont un rôle qui est inclus pour un document?

Contexte:

J'ai une table d'utilisateurs. Les utilisateurs ont des rôles. C'est une configuration simple :

Table des rôles :     Role_ID | Nom
Table des utilisateurs :     User_ID | Nom
Table des utilisateurs_rôles :    User_ID | Role_ID

Maintenant, je dois ajouter une table de Documents :

Table des documents :  Document_ID | Nom

Je dois savoir quand un utilisateur a signé un document :

Table des documents_utilisateurs : User_ID | Document_ID

Jusque-là, c'est assez simple.

Mais maintenant ça se complique - je dois ajouter une restriction sur les documents, donc je peux avoir des documents attribués à plusieurs rôles :

par exemple, le Document_ID 1 est pour Role_ID (3,4,5).

Je suppose que je dois faire :

Table des rôles_documents : Role_ID | Document_ID

Mais - voici la partie difficile que je ne sais pas : Comment puis-je utiliser le schéma ci-dessus pour obtenir une liste d'utilisateurs qui n'ont PAS signé un document SI ils ont un rôle qui est inclus pour un document?

1voto

RandomSeed Points 14960

Votre structure est correcte:

SELECT Users_Roles.User_ID, Documents_Roles.Document_ID
FROM Documents_Roles -- obtenir quelques documents
-- JOIN Documents ON (Documents.Document_ID = Documents_Roles.Document_ID) -- si vous avez besoin de détails de la table Documents
JOIN Users_Roles USING (Role_ID) -- obtenir tous les utilisateurs censés les signer
-- JOIN Users ON (Users.User_ID = Users_Roles.User_ID) -- si vous avez besoin de détails de la table Users
LEFT JOIN Documents_Users ON
    Documents_Users.Document_ID = Documents_Roles.Document_ID AND
    Documents_Users.User_ID = Users_Roles.User_ID -- trouver s'ils l'ont signé
WHERE
    Documents_Users.User_ID IS NULL -- uniquement les utilisateurs attendus qui n'ont * pas * signé
    -- AND Documents_Roles.Document_ID = some_id
;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X