Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment codifier et stocker les contraintes de permissions dynamiques ?

Eh bien, c'est l'un des domaines qui suscite encore beaucoup de discussions. Comme disent certains[qui? - pense que c'était Atwood entre autres, mais un lien m'échappe], une application qui sait tout faire a déjà été faite; ça s'appelle C. Ce que vous voulez faire frôle le domaine "trop ​​généralisé", bien que je puisse voir l'intérêt de ne pas avoir besoin d'un programmeur à chaque fois qu'une règle métier change.

Si je devais implémenter un tel système, je suppose que j'essaierais de le décomposer en domaines. Vous avez déjà fait du bon travail avec la deuxième table. Il suffit de normaliser cela dans des domaines distincts qui sont utilisés pour composer des règles métier. Vous créez une règle métier composée d'une ou plusieurs contraintes OR-ed ensemble. Chaque contrainte a besoin d'une propriété qui est restreinte avec un opérateur par rapport à un terme. Les termes peuvent être délicats, car ils peuvent être n'importe quoi, d'une propriété à une fonction, en passant par une fonction composée. Il est probablement plus facile de vérifier vos règles métier pour voir ce dont vous avez besoin. Commencez par, disons, des propriétés, des booléens et des choses courantes comme "MAINTENANT".

Ainsi, le schéma lui-même serait, par exemple, composé des rules , qui contiennent plusieurs constraints (l'avantage évident étant que vous pouvez les lier à n'importe quel [groupe d'utilisateurs/offre/période/autre domaine] de votre choix). Celles-ci sont, à leur tour, composées de properties , qui se comparerait à l'un des operators (table de référence principalement pour que vous puissiez entrer des noms descriptifs personnalisés pour les non-programmeurs, mais vous pouvez choisir d'y entrer une fonction personnalisée à un moment donné) et, bien sûr, l'un des terms . La dernière partie étant la plus complexe, vous devrez probablement la qualifier avec un ID dans term_types afin que vous sachiez si vous comparez à une autre propriété ou à une fonction. Vous pouvez également simplement VARCHAR et créez le champ avec PHP, ce qui ne devrait pas être trop difficile, étant donné que vous avez toutes les options dans properties et/ou functions .

C'est un système très ouvert (et il y a probablement de meilleures façons de procéder), donc cela ne vaut probablement pas la peine de le faire à moins que vous ne sachiez que vous aurez besoin d'un haut degré de dynamisme dans les règles métier.