sql - tool - design database online




Perché usare il database SQL? (17)

Ma perché usare il linguaggio SQL per l'interazione con un tale database?

Penso che sia per la stessa ragione per cui usi un linguaggio leggibile dall'uomo (codice sorgente) per l'interazione con il compilatore.

Personalmente, avrei usato un bytecode "db query compilato", che sarebbe stato assemblato una volta all'interno di un'applicazione client e passato al database.

Questa è una funzionalità (facoltativa) esistente dei database, denominata "stored procedure".

Modificare:

Sarei molto grato se potessi fornire alcuni esempi in cui SQL è usato senza ORM di proposito, e perché

Quando ho implementato il mio ORM, ho implementato il framework ORM utilizzando ADO.NET: e l'utilizzo di ADO.NET include l'utilizzo di istruzioni SQL nella sua implementazione.

Non sono sicuro che lo stackoverflow sia un posto per una domanda così generica, ma proviamo.

Essendo esposto alla necessità di archiviare i dati delle applicazioni da qualche parte, ho sempre usato MySQL o sqlite, solo perché è sempre fatto così. Poiché sembra che tutto il mondo stia utilizzando questi database (soprattutto prodotti software, framework, ecc.), È piuttosto difficile per uno sviluppatore principiante come me iniziare a pensare se questa sia una buona soluzione o meno.

Ok, diciamo che abbiamo una certa logica orientata agli oggetti nella nostra applicazione, e gli oggetti sono collegati l'uno all'altro in qualche modo. Abbiamo bisogno di associare questa logica alla logica di archiviazione, quindi sono richieste anche le relazioni tra gli oggetti del database. Questo ci porta ad usare il database relazionale, e io sono d'accordo: per dirla in parole povere, a volte le nostre righe della tabella del database devono avere riferimenti alle righe di altre tabelle. Ma perché usare il linguaggio SQL per l'interazione con un tale database?

La query SQL è un messaggio di testo. Posso capire che questo è bello per capire effettivamente cosa fa, ma non è sciocco usare i nomi delle tabelle di testo e delle colonne per una parte dell'applicazione che nessuno ha mai visto dopo il deploynment? Se dovessi scrivere una memoria dati da zero, non avresti mai usato questo tipo di soluzione. Personalmente, avrei usato un bytecode "db query compilato", che sarebbe stato assemblato una volta all'interno di un'applicazione client e passato al database. E sicuramente nominerebbe le tabelle e i due punti con i numeri di identificazione, non con le stringhe ascii. Nel caso di cambiamenti nella struttura della tabella, tali query possono essere ricompilate secondo il nuovo schema db, memorizzato in XML o qualcosa del genere.

Quali sono i problemi della mia idea? C'è qualche ragione per me per non scrivere da solo e utilizzare invece il database SQL?

EDIT Per rendere la mia domanda più chiara. La maggior parte delle risposte afferma che SQL, essendo una query di testo, aiuta gli sviluppatori a comprendere meglio la query stessa e ad eseguirne il debug più facilmente. Personalmente, non vedo persone che scrivano query SQL a mano per un po '. Tutti quelli che conosco, incluso me, stanno usando l'ORM. Questa situazione, in cui costruiamo un nuovo livello di astrazione per nascondere SQL, porta a pensare se abbiamo bisogno di SQL o meno. Sarei molto grato se potessi fornire alcuni esempi in cui SQL è usato senza ORM di proposito, e perché.

EDIT2 SQL è un'interfaccia tra un essere umano e un database. La domanda è: perché dobbiamo utilizzarla per l'interazione applicazione / database? Chiedo ancora esempi di esseri umani che scrivono / eseguono il debug di SQL.


SQL è un'interfaccia tra un essere umano e un database. La domanda è: perché dobbiamo utilizzarla per l'interazione applicazione / database? Chiedo ancora esempi di esseri umani che scrivono / eseguono il debug di SQL.

Uso sqlite molto dalle attività più semplici (come la registrazione dei registri del firewall direttamente in un database SQLite) in attività di analisi e debug più complesse nella mia ricerca quotidiana. Stendere i miei dati in tabelle e scrivere query SQL per analizzarli in modi interessanti sembra essere la cosa più naturale per me in queste situazioni.

