12

In Django, l'architettura software suggerita è quella di mettere tutta la logica aziendale e l'accesso ai dati nei modelli.modelli django = business logic + accesso ai dati? O il livello di accesso ai dati dovrebbe essere separato dal modello django?

Tuttavia, alcuni colleghi hanno suggerito che il livello di accesso ai dati dovrebbe essere separato dalla logica aziendale (livello del servizio aziendale). La loro giustificazione è che il livello di accesso ai dati può isolare le modifiche se viene utilizzata un'origine dati diversa. Dicono anche che esiste una logica aziendale che può essere presente in più di un modello.

Tuttavia, quando avvio la codifica utilizzando i livelli separati di accesso ai dati e di logica aziendale, il livello di accesso ai dati è semplice (in pratica il codice del modello che definisce lo schema db) e non sembra aggiungere molto valore.

C'è davvero un valore nel separare l'accesso ai dati dai modelli di django o django fornisce già uno strato di accesso ai dati sufficiente con il suo ORM?

Sto cercando sviluppatori che hanno implementato un discreto numero di app di django e scoprire quale sia la loro opinione. Questo è per un'applicazione web di piccole e medie dimensioni.

+0

Il livello di accesso ai dati è l'ORM. ** è ** separato dal modello. Non cambierai gli ORM. Stai ** sta per cambiare i motori di database; e questo è già reso banale dal livello ORM. Non è chiaro cosa intendano i tuoi colleghi per "livello di accesso ai dati". Potete fornire maggiori informazioni? –

+0

possibile duplicato di [Separazione della logica aziendale e dell'accesso ai dati in django] (http://stackoverflow.com/questions/12578908/separation-of-business-logic-and-data-access-in-django) –

+0

@the_drow: OT: puoi per favore interrompere la revisione del robo e prestare attenzione alle modifiche? [Questa modifica suggerita] (http://stackoverflow.com/review/suggested-edits/3992632) era un commento ovvio, non una modifica suggerita che avrebbe dovuto essere accettata. –

risposta

24

Dopo tre anni di sviluppo di Django, ho imparato quanto segue.

L'ORM è il livello di accesso. Niente di più è necessario.

Il 50% della logica aziendale va nel modello. Alcuni di questi sono ripetuti o amplificati nei moduli.

Il 20% della logica aziendale va in Moduli. Tutti i dati di convalida, ad esempio, si trovano nei moduli. In alcuni casi, i moduli restringono un dominio generale (consentito nel modello) a un sottoinsieme specifico per il problema, l'azienda o l'industria.

Il 20% della logica di business si verifica in altri moduli dell'applicazione. Questi moduli si trovano sopra i modelli e le forme, ma al di sotto delle funzioni di visualizzazione, i servizi web RESTful e le app della riga di comando.

Il 10% della logica di business si verifica nelle app della riga di comando utilizzando l'interfaccia dei comandi di gestione. Si tratta di caricamenti di file, estratti e modifiche collettive casuali.

È molto importante che le funzioni di visualizzazione e i servizi Web RESTful non facciano quasi nulla. Utilizzano il più possibile modelli, moduli e altri moduli. Le funzioni di visualizzazione e i servizi web RESTful sono limitati a gestire i capricci di HTTP e i vari formati di dati (JSON, HTML, XML, YAML, qualsiasi cosa).

Tentare di inventare un altro livello di accesso è un esercizio a valore zero .

+2

alcuni dettagli eccellenti su un'architettura più esplicita per django: http://stackoverflow.com/questions/12578908/separation-of-business-logic-and-data-access-in-django?rq=1 – TaiwanGrapefruitTea

+0

Non sono d'accordo che il ORM è il livello di accesso ai dati; l'ORM comprende * la maggior parte * del livello di accesso ai dati. L'utilizzo di un ORM direttamente nei modelli e l'associazione di tabelle di database con attributi di modello accoppia la tua applicazione a database relazionali e a un ORM specifico (ad es. Django). Questo è inerente al pattern di progettazione del record attivo, che Django utilizza (https://docs.djangoproject.com/en/dev/misc/design-philosophies/). Se si desidera disgiungere la logica aziendale e l'accesso ai dati, è necessario utilizzare invece il modello di progettazione del mapper dei dati (ad esempio, SQLAlchemy ORM lo supporta). Potrebbe però essere eccessivo per alcune app. –

1

La risposta dipende dai requisiti dell'applicazione.

Per le applicazioni che utilizzano sempre database relazionali e possono essere accoppiati con un ORM specifico, non è necessario separare l'accesso ai dati e i modelli. Django ORM si basa sul modello di progettazione discografica attivo, che suppone che l'accesso ai dati e il modello siano insieme. Pro è semplice, con meno flessibilità.

Separare l'accesso ai dati e il modello è necessario solo quando lo sviluppatore vuole disaccoppiare completamente il livello di accesso ai dati e la logica aziendale. Puoi farlo con il pattern di progettazione data mapper. Alcuni ORM supportano questo modello di progettazione, come SQLAlchemy. Pro è più flessibilità, con è più complessità.

Raccomando il libro "Patterns of Enterprise Application Architecture" scritto da Martin Fowler per ulteriori dettagli.

Problemi correlati