web-dev-qa-db-fra.com

Stocker des données inchangées dans la base de données vs en code

Bonjour, j'essaie de créer un système d'autorisation d'itinéraire dynamique basé sur le serveur API Powered API NODEJS ExpressJS.

Scénario:

  • Il y aura des rôles tels que l'administrateur, la normale, etc. et ils ne peuvent ni être édités ni supprimés.

  • Plus de rôles peuvent être ajoutés par des utilisateurs autorisés de manière dynamique. Ces rôles peuvent être édités ou supprimés.

  • Les utilisateurs autorisés peuvent définir toutes les autorisations d'itinéraire. Ils peuvent définir le rôle A puisse utiliser la route X. Ils peuvent le faire pour toutes sortes de rôles. Rôles dynamiques ou rôles "inchangables" comme admin et standardUser.

Maintenant, mon scénario montre que j'ai besoin d'une table des rôles en raison de mes rôles dynamiques et d'une table de piste de routé pour attribuer dynamiquement l'accès à mes rôles. Cependant, je ne trouve pas un moyen de stocker mes données "inchangables".

  1. Où devrais-je mettre mon "inchangable" (je ne sais pas s'il y a un terme pour cela. S'il vous plaît laissez-moi savoir.) Données de rôle. Où devrais-je mettre des rôles de superadmin et de normes à consommer? Parce que si je les mets dans des rôles de table dans ma DB, je disposerai de 2 lignes inchangables de ma table de données dynamique.

  2. Où devrais-je mettre mes données de route "inchangables". Étant donné que les itinéraires (post/utilisateurs/désactivés) sont codés dans le système, je ne pense pas qu'il est correct de les mettre dans la base de données. Parce que je pense que la base de données ne doit contenir que les données dynamiques, mais mes itinéraires ne sont pas dynamiques.

  3. Si je ne mettez pas mes données "inchangables" à dB. Je peux le stocker dans mon code comme Enums ou Consts, mais comment puis-je créer de manière dynamique des autorisations avec eux? Parce que les autorisations sont dynamiques pour chaque rôle. (Même pour l'administrateur et le standardutilisateur se souviennent qu'ils ne sont pas des rôles dynamiques.)

2
Mansur

Les données "inconnues" ne signifie pas nécessairement que cela ne peut pas être changé. Il ne peut pas être changé par l'application. Définissez un drapeau "inconchangeable" sur chaque ligne. Quand true L'application refuse de modifier les données. Quand false cela peut le changer. Comment vous exécutez-vous cela dépend de la façon dont vous êtes paranoïde.

Si vous limitez cela à votre niveau de votre application, toutes les modifications apportées aux données doivent passer via le niveau de l'application, sinon même avec des drapeaux "immuables" sur les tables de base de données, quelque chose d'autre peut toujours modifier les données. En fonction de vos besoins, cela pourrait être souhaitable.

Vous pouvez écrire des procédures stockées pour appliquer ce comportement. Révoquer tous les privilèges d'insertion, de mise à jour et de suppression de tous les utilisateurs, à l'exception de l'utilisateur qui possède les procédures stockées. Cela oblige toutes les modifications de données à suivre les procédures stockées.

Mélanger des données dans le code et les données de la base de données, sans impossibilité, augmente l'effort de test. Les "données dans le code" présentent une fourchette dans votre logique qui doit être testée partout. Bien que cela ne soit pas un fardeau d'abord, cela commencera à faire glisser votre processus plus tard.

Rester simple. Gardez-le comme des données. Décidez quelle couche de votre infrastructure devrait appliquer l'immuabilité des données (Applet de l'application dans NODEJS ou des procédures stockées dans la base de données).

8
Greg Burghardt

Il n'y a rien de tort intrinsèquement dans le stockage des données dans votre DB qui ne changera jamais plus tard. Assurez-vous simplement qu'il n'y a pas de moyen facile de déconner avec ces données.

  1. Où devrais-je mettre des rôles de superadmin et de normes à consommer?

Il suffit de les mettre dans votre table de rôles, mais introduisez une colonne "Lecture seule" booléenne dans cette table. Vous pouvez donc marquer les enregistrements qui ne doivent pas être modifiés par l'application et la demande peut agir en conséquence.

Si vous souhaitez être sûr que personne ne changeait que les données de manière incohérente, mettez en œuvre un contrôle de santé mentale qui valide si tous les enregistrements attendus se trouvent dans la table de rôle, avec leur contenu attendu. Trouvez un lieu ou un processus où cette vérification de la santé mentale peut être effectuée (par exemple, au moment du démarrage de votre serveur, ou lorsque cela n'est pas assez fréquent, dans un processus de modification de la table des rôles).

  1. Où devrais-je mettre mes données de route "inchangables"?

Il n'est pas clair pour moi de savoir si vous avez besoin de ces données d'itinéraire dans la DB ou non, mais au cas où vous en avez besoin, car vous avez également des données de route "modifiables" et que cela soit géré de manière cohérente avec des données "inchangées", la même stratégie que Pour # 1 peut être appliqué:

  • marquez les données avec un drapeau de "lecture unique" personnalisé pour le rendre distinguable des données modifiables

  • validez-le que personne a frappé avec les données et que les itinéraires stockés dans la base de données DB correspondent à ceux du code.

  1. Si je ne mettez pas mes données "inchangables" à db ...

Oublie ça. Il suffit de stocker les données dans la DB.

5
Doc Brown