Per quanto riguarda il motivo per cui è ancora usato come interfaccia tra applicazione / database, questo è il mio semplice ragionamento:

  1. Ci sono circa 3-4 decenni di ricerche serie in quell'area a partire dal 1970 con il documento seminale di Codd sull'Algebra relazionale. Algebra relazionale costituisce la base matematica per SQL (e altri QL), sebbene SQL non segua completamente il modello relazionale.

  2. La forma del "testo" del linguaggio (oltre ad essere facilmente comprensibile per l'uomo) è facilmente analizzabile dalle macchine (diciamo usando un parser di grammatica come lex) ed è facilmente convertibile in qualunque "bytecode" usando un numero qualsiasi di ottimizzazioni.

  3. Non sono sicuro se farlo in un altro modo avrebbe prodotto vantaggi convincenti nei casi generici. Altrimenti sarebbe stato probabilmente scoperto e adottato nei 3 decenni di ricerca. SQL probabilmente fornisce i migliori compromessi quando si collega la divisione tra umani / database e applicazioni / database.

La domanda che poi diventa interessante da porsi è: "Quali sono i reali vantaggi di fare SQL in qualsiasi altro modo" non testuale "?" Google per questo ora :)


Dato che hai usato MySQL e SQLite, capisco completamente il tuo punto di vista. La maggior parte dei DBMS ha caratteristiche che richiederebbero una parte della programmazione da parte tua, mentre la ottengono dal database gratuitamente:

  • Indici : è possibile memorizzare grandi quantità di dati ed essere ancora in grado di filtrare e cercare molto rapidamente a causa di indici. Naturalmente, è possibile implementare la propria indicizzazione, ma perché reinventare la ruota

  • integrità dei dati - l'utilizzo di funzionalità di database come le chiavi esterne a cascata può garantire l'integrità dei dati all'interno del sistema. Devi solo dichiarare la relazione tra i dati e il sistema si prenderà cura di tutto il resto. Naturalmente, ancora una volta, potresti implementare i vincoli nel codice, ma è più lavoro. Si consideri, ad esempio, la cancellazione, in cui si dovrebbe scrivere il codice nel distruttore dell'oggetto per tenere traccia di tutti gli oggetti dipendenti e agire di conseguenza

  • possibilità di avere più applicazioni scritte in diversi linguaggi di programmazione, lavorando su diversi sistemi operativi, alcuni anche distribuiti attraverso la rete - tutti utilizzando gli stessi dati memorizzati in un database comune

  • morte facile implementazione del pattern di osservatore tramite trigger. Esistono molti casi in cui solo alcuni dati dipendono da altri dati e non influisce sull'aspetto dell'interfaccia utente dell'applicazione. Garantire la coerenza può essere molto complicato o richiedere molta programmazione. Naturalmente, è possibile implementare un comportamento simile a un trigger con gli oggetti, ma richiede più programmazione rispetto alla semplice definizione SQL


Dopo tutte le modifiche e i commenti, il punto principale della domanda sembra essere: perché la natura di SQL è più vicina all'interfaccia uomo / database piuttosto che un'interfaccia applicazione / database?

E la risposta molto semplice a questa domanda è: perché è esattamente ciò che originariamente intendeva essere.

I predecessori di SQL (QUEL è presumibilmente il più importante) intendevano essere esattamente questo: un linguaggio QUERY, cioè uno che non aveva nessuno di INSERT, UPDATE, DELETE.

Inoltre, doveva essere un linguaggio di query che potesse essere utilizzato da qualsiasi utente, a condizione che l'utente fosse a conoscenza della struttura logica del database e che ovviamente sapesse come esprimere quella struttura logica nel linguaggio di query che stava usando.

