Domanda

Un sacco di applicazioni web che hanno un'architettura a 3 livelli stanno facendo tutta l'elaborazione nel server app e utilizzare il database per la persistenza solo per avere l'indipendenza del database. Dopo aver pagato una somma enorme per un database, facendo tutto il lotto compreso elaborazione sul server di app e non utilizzando la potenza del database sembra essere uno spreco. Ho una difficoltà nel convincere le persone che abbiamo bisogno di utilizzare meglio dei due mondi.

È stato utile?

Soluzione

Dipende dalla vostra applicazione. Si dovrebbe impostare le cose in modo che il database non database cose sono buone per. Un bambino di otto-join di tabella attraverso decine di milioni di record non è qualcosa che si sta andando a voler gestire nel vostro livello applicazione. Né è l'esecuzione di operazioni di aggregazione su milioni di righe di emettere piccoli pezzi di informazioni di riepilogo.

D'altra parte, se si sta solo facendo un sacco di CRUD, non stai perdendo molto trattando che database di grandi dimensioni costoso come un repository muto. Ma semplici modelli di dati che si prestano ad applicazioni focalizzate "elaborazione" a volte finiscono per che conduce lungo la strada per strisciante inefficienze impreviste. nodi di progettazione. Ti ritrovi elaborazione di record nel livello di applicazione. Guardando le cose in modo che cominciano ad approssimare SQL unisce. Alla fine si dolorosamente refactoring queste cose di nuovo al livello del database dove corrono ordini di grandezza più efficiente ...

Quindi, dipende.

Altri suggerimenti

Quello che "potere" del database sono non utilizza in un archiecture 3-tier? Presumibilmente sfruttiamo SQL al massimo, e tutti i gestione dei dati, di paging, caching, indicizzazione, l'ottimizzazione delle query e funzionalità di blocco.

Direi che l'argomento è dove quello che potremmo chiamare "la logica di business" dovrebbe essere attuato. Nel application server o in procedure database memorizzato.

Vedo due motivi per metterlo in application server:

1). Scalabilità. E 'relativamente difficile aggiungere motori più datbase se il DB troppo affollato. Partizionamento dei dati su più database è davvero difficile. Così, invece estrarre la logica di business verso il livello server app. Ora possiamo avere molte istanze di server app tutta la logica di business facendo.

2). Manutenibilità. In linea di principio, codice di stored procedure può essere ben scritto, modularizzati e resuable. In pratica sembra molto più facile scrivere codice mantenibile in un linguaggio OO come C # o Java. Per qualche ragione il riutilizzo in stored procedure sembra accadere da taglia e incolla, e così nel tempo la logica di business diventa difficile da mantenere. Vorrei ammettere che con disciplina questo non deve accadere, ma la disciplina sembra essere scarseggia in questo momento.

Abbiamo bisogno di stare attenti a sfruttare veramente le funzionalità di query di database al completo, ad esempio evitando tirare grandi quantità di dati attraverso al livello server app.

No. Essi devono essere utilizzati per le regole di business applicazione pure.

Purtroppo il DBMS cani di grossa taglia sono sufficienti o non competente o non disposti a sostenere questo, rendendo impossibile questo ideale, e mantenere i loro clienti in ostaggio ai loro principali vacche da mungere.

Ho visto una sola applicazione progettata (da un ragazzo molto intelligente) con le tabelle della forma:

id | one or two other indexed columns | big_chunk_of_serialised_data

Accesso a quella nella domanda è semplice: ci sono metodi che caricare una (o set) di oggetti, deserialising come necessario. E ci sono metodi che puntate un oggetto nel database.

Ma come previsto (ma solo col senno di poi, purtroppo), ci sono tanti casi in cui vogliamo interrogare il DB in qualche modo al di fuori che l'applicazione! Questo è lavorato intorno è vari modi: un'interfaccia query ad-hoc in app (che aggiunge diversi strati di indirezione per ottenere i dati); riutilizzo di alcune parti del codice app; Codice deserialisation scritto a mano (a volte in altre lingue); e semplicemente di dover fare a meno di tutti i campi che sono il pezzo deserialised.

Posso facilmente immaginare la stessa cosa che si verifica per quasi tutte le app: è solo a portata di mano per essere in grado di accedere ai dati. Di conseguenza, credo che sarei abbastanza contrario a memorizzare i dati serializzati in un vero e proprio DB - con possibili eccezioni in cui il risparmio supera l'aumento della complessità (un esempio è la memorizzazione di un array di interi a 32 bit)

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top