Hoi,
Ik ben op dit moment bezig met een JDBC legacy project waarvoor een redesign moet komen. Nu wordt veel data opgehaald met SQL queries, waarbij in die queries de access rules (voor een user) embedded zijn.
Dit heeft grofweg de volgende vorm:
Dit is hier heel abstract weergegeven; waar het neer komt is dat 1 deel van de query de data ophaalt die daadwerkelijk opgehaald moet worden, terwijl een serie joins met andere tabellen en een reeks condities in de where clause bepalen of een user een bepaalde row wel of niet te zien krijgt.
Het probleem is natuurlijk dat dit slecht onderhoudbaar is. Access rules embedded in de queries staan op diverse plekken dubbel, plus dat je niet los kunt opvragen of user A toegang of niet heeft tot row X.
Het voordeel van deze aanpak is wel dat het snel en direct is. Als ik dit ga omzetten naar een JPA (Hibernate/Toplink) gebasseerde oplossing, dan vraag ik me af hoe ik dit ga vertalen. Eerst alle entities opvragen, en de lijst die daar weer uit voortkomt filteren zou een oplossing kunnen zijn. Het punt is daarbij wel dat alle access rules in memory moeten staan; 1 query per row doen is natuurlijk onbegonnen werk.
Een andere oplossing is om de access code weer als een JPQL query te schrijven; dan beperk ik het aantal rijen snel, maar zit ik wel weer met de rules in een query. Conceptueel gezien zou ik het liefst zoiets willen:
Zou dit ongeveer een goede aanpak zijn, of zijn er betere methoden?
Ik ben op dit moment bezig met een JDBC legacy project waarvoor een redesign moet komen. Nu wordt veel data opgehaald met SQL queries, waarbij in die queries de access rules (voor een user) embedded zijn.
Dit heeft grofweg de volgende vorm:
SQL:
1
2
| select * from main_table, access_table1, access_table2, access_table3 where [complicated set of rules] |
Dit is hier heel abstract weergegeven; waar het neer komt is dat 1 deel van de query de data ophaalt die daadwerkelijk opgehaald moet worden, terwijl een serie joins met andere tabellen en een reeks condities in de where clause bepalen of een user een bepaalde row wel of niet te zien krijgt.
Het probleem is natuurlijk dat dit slecht onderhoudbaar is. Access rules embedded in de queries staan op diverse plekken dubbel, plus dat je niet los kunt opvragen of user A toegang of niet heeft tot row X.
Het voordeel van deze aanpak is wel dat het snel en direct is. Als ik dit ga omzetten naar een JPA (Hibernate/Toplink) gebasseerde oplossing, dan vraag ik me af hoe ik dit ga vertalen. Eerst alle entities opvragen, en de lijst die daar weer uit voortkomt filteren zou een oplossing kunnen zijn. Het punt is daarbij wel dat alle access rules in memory moeten staan; 1 query per row doen is natuurlijk onbegonnen werk.
Een andere oplossing is om de access code weer als een JPQL query te schrijven; dan beperk ik het aantal rijen snel, maar zit ik wel weer met de rules in een query. Conceptueel gezien zou ik het liefst zoiets willen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
| class XyzDAO { List<Xyz> getXYZByAccess(XyzAccessManager am) { List<Xyz> filteredList = new ArrayList<Xyz>(); for (Xyz xyz : getAllXyz()) { if (am.hasAccess(xyz) { filteredList.add(xyz); } } return filteredList; } } |
Zou dit ongeveer een goede aanpak zijn, of zijn er betere methoden?