Le idee originali di QUEL / SQL erano che un database è stato costruito usando "qualsiasi meccanismo concepibile", che il database "reale" poteva essere qualsiasi cosa (ad esempio un singolo file XML gigantesco - sebbene l'XML non fosse considerato un'opzione valida all'epoca), e che ci sarebbe stato "un qualche tipo di macchinario" che capiva come trasformare la struttura attuale di quel "proprio nulla" nella struttura relazionale logica così come era percepita dall'utente SQL.

Il fatto che per realizzarlo veramente, le strutture sottostanti siano obbligate a prestarsi per "vederle in relazione", non è stato capito bene in quei giorni come lo è ora.


In realtà ci sono alcuni database non SQL (come Objectivity, Oracle Berkeley DB, ecc.) Prodotti ma nessuno di loro è riuscito. In futuro, se qualcuno trova un'alternativa intuitiva per SQL, risponderà alla tua domanda.


La mia più grande ragione per SQL è la segnalazione ad-hoc. Quel rapporto che i tuoi utenti aziendali vogliono ma non sanno che ne hanno ancora bisogno.


Non credo che la maggior parte delle persone abbia la tua domanda, anche se penso sia molto chiaro. Purtroppo non ho la risposta "corretta". Direi che è una combinazione di diverse cose:

  1. Decisioni semi-arbitrarie quando è stato progettato come la facilità d'uso, non avendo bisogno di un compilatore SQL (o IDE), portabilità, ecc.
  2. E 'successo a prendere bene (probabilmente a causa di ragioni simili)
  3. E ora per ragioni storiche (compatibilità, ben noto, provato, ecc.) Continua ad essere usato.
  4. Non credo che molte aziende si siano preoccupate di un'altra soluzione perché funziona bene, non è un gran collo di bottiglia, è uno standard, blah, blah ..

Penso che la premessa della domanda sia errata. Quel SQL può essere rappresentato come il testo è irrilevante. La maggior parte dei moderni database compilerebbe le query solo una volta e li memorizzerà comunque, quindi hai già un "bytecode compilato" in modo efficace. E non c'è ragione per cui questo non possa accadere dal punto di vista del cliente, anche se non sono sicuro che qualcuno lo abbia fatto.

Hai detto che SQL è un messaggio di testo, beh, penso a lui come a un messaggero e, come sappiamo, non sparare al messaggero. Il vero problema è che le relazioni non sono un modo abbastanza buono di organizzare i dati del mondo reale. SQL è solo un rossetto sul maiale.


Per quanto riguarda la ricerca di un database relazionale che non utilizza SQL come interfaccia principale, penso che non lo troverai. Motivo: SQL è un ottimo modo per parlare di relazioni. Non riesco a capire perché questo è un grosso problema per te: se non ti piace SQL, mettici un'astrazione su di esso (come un ORM) in modo da non doverti preoccupare. Lascia che l'astrazione si preoccupi di ciò. Ti porta nello stesso posto.

Tuttavia, il problema che stai citando qui è la disconnessione della relazione tra oggetti - il problema è con la relazione stessa. Gli oggetti e le tuple relazionali non sempre si prestano ad essere una relazione 1-1, motivo per cui uno sviluppatore può essere frustrato con un database. La soluzione è quella di utilizzare un tipo di database diverso.


Perché spesso, non puoi essere sicuro che (citandoti) "nessuno mai visto dopo la distribuzione" . Sapere che esiste un'interfaccia semplice per la creazione di report e per l'interrogazione a livello di set di dati è un buon percorso per l'evoluzione della tua app.
Hai ragione, ci sono altre soluzioni che potrebbero essere valide in alcune situazioni: XML, file di testo normale, OODB ...
Ma avere una serie di interfacce comuni (come ODBC) è un enorme vantaggio per la vita dei dati.


SQL è stato creato per fornire un'interfaccia per creare query ad hoc su un database relazionale.

Generalmente, la maggior parte dei database relazionali comprende alcune forme di SQL.

Esistono database orientati agli oggetti e (presumibilmente) usano oggetti per fare le loro interrogazioni ... ma, a quanto ho capito, i database OO hanno molti più contatti e i database relazionali funzionano bene.

I database relazionali consentono inoltre di operare in uno stato "disconnesso". Una volta ottenute le informazioni richieste, è possibile chiudere la connessione al database. Con un database OO, è necessario restituire tutti gli oggetti relativi a quello corrente (e quelli a cui sono correlati ... e ... ecc ...) o riaprire la connessione per recuperare nuovi oggetti così come sono si accede.

Oltre a SQL, hai anche ORM (mapping relazionali agli oggetti) che mappano gli oggetti su SQL e ritorno. Ce ne sono alcuni, tra cui LINQ (.NET), MS Entity Framework (.NET), Hibernate (Java), SQLAlchemy (Python), ActiveRecord (Ruby), Class :: DBI (Perl), ecc. .


SQL è un'interfaccia comune utilizzata dalla piattaforma DBMS: l'intero punto dell'interfaccia è che tutte le operazioni del database possono essere specificate in SQL senza richiedere chiamate API supplementari. Ciò significa che esiste un'interfaccia comune tra tutti i client del sistema: software applicativo, report e strumenti di query ad hoc.

In secondo luogo, SQL diventa sempre più utile man mano che le query diventano più complesse. Prova a utilizzare LINQ per specificare un join a 12 vie con tre condizioni basate su predicati esistenziali e una condizione basata su un aggregato calcolato in una sottoquery. Questo tipo di cose è abbastanza comprensibile in SQL ma è improbabile che sia possibile in un ORM.

In molti casi, un ORM farà il 95% di ciò che si desidera: la maggior parte delle query emesse dalle applicazioni sono semplici operazioni CRUD che un ORM o un altro meccanismo di interfaccia di database generico può gestire facilmente. Alcune operazioni sono eseguite al meglio usando il codice SQL personalizzato.

Tuttavia, gli ORM non sono l'interfaccia e la fine dell'interfaccia di database. I Patterns of Enterprise Architecture di Fowler hanno una sezione abbastanza buona su altri tipi di strategia di accesso al database con alcune discussioni sui vantaggi di ciascuno.

Ci sono spesso buoni motivi per non utilizzare un ORM come livello di interfaccia del database primario. Un esempio di buon esempio è che le librerie di database di piattaforme come ADO.Net fanno spesso un buon lavoro e si integrano bene con il resto dell'ambiente. Potresti scoprire che il guadagno derivante dall'utilizzo di un'altra interfaccia non supera di gran lunga i benefici dell'integrazione.

Tuttavia, l'ultima ragione per cui non è possibile ignorare SQL è che in definitiva si sta lavorando con un database se si sta facendo un'applicazione di database. Ci sono molte, molte storie del WTF sulle fallimenti nel codice di applicazioni commerciali fatte da persone che non hanno capito bene i database. Un codice di database mal concepito può causare problemi in così tanti modi, e pensare allegramente che non è necessario capire come funziona il DBMS è un atto di Hubris che è destinato a venire e morderti un giorno. Peggio ancora, arriverà e morde un altro schmoe povero che eredita il tuo codice.


Se tutto ciò che devi fare è memorizzare alcuni dati dell'applicazione da qualche parte, quindi un RDBMS generico o anche SQLite potrebbe essere eccessivo. La serializzazione degli oggetti e la loro scrittura in un file potrebbe essere più semplice in alcuni casi. Un vantaggio di SQLite è che se si dispone di un sacco di questo tipo di informazioni, è tutto contenuto in un unico file. Uno svantaggio è che è più difficile leggerlo. Ad esempio, se si serializzano i dati su YAML, è possibile leggere il file con qualsiasi editor di testo o shell.

Personalmente, avrei usato un bytecode "db query compilato", che sarebbe stato assemblato una volta all'interno di un'applicazione client e passato al database.

Ecco come funzionano alcune API di database. Controlla SQL statico e istruzioni preparate.

C'è qualche ragione per me per non scrivere da solo e utilizzare invece il database SQL?

Se hai bisogno di molte funzionalità, a un certo punto sarà più facile usare una RDMBS esistente per scrivere da zero il tuo database. Se non hai bisogno di molte funzionalità, una soluzione più semplice potrebbe essere più saggia.

L'intero punto dei prodotti di database è di evitare di scrivere il livello del database per ogni nuovo programma. Sì, una RDMBS moderna potrebbe non essere sempre perfetta per ogni progetto. Questo perché sono stati progettati per essere molto generali, quindi in pratica otterrai sempre funzionalità aggiuntive che non ti servono. Ciò non significa che sia meglio avere una soluzione personalizzata. Il guanto non ha sempre bisogno di essere perfetto.

AGGIORNARE:

Ma perché usare il linguaggio SQL per l'interazione con un tale database?

Buona domanda.

La risposta a questo può essere trovata nel documento originale che descrive il modello relazionale. Un modello relazionale di dati per grandi banche dati condivise , da EF Codd, pubblicato da IBM nel 1970. Questo documento descrive i problemi con le tecnologie di database esistenti del tempo, e spiega perché il modello relazionale è superiore.

Il motivo dell'utilizzo del modello relazionale, e quindi di un linguaggio di query logico come SQL, è l'indipendenza dei dati.

L'indipendenza dei dati è definita nel documento come:

"... l'indipendenza dei programmi applicativi e delle attività del terminale dalla crescita dei tipi di dati e dai cambiamenti nelle rappresentazioni dei dati".

Prima del modello relazionale, la tecnologia dominante per i database veniva indicata come modello di rete. In questo modello, il programmatore doveva conoscere la struttura su disco dei dati e attraversare manualmente l'albero o il grafico. Il modello relazionale consente di scrivere una query sullo schema concettuale o logico indipendente dalla rappresentazione fisica dei dati sul disco. Questa separazione dello schema logico dallo schema fisico è il motivo per cui utilizziamo il modello relazionale. Per ulteriori informazioni su questo problema, here alcune diapositive di una classe di database. Nel modello relazionale, utilizziamo linguaggi di query basati sulla logica come SQL per recuperare i dati. Il lavoro di Codd approfondisce i benefici del modello relazionale. Dagli una lettura.

SQL è un linguaggio di query che è facile da digitare in un computer in contrasto con i linguaggi di query tipicamente utilizzati in documenti di ricerca. I documenti di ricerca usano generalmente l'algebra delle relazioni o il calcolo relazionale per scrivere le domande.

In sintesi, utilizziamo SQL perché utilizziamo il modello relazionale per i nostri database.

Se comprendi il modello relazionale, non è difficile capire perché SQL sia così com'è. Quindi, in sostanza, è necessario studiare il modello di relazione e gli interni del database in modo più approfondito per capire veramente perché usiamo SQL. Altrimenti potrebbe essere un po 'un mistero.

AGGIORNAMENTO 2:

SQL è un'interfaccia tra un essere umano e un database. La domanda è: perché dobbiamo utilizzarla per l'interazione applicazione / database? Chiedo ancora esempi di esseri umani che scrivono / eseguono il debug di SQL.

Poiché il database è un database relazionale, comprende solo i linguaggi di query relazionali. Internamente utilizza un linguaggio relazionale come algebra per specificare le query che poi trasforma in un piano di query. Quindi, scriviamo la nostra query in un formato che possiamo comprendere (SQL), il DB prende la nostra query SQL e la trasforma nel suo linguaggio di query interno. Quindi prende la query e prova a trovare un "piano di query" per l'esecuzione della query. Quindi esegue il piano di query e restituisce il risultato.

Ad un certo punto, dobbiamo codificare la nostra query in un formato comprensibile dal database. Il database sa solo come convertire SQL nella sua rappresentazione interna, ecco perché c'è sempre SQL in qualche punto della catena. Non può essere evitato.

Quando si utilizza ORM, si aggiunge semplicemente un livello sopra SQL. L'SQL è ancora lì, è appena nascosto. Se si dispone di un livello di livello superiore per tradurre la richiesta in SQL, non è necessario scrivere direttamente SQL, il che è utile in alcuni casi. Alcune volte non abbiamo un tale livello che sia in grado di fare i tipi di query di cui abbiamo bisogno, quindi dobbiamo usare SQL.


Un linguaggio di database è utile perché fornisce un modello logico per i dati indipendente da qualsiasi applicazione che lo utilizza. SQL ha tuttavia molte lacune, non ultimo il fatto che la sua integrazione con altri linguaggi è scarsa, il supporto di tipo è di circa 30 anni indietro rispetto al resto del settore e non è mai stato comunque un linguaggio veramente relazionale.

SQL è sopravvissuto soprattutto perché il mercato dei database è stato e rimane dominato dai tre mega-venditori che hanno un interesse acquisito a proteggere i loro investimenti. Questo sta cambiando ei giorni di SQL sono probabilmente numerati, ma il modello che alla fine lo sostituirà probabilmente non è ancora arrivato - anche se ci sono un sacco di contendenti in questi giorni.


penso che tu possa usare ORM

se e solo se conosci la base di sql.

altrimenti il ​​risultato non è il migliore


sì, il testo è un po 'inefficiente. Ma in realtà ottenere i dati è molto più costoso, quindi lo sql basato sul testo è ragionevolmente insignificante.


  • È uno standard onnipresente. Praticamente ogni linguaggio di programmazione là fuori ha un modo per accedere ai database SQL. Prova con un protocollo binario proprietario.
  • Tutti lo sanno. Puoi trovare facilmente esperti, i nuovi sviluppatori di solito lo capiscono in qualche misura senza richiedere formazione
  • SQL è strettamente legato al modello relazionale, che è stato accuratamente studiato per quanto riguarda l'ottimizzazione e la scalabilità. Tuttavia, spesso richiede spesso una modifica manuale (creazione dell'indice, struttura della query, ecc.), Che è relativamente facile grazie all'interfaccia testuale.




data-structures