Dove devo imporre che un'entità abbia tra 0 e 7 attributi

0

Sfondo

Devo implementare una whitelist di URL per limitare il numero di pagine su cui può essere distribuito un widget javascript.

Il dominio richiedente è già limitato per un account, ma ora voglio limitare ogni account a un elenco di un massimo di 7 percorsi.

Ci sono un paio di livelli che posso pensare / combinare, ma nessuno di loro sembra "corretto"

  • UI

  • DATABASE

  • MODELLO

  • CONTROLLER

L'interfaccia utente sembra la più semplice, il token CSRF significa che solo questo modulo può postare nel modulo di gestione, se ha solo 7 campi, può solo pubblicare un massimo di 7 percorsi. Ma so che l'interfaccia utente dovrebbe presentare i dati persistenti ed eseguire alcune convalide di base prima di inviarli al back-end, non imporre la logica aziendale di esso.

Il database, Un RDBMS (per quanto ne so) può davvero far rispettare questo se la tabella account ha 7 campi whitelist, o una singola tabella account_whitelist con una chiave esterna di account id e 7 campi whitelist. Non penso posso limitare un numero massimo di occorrenze della chiave esterna, quindi in modo efficace una tabella di 2 colonne (con ulteriori metadati di percorso se necessario) che ha fino a 7 righe per account sembra fuori della domanda.

Il modello. È abbastanza facile creare 7 attributi del modello come null / impostarli su una stringa, ma non sono venduto se questo impone realmente la logica di business ovunque, se qualcosa di "enforcement" è un effetto collaterale dell'ORM. Come far rispettare non più di 2 bambini in un negozio in qualsiasi momento, riducendo semplicemente lo spazio disponibile.

Il controller, potrei respingere qualsiasi richiesta per mantenere più di 7 informazioni. Anche in questo caso sembra un approccio più basato sull'applicazione rispetto alle altre opzioni.

O tutto quanto sopra, ma questo sembra eccessivo e meno mantenibile se il numero 7 cambia in alto o in basso nel tempo.

    
posta Luke 23.10.2017 - 22:22
fonte

2 risposte

2

Secondo me, è qualcosa che vorresti sicuramente gestire nel modello ma non nel modo in cui descrivi.

  1. Visualizza / Controller - Tendo a considerarli come una cosa sola. Anche se non lo hai oggi, se hai bisogno di un altro modo per interagire con il tuo modello, hai il rischio di discrepanze tra le interfacce.

  2. Potresti farlo qui denormalizzando la struttura o con i trigger. Il primo è indesiderabile e il secondo è giusto, no, no. Te ne pentirai.

Il modello è il posto migliore per questo perché è dove devono essere implementate le regole e le convalide aziendali. Non vorrei hardcode 7 attributi, però. Inserirò un controllo di convalida che dice che non ci sono più di 7 (diversi) elementi in questa raccolta di pagine.

In base alla spiegazione del motivo per cui 7 è il numero magico, raccomanderei ancora più strongmente di non utilizzare la struttura del database o la stessa struttura di codice per questo. Mi fiderò che l'analisi finora è corretta e 7 è giusta. Ma i fatti su cui si basa questa analisi non sono scolpiti nella pietra. Le politiche e le penalità cambiano e potresti scoprire che in un anno, 5 è ora il numero corretto. Un altro fattore che può o non può essere rilevante qui è che spesso iniziamo con qualche regola o costrizione che è semplice e possiamo usare strutture di dati per implementarlo, ma in seguito ci rendiamo conto che le cose non erano così semplici e l'approccio strutturale non è più adeguato . Ad esempio, diciamo che espandi il tuo footprint su una piattaforma diversa in cui il limite è diverso o hai un percorso che non vuoi contare verso il limite. Non esiste un limite rilevante al tipo di complessità che è possibile implementare nelle regole definite nel livello del modello, ma ciò che è possibile definire nella struttura è minimo.

    
risposta data 23.10.2017 - 22:45
fonte
3

Nella tua architettura proposta:

Database <--> Model <--> Controller <--> View

L'applicazione delle regole di convalida avviene nel Modello. Il modello è il luogo in cui si trovano tutte le regole aziendali, inclusa qualsiasi convalida che deve essere eseguita sugli oggetti di entità.

Più in particolare, il tuo modello si espande in:

Database <--(SQL)--> DAL <--(CRUD)--> BLL/SL <--(DOMAIN METHODS)--> Controller

Dove DAL è il tuo livello di accesso ai dati (che converte SQL in metodi CRUD) e BLL / SL è il tuo livello di livello di business logic / livello di servizio. La BLL / SL è il punto in cui imponi i tuoi vincoli tramite la convalida.

È inoltre possibile applicare questo particolare vincolo del modello di dati nel database utilizzando i trigger di database, catturando a monte eventuali errori di convalida (o eccezioni) che si verificano. Il trigger controllerà se esistono o meno 7 attributi sull'entità, e se lo fa, annulla l'inserimento.

    
risposta data 23.10.2017 - 22:38
fonte

Leggi altre domande sui tag