Fluent DSL esiste in ambienti Big Data?

4

Il modo in cui comprendo le lingue specifiche di Fluent Domain Sono in grado di utilizzare il concatenamento di metodi per avere una conversazione con il codice. Ad esempio, se il requisito aziendale è chiamare il database per "Ottenere tutti i clienti con account InActive", potrei usare:

Customers().WithInActiveAccount()

I clienti hanno milioni di righe. Portare tutti i clienti in memoria non è efficiente quando ho bisogno solo di un sottoinsieme di clienti (e forse nemmeno dei limiti di memoria dati possibili). Sospetto che gli ORM risolvano questo problema trattando il codice come dati, caricando lentamente e creando una query completa basata sull'intera espressione. Quindi la query finale potrebbe essere

SELECT * CUSTOMERS WHERE InActive = true

IME, quando si tratta di tabelle altamente normalizzate, ORM produce query DB inefficienti. Rolling ancora un altro ORM personalizzato per risolvere un problema simile sembra una marcia della morte in attesa di accadere. E le stored procedure scritte da un professionista DB saranno efficienti.

In questo semplice caso posso semplicemente cambiare i clienti in un oggetto:

Customers.WithInactiveAccount()

Che cosa succede se devo fare qualcosa di più complesso?

Customers.WithInactiveAccount().BornAfter(October 1, 1990)

Come faccio a creare query in modo efficiente mentre costruisco espressioni più avanzate potenzialmente disegnate in altre entità? Questa è una domanda, sono sicuro che ogni ORM si chiede proprio nelle prime fasi di sviluppo. Devo limitarmi a "domande stupide" per mantenere le prestazioni? Se questa è una tecnica che esiste?

Questi sono i tipi di domande che mi vengono a trovare da sviluppatori come me che hanno sperimentato problemi di prestazioni a livello di scheda con gli ORM nel mondo dei big data.

Quindi, quando si tratta di questi tipi di database normalizzati, una DSL fluente è un'opzione pratica? (Suppongo che un DSL fluente per l'accesso ai DB richieda un ORM sottostante per funzionare)

    
posta P.Brian.Mackey 11.02.2015 - 16:00
fonte

1 risposta

3

Prima , chiariamo un po 'i termini ...

Il termine DSL è enormemente ampio. SQL, HTML, LOGO, Mathematica, sono tutti DSL. Stai parlando di referring \ query del tuo modello di dati in base alla sua struttura attuale in maniera strongmente tipizzata.

Fluent significa metodo di concatenamento in modo che la tua fonte assomigli più all'inglese e meno a un linguaggio di programmazione. così: Noun().Adjective().Verb().Adverb() . Questo non è il solo o il modo migliore per formulare le query.

I Big Data di solito si riferiscono a dati che non possono essere archiviati e interrogati efficientemente usando RDBMS. Ciò significa che i Big Data e "normalizzati" sono per lo più mutuamente esclusivi.

Ora riguardo alla tua domanda . Prima di tutto sto rispondendo in base alla mia esperienza di diversi anni con C #, F #, alcuni C ++, e alcuni Java, NHibernate, MS-SQL, PostgreSQL e alcuni MongoDB, e alcuni Hadoop, principalmente su serie di dati piuttosto grandi .

  1. "Fluent" è una cattiva idea. Di solito è più difficile da scrivere e tende ad essere fuorviante per il lettore. è anche molto meno "individuabile" che devi imparare un intero vocabolario per usare e capire una data API "fluente".

  2. L'uso di un ORM (NHibernate, Hibernate, Entity Framework) è meglio che manipolare i dati da soli. Questo non è sempre vero, e devi sempre testare, ottimizzare e capire cosa sta facendo il tuo ORM e perché. Ciò implica una curva di apprendimento piuttosto significativa, è necessario comprendere il tuo ORM, devi capire come creare una mappatura corretta e come controllare il modo in cui le query vengono generate. D'altra parte se sai cosa stai facendo circa il 98% delle volte usando un ORM è il modo più veloce per creare le soluzioni migliori e più performanti , con il minimo sforzo . ~ 2% delle volte che si finisce per andare al DBA, si scrive una stored procedure o qualche SQL, e lo si usa dall'interno di ORM ...

  3. Dovresti avere uno strato DAL appropriato, che gestisca la manipolazione dei dati. L'utilizzo di un ORM non elimina la necessità di creare DAL.

  4. Scrivere query e manipolare i dati nel tuo linguaggio di programmazione, in modo strongmente tipizzato è una grande idea. È veloce, verificato dal compilatore e molto conveniente. C # ha una caratteristica speciale chiamata LINQ che consente di interrogare varie fonti di dati, tra cui: collezioni C #, XML, RDBMS, sorgenti ODATA, molti altri big data strutturati, non strutturati, reali (MongoDB, Cassandra (?), Hadoop), e ORM come NHibernate e Entity Framework. Hibernate \ NHibernate ha anche un linguaggio di cava "Fluent" chiamato Criteria e uno speciale linguaggio non strongmente tipizzato (stringhe) chiamato HQL. Anche il provider Linq di NHibernate ha alcune limitazioni. Di solito le opzioni strongmente tipizzate sono preferibili, ma è comunque molto importante comprenderle a fondo.

  5. Sembra che tu non "creda" negli ORM ... Penso che ciò derivi dal non essere familiari e dalla mancanza di esperienza nel lavorare con loro. Ti assicuro che tutte le domande che hai posto sono state prese in considerazione e indirizzate da alcuni dei migliori sviluppatori del settore.

risposta data 11.02.2015 - 20:14
fonte

Leggi altre domande sui tag