Va bene >>.
Quindi, senza ulteriori indugi, SQL, Structured Query Language.
Quindi, probabilmente utilizzato questo a almeno in CS50, magari in CS165,
forse nella tua progetti personali.
E cosa SQL lascia che fai, in un SQL Server, più in generale?
Sì?
[Inaudible Osservazione]
OK, che era molto modo sicuro di dirlo.
Sì. Quindi permette di memorizzare i dati
e permette soprattutto di interrogare i dati.
E questo è un passo avanti
da usare qualcosa semplice come un file CSV, giusto.
Comma Separated Variables.
Valori simili.
Allo stesso modo puoi risparmiare informazioni di una riga
in un file di testo.
Ma qual è il lato negativo di un File CSV per la memorizzazione dei dati,
anche se in modo efficace ottenere righe e colonne da esso?
Già.
>> Non si 'hai la stessa organizzazione
efficienza [incomprensibile].
>> Non è la stessa efficienza dell'organizzazione.
Che vuoi dire?
>> Beh, come [incomprensibile] avere come primario [incomprensibile].
>> OK. Già.
>> E 'un database relazionale si può avere più database
collegate tra loro in modi molto specifici.
>> OK. Buona.
>> E '[incomprensibile] per impostare un file CSV.
>> E lasciatemi tweak un po terminologia.
Quindi più tabelle all'interno di un database, certo,
e che va oltre ciò che si può fare con un solo CSV.
Ma in realtà la limitazione con il CSV direi è
che l'inefficienza del tutto.
E 'molto facile da layout.
Ma se si vuole fare un domanda, che cosa è il tempo di esecuzione
di qualsiasi query di selezione su un file CSV?
Voglio dire, è grande vecchio [incomprensibile], a destra, perche 'nel caso peggiore,
si alzarono in fondo.
Anche se tu avessi ordinato l'intero File CSV, se non si conosce
che in anticipo, bene, si sta ancora andando ad avere
per cercare il tutto.
Così, tra le cose stiamo andando a ottenere
dall'utilizzo di un effettivo database utilizzando un linguaggio
come SQL è che possiamo interrogare e possiamo in anticipo
come progettisti di database specificare quali sono i campi
che sono stati probabilmente andando ad avere domande circa in modo che la gente
a MySQL o Microsoft o Oracle,
chi ha fatto il database si sta utilizzando può fare tutto
del duro lavoro di capire, OK,
dato un milione di questi IDS.
Come possiamo Layout - fuori in memoria?
Una specie di albero strutturare forse,
in modo che quando si fa effettivamente eseguire Select,
si tratta di qualcosa che è logaritmica o logaritmica
di logaritmica in tempo piuttosto che effettivamente devoluzione
in qualcosa di lineare.
Così abbiamo ottenuto un sacco di prestazioni in quel modo.
E possiamo anche memorizzare molto di più dati più facilmente perche 'SQL
Server sono generalmente memorizzati in RAM anche se le parti
di potrebbe essere memorizzato sul disco e probabilmente sapete ormai
che la RAM è generalmente più veloce di dischi,
così che è una buona cosa.
E possiamo anche gestire concorrenza molto meglio.
Se hai preso 165 o 161, sai che se due persone cercano
per fare la stessa cosa contemporaneamente su un sistema,
cose brutte possono accadere in generale.
Così, tra le altre caratteristiche che può ottenere se progettiamo le nostre tavole
nel modo giusto è migliore supporto e sicurezza
quando si tratta di concorrenza.
Così, due persone in due parti
del mondo utilizzando lo stesso sito web, se entrambi provano
comprare qualcosa allo stesso tempo, che per non sta
andare in simultanea.
In qualche modo sarebbero stati serializzati da una persona diversa dalla nostra -
qualcuno diverso da noi stessi.
La volontà del database farlo per noi.
Così, quando si tratta di forma più semplice,
SQL ci consente di interrogare un database relazionale.
Un database relazionale è uno che ha una
o più tabelle in esso genere.
E se questo è un poco familiare,
si può davvero solo pensare di questo come Excel o numeri
o fogli di calcolo di Google.
E 'solo righe e colonne e tipicamente all'inizio di ogni
di tali righe ha un nome.
Quindi questo potrebbe essere l'ID colonna, colonna del nome,
colonna indirizzo e così via.
E allora si può avere di più tali tabelle se si desidera
per iniziare la posa su diversi tipi di dati.
Ma si può ricordare almeno da CS50 che abbiamo provato
per darvi un-based GUI attrezzo [incomprensibile]
per gestire il database.
E 'stato chiamato phpMyAdmin.
Quindi è solo una coincidenza che è stato scritto in PHP, davvero,
ma era solo basata sul web-a front end per un database.
E attraverso le varie schede e collegamenti, si potrebbe cominciare
configurare un database per voi stessi.
Ma un buon strumento per iniziare a ottenere un po 'più confortevole
è anche con l' client a riga di comando.
Quindi, se si utilizza il Appliance CS50 o realmente utilizzando qualsiasi PC macro
che ha un MySQL a riga di comando client, si può anche fare liste
della vecchia scuola, come questo.
Come parte del progetto MySQL, almeno la versione open source
di essa è ora chiamato MariaDB per vari motivi si possono leggere
su Wikipedia, ma è lo stesso software,
è la stessa sintassi e così via,
praticamente la stessa base di codice.
E così quando mi trovo in questo chiede conferma Ora posso interagire
con il mio database molto più manualmente.
Quindi caso in questione, mi permetta di andare avanti
e basta aprire una finestra di terminale.
Mi è capitato di utilizzare il CS50 Appliance ma si può fare questo
sulla maggior parte qualsiasi sistema in che avete ottenuto il diritto
installato il software.
E ho intenzione di fare MySQL-u per nome utente John Harvard
su questo particolare sistema,-p una password che io digito
in poco più saldamente premendo Invio.
Ora sto richiamato.
Ho intenzione di scrivere cremisi nel Appliance CS50
e ora vedo essenzialmente che lo stesso schermo.
Ma c'è comandi ora che possiamo iniziare a digitare
come mostrano i database, e che sta andando a mostrare me tutto
delle banche dati che ho già creato nel sistema,
praticamente la stessa lista si vedrebbe in phpMyAdmin.
Ci sono un paio di altri come informazioni sullo schema e di prova,
che se si poke intorno al CS50 Appliance, si nasconde un po '
di queste tabelle di livello inferiore
ma sono stati c'è tutto questo tempo.
MySQL ha effettivamente basso livello immobili come nomi utente
e password per il database per sé, non per la vostra applicazione
che si può essere esecuzione su di esso.
Quindi, in anticipo, oggi, creato un paio di basi di dati,
uno dei quali è chiamato courses50.
Le probabilità sono che alcuni di voi hanno utilizzato Strumento commerciale corso CS50,
che è un grande interfaccia per catalogo dei corsi del registrar.
E questo è in realtà un bel dataset a parlare perche ',
uno, siamo una sorta di tutti ovviamente familiarità con corsi
e istruttori e meeting sedi e tutte le liste
delle cose ordinarie di università,
ma è anche ottenuto alcuni interessanti opportunità
per la progettazione.
Così abbiamo pensato di usare la nozione di un catalogo corsi
e uno strumento commerciale come esempio per tutto oggi per ordinare
di inquadrare alcune del disegno decisioni che dobbiamo fare.
Quindi cominciamo lì.
Supponiamo che io in realtà volevo per rappresentare il super semplice
naturalmente lo shopping strumenti.
E il mondo semplice Posso immaginare e uno è
in cui ci sono corsi e ci sono istruttori.
E supponiamo di il bene della discussione
che ogni corso ha almeno un nome.
Quindi cominciamo a delineare questo fuori.
Ho intenzione di utilizzare phpMyAdmin solo per comodità,
così noi non abbiamo di digitare tutte le query manualmente.
Ma eccomi qui nel mio database di courses50.
Se non hanno familiarità con questo, sarà essere molto facile una volta che ci si immerge
per il proprio progetto se vuoi usarlo.
Ho intenzione di creare un tabella chiamata Corsi
e posso solo pensare di un campo
per ora, il nome di un corso.
Ho intenzione di andare avanti e dire dammi una colonna.
Ora, come si ricorderà si ottiene un'interfaccia che è un po '
come questo.
E l'altro rialzo francamente di phpMyAdmin è che liste
di auto-istruire e che tramite menu di scorrimento, è possibile ordinare
di vedere che cosa il vostro possibile decisioni di progettazione sono.
Quindi ho intenzione di dare ogni corso un nome.
Questo è il nome di questa colonna.
E per quanto riguarda il tipo di dati?
La maggior parte di voi deve sapere a almeno alcuni di questi tipi di dati
da esperienze precedenti.
Che cosa è appropriato per il nome del corso?
Sharon?
>> Varchar.
>> OK, varchar che è variabile Char.
E che cosa vuol significa più tecnicamente?
[Inaudible Osservazione]
OK. Quindi è una stringa.
E l'aspetto var esso implica ciò?
Variabile. Ma che cosa vuol dire?
Sì?
[Inaudible Osservazione]
Esattamente. Quindi è una variabile numero di caratteri
nella stringa up ad un valore massimo.
Quindi, ecco il nostro primo decisione di progettazione.
Noi in realtà dobbiamo decidere quanti byte al massimo
di assegnare a ciascuno di tali stringhe.
In generale, si vuole sorta di non renderlo troppo piccolo,
non renderlo troppo grande Perche 'ovvio
se troppo piccolo sei solo intenzione di iniziare a troncare i dati
e perderai le informazioni.
E se è troppo grande, sei solo sorta di raccontare la banca dati
di esigere e ottimizzare per più dati
di quanto potrebbe in realtà mai ottenere.
Allora che cosa è un sentimento ragionevole numero per il nome di un corso?
60? OK, 60.
Che sembra abbastanza ragionevole
finchè è non c'è eccezioni a tale.
Non c'è davvero nessun duro, regola ferrea.
Per essere onesti, per ragioni storiche molto
di persone sceglieranno 255 Perche 'da anni che era sorta
del massimo predefinito utilizzando 8 byte - 8 bit come il vostro contatore.
Mi piacerebbe di più [incomprensibile] potrebbe utilizzare potenze di 2
ma è una specie di irrilevante.
Così possiamo andare con 60.
Che sembra ragionevole così a lungo
come noi alla fine non ve ne pentirete 'Causa che è un limite superiore.
Ora, supponiamo che il contrario decisione era stata presa,
caratteri non variabili, ma solo il campo char.
Quindi, a differenza di C e C + +, char non significa un char
e database generalmente significa un numero fisso
di caratteri di una stringa.
Quale sarebbe il rialzo e / o aspetto negativo della mia scelta 60
per un campo char, invece di varchar?
Questo è esattamente il primo tipo di decisione che dovrete fare
quando si ispeziona [fonetica] out di progetto con i partner.
Sì, Sharon di nuovo.
[Inaudible Osservazione]
Buona. Quindi, se il nome è meno
di 60 allora stai sprecando qualunque essa delta è
tra il 60 e il lunghezza effettiva.
Quindi, che si sente solo uno spreco, più byte del necessario.
Ma perché esiste?
Sicuramente c'è qualche rialzo.
Sì?
[Inaudible Osservazione]
Certo. Così a volte si potrebbe conoscere il numero fisso
di personaggi come 10 cifre per un numero di telefono per esempio.
Ma chi se ne frega, come perché Non basta dire 11 comunque
o perché non dire 60 comunque con il varchar?
Che vantaggio otteniamo conoscendo e progettazione
per un numero fisso di caratteri?
[Inaudible Osservazione]
Sei sulla strada giusta.
Quindi è l'ottimizzazione, ma è davvero di - sì?
[Inaudible Osservazione]
OK. Buona. Facciamo attenzione su quest'ultima parte.
Così l'indicizzazione.
Così si scopre se si sapere in anticipo che tutti
dei campi stanno andando essere 60 caratteri,
si può davvero pensare a questo colonna nel database Excel
come avendo molto semplice, sinistra giustificato
bordi destro e giustificati
perché ogni colonna è 60 caratteri di larghezza.
Ciò significa che questo stringa dista 60 caratteri
da questa stringa, 60 caratteri lontano da questo
e questo e questo.
Quindi, proprio come indietro quando si imparato C, si ha avuto accesso casuale
nel mondo di array, stessa idea qui.
Se la colonna è rappresentata utilizzando caratteri di lunghezza fissa solo,
si può efficacemente indice in modo casuale a 60 o 120 o 180
e si possono ottenere presso singolarmente stringhe molto più rapidamente.
Poi se invece, la colonna aveva un regolo di sinistra per così dire
ma un diritto molto robusto bordo alla colonna
perché si potrebbe avere 10 caratteri,
15 caratteri, 5 caratteri.
Così anche questo è un compromesso.
E a volte solo attraverso tentativi ed errori
e sperimentazione si può capire
che cosa realmente la chiamata giusta è ma questi sono i tipi
di domande che dovrebbe andare
attraverso le vostre menti e / o Tavoli quando arriva il momento
per progettare il vostro database.
Quindi, non necessariamente di destra rispondere, ma si dovrebbe
almeno avere un po ' frase o due in mente
per il backup qualunque decisione che prendete.
Bene.
Quindi cerchiamo di mantenere lo scorrimento nelle istruzioni qui
che sono l'interfaccia utente di phpMyAdmin.
Così, il valore predefinito per un nome, devo specificare
che dovrebbe essere avere un valore predefinito null?
Cosa ne pensi?
Può un corso di avere un nome nullo?
Appena si sente strano, giusto?
Non riesco a pensare di qualsiasi corsi senza nome di Harvard.
E forse c'è qualche caso oscuro angolo
in cui un corso viene assegnato un numero
e il professore non ha scelto un nome per esso, ma -
Voglio dire, al diavolo che,
come cerchiamo di non ancora preoccuparsi di supporto che.
Direi di interesse di un bel database pulito,
cerchiamo di specificare che non si può avere un valore predefinito null.
In alternativa, potremmo fare qualcosa come corso untitled
che non è a differenza di Mac OS e Windows fare
quando si crea un cartella, per esempio,
ma che rende un po 'più senso
in modo che l'umano visto qualcosa.
Stiamo parlando di un database back-end presumibilmente
per il catalogo dei corsi.
Quindi io non davvero anche come l'idea di darlo
nei nomi corso untitled
dal momento che non è proprio andando ad aiutare chiunque.
Quindi lasciamo questo come nessuno, il che significa che quando si inserisce
in questo database, è necessario per dare ad ogni corso un nome
che si sente un po ' pulitore a me.
Bene.
Così scorrimento ulteriormente, le regole di confronto.
Questo ha solo a che fare con set di caratteri e quant'altro
se avete mai visto menzioni di svedese
in phpMyAdmin che è Perche 'il popolo
che ha scritto phpMyAdmin erano svedese.
È che PHP o è MySQL?
Uno dei due, dimenticato improvvisato.
Ma è per ragioni storiche
ma è possibile esprimere ogni personaggio in inglese
che si potrebbe con Swedish quindi è in gran parte un non-problema.
Il CS50 Appliance è però utilizzato - configurato per utilizzare UTF-8,
in modo che generalmente dovrebbe non pop up per voi.
Attributi.
Quindi, nessuno di questi sono davvero rilevante qui.
Vedo binario, Unsigned, ZEROFILL Unsigned,
e l'aggiornamento timestamp corrente.
Quel campo è applicabile solo per qualche campo numerico
o alcuni campi di tempo.
Quindi dovremo saltare su che del tutto.
Null. Può questo campo è nullo?
Quindi non. Abbiamo già quel genere di conversazioni.
Quindi non vogliamo un valore predefinito.
Noi non vogliamo che sia nullo.
Che dire index?
Ci sono quattro scelte qui.
Cosa significa se specifichiamo
che questa riga sta andando essere una chiave primaria?
Ripensando a CS50 o CS165 se hai preso.
[Inaudible Osservazione]
Esattamente. Quindi una chiave primaria per definizione è il campo
che identifica in modo univoco ogni riga in questa tabella.
E si può fare affidamento su di esso per fare che l'identificazione unico.
Allora, che cosa vuol dire poi essere solo unico?
Beh, specie di questi due ha sort
di sotto implicazioni sotto la cappa.
Ma in generale, la chiave primaria è una sorta di contratto di fate
con la cosa database.
Quando faccio le query alla ricerca di un corso,
Ho intenzione di utilizzare questo particolare settore.
E noi torneremo a perché potremmo avere due
tali scelte qui, primaria o univoca.
Unique dice solo, questo campo sta per essere unico
ma non sto davvero facendo qualsiasi tipo di impegno verbale qui
usare quel campo per fare le mie ricerche
per motivi di Ti vedere in un attimo.
Se specifichiamo invece indice, cosa significa per specificare
che un campo ha un indice su di esso?
Sì?
[Inaudible Osservazione]
Esattamente. E 'stato ottimizzato per query.
Quindi - server di database, Oracle, MySQL, qualunque sia,
generalmente la sua magia dietro le quinte, una volta che si fa clic su
questa opzione e quindi fare clic su Salva e costruirà
up tipicamente una struttura ad albero, B-alberi se hai visto
o sentito fuori che è un albero a brevissimo cercando
che ti dà molto bello proprietà logaritmiche
durante la ricerca dei dati.
Se non si specifica un indice su un campo, quello che sta succedendo
essere il funzionamento Tempo di ricerca
per un arbitrario [Fonetica] nome del corso?
Che cos'è?
[Inaudible Osservazione]
Oh, [incomprensibile], lineare, giusto?
Se non c'è nessuna ottimizzazione accordata alla banca dati
e non hai pensato il database che tipo
di dati da aspettarsi.
Il meglio che puoi fare è verificare tutto quando stai cercando
per qualche valore, soprattutto se ci potesse
in effetti essere duplicati.
-Testo integrale nel frattempo, faremo onda le nostre mani per ora.
Ma in generale, questo è un tipo di indice che consente
ottimizzare per parola chiave ricerche su un campo.
Quindi questo potrebbe essere un buon candidato
per come una descrizione del corso dove si potrebbe avere una coppia
di paragrafi e si potrebbe vuole fare corrispondenze a sottostringhe.
Full-text generalmente permetterà hai fatto abbastanza efficiente.
AI, questo è una sorta orribile di spiegazione ma se passaggio del mouse
su di esso si vedrà Incremento automatico.
Non applicabile sia qui ma incremento automatico è utile
per come campo di un int perché il database si prenderà cura
del processo di più Plusing ogni volta che fate un inserto.
Così che, anche se due persone letteralmente fare clic su Inoltra
Allo stesso tempo e provare per creare una riga in qualche modo
nel database, uno dei essi avranno il numero I,
l'altro otterrà il numero che più 1.
Non devi preoccuparti
circa due numeri assegnato in modo identico se tu fossi
di farlo da soli nel codice.
Bene.
Quindi ho un po 'come se abbiamo un nome per essere.
Quindi cerchiamo di fare clic su Salva.
È questo un buon progetto per una tabella di database?
E per inciso, se arrugginito su SQL o si ordina
di appena girare sempre un cieco occhio a quello che stava succedendo,
Avrei potuto digitato esattamente questo -
queste tre linee che pronta in bianco e nero
nella riga di comando cliente o avrei potuto fare
che nel codice di programmazione.
Quindi tutto phpMyAdmin sta facendo per me, è solo a me risparmiando la fatica
di ricordare a volte la sintassi e digitando per
come comandi noiosi.
Bene.
Quindi questo non si sente come l' miglior design, un tavolo un campo.
Ora potremmo avere cose come professori
e le posizioni e descrizioni.
Ma anche allora, utilizzando solo il nome
identificare corsi non si sente ideale.
Cosa hanno in genere abbiamo fatto in passato
se hai utilizzato dei database in modo univoco le righe?
Non usando VARCHAR genere.
Sì?
[Inaudible Osservazione]
Già. Quindi tipicamente un ID corso.
Così, il più comune avvicinare qui soprattutto
quando si utilizza un quadro è in realtà solo
utilizzare un numero come un numero intero.
Quindi, permettetemi di andare avanti e fare questo.
E possiamo farlo in pochi modi, ma l'avviso se lo zoom
in sul fondo qui.
Io vado a dire aggiungere un colonne alla fine del tavolo,
in genere solo per visive convenienza si mette ID
all'inizio della tabella anche se questo non ha un vero
impatto funzionale.
Quindi ho intenzione di dire aggiungere una colonna
all'inizio della tabella.
Io vado a fare clic su Vai, che mi restituisce questo UI qui.
Chiamiamo questo ID.
Se pensiamo che stiamo andando ad avere non più fatto 4 milioni di corsi
campo di un int va bene.
Potremmo anche ridursi giù
ma lo spazio è a buon mercato così che importa veramente.
Ma, stiamo cercando di Scrivi Facebook ora,
potrebbe non essere una cosa negativa di anticipare grandi int
che ci darebbe interi a 64 bit
ma allora sei letteralmente raddoppiando il numero di bit
che si sta utilizzando, compromesso in modo minore
ma una cosa da considerare.
Ora, questa è una confusione legacy cosa.
Si potrebbe ricordare da utilizzare MySQL
che ogni volta che si dichiara un int campo vedrete spesso un numero
accanto ad essa come il numero 10.
Non ha nulla a che fare con la dimensione del numero
o il numero di bit.
Che ha a che fare con il numero di caratteri che vengono utilizzati
visivamente visualizzazione quel campo int
quando si utilizza una finestra di terminale.
Così possiamo vedere che in un attimo.
Quindi, non lasciatevi ingannare digitando i numeri
lì anche se è effettivamente ci chiede
per uno qui.
Qui, ho intenzione di andare avanti e dire unsigned.
Non c'è alcun motivo per rifiuti tutti i nostri numeri negativi
Poiché il database è generalmente andando
di assumere positivo valori o nullo.
L'ID sicuramente non dovrebbe essere nullo.
E cosa ne pensi l'indice per questo campo ID?
Facciamo primario.
Quindi, cosa succede se, però, come posso solo pensare ad un corso CS164
ad Harvard e un solo Naturalmente CS50 ad Harvard
e questo è abbastanza tanto vero globale
che non c'è forse eccezioni [Incomprensibile] entrambi i semestri
o qualcosa di strano genere.
Ma più fondamentalmente, perché è meglio
utilizzare un ID integrale numerico identificare in modo univoco i corsi piuttosto
di una semplice stringa univoca?
Sì?
[Inaudible Osservazione]
OK, interessante.
Quindi, se avessimo una sorta di Corsi di cross-quotata.
Quindi questo è un buon esempio.
Io non sono sicuro che sarebbe risolvere che, sebbene
dando loro la stessa Numero ID se è
dove andavi con quello.
No? OK. Ma sicuramente un caso angolo da considerare.
Se vi è una sorta di - abbiamo bisogno di un qualche tipo
di aliasing potenzialmente.
[Inaudible Osservazione]
Certo.
[Inaudible Osservazione]
Questo è un buon esempio.
Il nome potrebbe cambiare nel corso tempo, assolutamente ragionevole.
Che altro?
[Inaudible Osservazione]
Ci dispiace dirlo di nuovo.
[Inaudible Osservazione]
Sì, esattamente.
Quindi, in realtà, che è il vero copertoncino è
che utilizzando un int a 32 bit è probabilmente sarà più veloce
di alcune variabili campo char lunghezza.
Nel primo caso, la lattina letteralmente stare in un registro,
per non parlare molto minor richiesta di memoria.
In quest'ultimo caso, si sta andando di avere a che fare ricorso [fonetica]
di confronti di stringhe che in se stessi con il lineare
nella dimensione stringa potenzialmente.
Quindi, è solo un bel ottimizzazione,
e, in particolare, sta andando
a farci fare ciò che sono chiamati Join più efficiente
in un attimo.
Allora facciamolo.
Ti precisiamo che questo è primario
perché io non particolarmente desiderare di cura o pensare
su ciò che il numero è di un corso.
Lasciate che assumono qualunque valori che vogliono.
Io vado a dire incremento automatico così posso esternalizzare quel dettaglio.
Come in parte si potrebbe sapere che Harvard
almeno ha unico numeri per i corsi.
Non ho alcun ricordo ciò che questo corso è.
So che CS50 di numero di catalogo è 4949,
completamente arbitrario.
Ma c'è di strano casi angolo a che anche
nella discarica registrarial naturalmente dati di catalogo,
talvolta corsi, vecchi corsi hanno un numero come 4.
Ma tecnicamente che campo è un campo char
che inizia semplicemente con il 0004.
Quindi anche qui, bisogna essere attenti a distinguere
tra le cose come un Naturalmente numero di catalogo
che potrebbe avere qualche umana nozione di lunghezza fissa, 0004,
e non si deve conservare che, per esempio in un int.
Questo tipo di campo dovrebbe essere trasferito.
Quindi, in Harvard, se fossimo in realtà facendo un corso
strumento di shopping, è probabilmente non sufficiente
per corsi a numero con solo 1, 2, 3, 4.
Probabilmente stiamo andando ad avere
di avere un altro campo chiamato numero di catalogo,
che è anche ricevere essere univoco basato
su convenzioni umane qui ma non è la scelta migliore
per un identificatore unico perché potrebbe essere di lunghezza variabile.
Potrebbe non essere quattro caratteri, potrebbe essere cinque.
In realtà, credo che un paio di anni fa si muovono
a causa di cinque personaggi vi erano più di 999 corsi
in totale o qualcosa di simile che, o 9.999 corsi.
Così, che potrebbe essere un esempio dove il campo non è primaria
ma dovrebbe essere univoco.
E-mail è un altro.
Si potrebbe desiderare che sia unico
ma non necessariamente la chiave primaria.
Bene.
Quindi lasciatemi sbattere fuori un altro Tavolo molto più veloce di questo.
Quindi ho intenzione di chiamare questo uno Istruttori e vado
di dare una totale numero di colonne di due.
Ho intenzione di imparare il mio lezione l'ultima volta.
Io vado a chiamare la prima colonna ID.
Vado a chiamare il seconda colonna Nome.
Ho anche intenzione di fare Varchar.
Ho intenzione di assumere nessuno professore ha un nome più lungo
di 60 caratteri, anche se Ora questo potrebbe essere spingendolo
con alcuni nomi lunghi, speciale persone con nomi medie.
Questo va bene per oggi.
Quindi cerchiamo di scorrere qui.
Facciamo di nuovo questo segno.
Facciamo questo primario.
E ci permettiamo nomi duplicati
nel caso ci sia due John Smith o qualcosa di simile.
E ora abbiamo due tabelle.
Così ora, si pone la domanda come faccio io associo
nel istruttore con il corso?
Mi sento come tipo di ottenuto avanti di me
perché se un istruttore insegna un corso,
il mio primo istinto sarebbe effettivamente tornare indietro
ai corsi di rendersi conto, questa non era una buona idea.
Lasciatemi effettivamente aggiungere una colonna alla fine della tabella,
fare clic su Go, e io chiamare questo istruttore.
E farò questo varchar e farò questo 60.
E forse lascio nulla ora
nel caso in cui il corso non ha stato senza segno istruttore
che succede a volte prima termine inizia e fare clic su Salva.
Quale di questi disegni preferisci?
Primo dove abbiamo un tavolo di istruttore separata
o il secondo dove abbiamo appena aggiungere un campo al corso?
Quindi è un collegamento stretto istruttore di golf.
[Inaudible Osservazione]
OK. Buona. Ma lasciatemi spingere indietro.
E 'proprio così semplice come posso semplicemente digitare il nome della persona
in questa tabella, come sicuramente che ha un certo valore o -?
[Inaudible Osservazione]
Bene.
Beh, mi permetta di essere difficile qui.
Quindi lasciatemi dire che questo corso è CS51
e so che ha insegnato quest'anno da due persone.
Quindi, Henry Leitner e Jesse Tov ma -
quindi mi limiterò a mettere una virgola tra i due, a destra.
Sono veramente bravo a CSV da ieri.
[Inaudible Osservazione]
Esattamente, a destra.
Non appena si ricorre a qualcosa di simile,
che potrebbe sentire ragionevole e si potrebbe sentire
come questo è una specie di intelligente.
Sono una specie di prestito una idea che è quello di lavorare bene,
prendere in prestito una nuova idea e sorta di combinarli.
Stai genere di tutto sconfiggere il punto di utilizzare il database
in causa il primo posto ' se uno dei valori
di utilizzo è ricerche più veloci a causa dei vari indici
e tabelle che possono essere costruito per voi
dal motore di database stesso.
Ora, se si vuole cercare per tutti i corsi
che Jesse insegna, ora avete Per fare sottostringa corrispondente su tutte
dei campi istruttore,
il che significa che effettivamente lineare cercare di nuovo perche 'hai
per trovare questo insieme arbitrario dei tre personaggi ovunque
in materia istruttore preceduto
entro magari seguita da una virgola.
Quindi questo sicuramente non fa ben sperare.
Quindi lasciatemi tornare al tavolo.
Lasciami andare avanti per corsi, annullare tale.
Ho intenzione di andare solo avanti e rilasciare quel campo.
E se si vuole eseguire questa operazione manualmente,
la sintassi è ALTER TABLE corsi GOCCIA istruttore.
Quindi cerchiamo di andare avanti e dire sì a questo.
E ritornare a questa idea prima
dove ho un separato tavolo per istruttori.
Ma ora questo si sente un po ' come posso mettere un corso
nella tabella del corso e istruttore
nella tabella del docente, ma io in qualche modo ha bisogno di collegare i due.
E come faresti Proponiamo lo facciamo?
[Inaudible Osservazione]
Buona. Allora facciamolo.
E si potrebbe chiamare questo Tavolo in teoria nulla.
Io vado a deliberatamente chiamatelo come un sacco
dei quadri sarebbe chiamare, tra i quali,
Laravel come vedrete in un po '.
Ho intenzione di chiamarlo corso sottolineatura istruttore.
Utilizzando singolare in questa caso per ciascuna delle parole
e tutto in minuscolo di nuovo, e anche con il -
poi in ordine alfabetico ordinati da sinistra a destra.
Questo è totalmente arbitraria, ma tende ad essere una convenzione
in molti di questi quadri in PHP in altre lingue.
Quante colonne ho bisogno in questo ciò che noi chiamiamo un tavolo join,
per unire altri due tavoli insieme?
Tre colonne?
Quale - quali sarebbero?
[Inaudible Osservazione]
OK. Buona. Che funziona.
E abbiamo potuto tecnicamente tagliare un angolo qui, ma molto
di quadri, in particolare, sarebbe ancora dare anche queste righe
ID univoci anche se semanticamente la riga
che abbiamo davvero a cuore o le colonne che abbiamo veramente a cuore
merito sono le ultime due delle quello che hai detto, ID corso
e l'ID istruttore.
Quindi cerchiamo di fare questo.
Chiamerò questa riga appena ID, proprio come abbiamo fatto prima.
Ma questo io vado per chiamare ID corso.
Questo ho intenzione di chiamare ID istruttore.
E ho intenzione di specificare che tutti
di loro sono senza segno Perche 'voglio
per massimizzare il 4 miliardi gamma int.
Nessuno di loro dovrebbe essere nullo.
Io vado a specificare che ID dovrebbe essere ancora primaria.
E ancora, questo è solo una convenzione,
un sacco di quadri anche se non ordinare
di fondamentalmente bisogno di un identificatore univoco per la riga,
si scopre che è conveniente per il codice SQL che sta andando
essere automaticamente generato per noi.
Così lascio che come primario.
Ma ora, tipo di una decisione di progettazione,
ID corso e ID istruttore.
Cosa indici se dovrebbero arrivare?
Se lascio senza indici, qual è l'implicazione?
Cosa c'è un'implicazione?
Prestazioni come prima, giusto?
Se non vi è alcun indice, la migliore che puoi fare è di tipo
di [incomprensibile] attraverso l' cosa intera a cercare i numeri.
In modo che non si sente intelligente.
Dovrebbe essere primaria?
Quindi, perché no?
Perché non primario?
[Inaudible Osservazione]
Perfetto. Quindi noi rotoliamo out [fonetica] primario.
Abbiamo già scelto questo.
Quindi, dovrebbe essere unico?
[Inaudible Osservazione]
Buona. Quindi, se si assume un istruttore per corso,
tutto bene.
E questo è sicuramente il caso comune
ma abbiamo già messo fuori uno esempio forse familiare.
CS51 ha due istruttori così siamo genere
d'ora avvitata in quel caso.
Se abbiamo fatto consentire solo un istruttore,
potremmo effettivamente fare un modo con il join tavolo tutto,
tornare al metodo precedente
e non mettere il nome della persona ma forse ID del docente.
Se si conosce ogni corso come solo un istruttore si può avere solo
una colonna.
Ma la variabilità è ciò che ci ha messo nei guai.
Bene.
Quindi, dovrebbe essere unico?
No. testo integrale non sentirsi applicabile.
Come abbiamo detto prima che è
per come sottostringa corrispondenza per le descrizioni.
E per quanto riguarda l'indice?
Ebbene, l'indice è probabilmente il nostro miglior candidato
che racconta MySQL ottimizzare per le ricerche su questo
o Vorrei esporre, ottimizzare le ricerche o join
come vedremo tra un attimo
in modo che siano un poco più efficiente
di ogni altra cosa puramente lineare.
Voglio di auto incrementa questo campo?
Quindi no, perché il vero Esiste elemento padre
nella tabella dei corsi.
Ecco dove è sta per arrivare plus,
vantaggio quando in realtà inserito.
Ecco, questo è tutto andando essere inserito manualmente
da noi presumibilmente nel codice.
Quindi cerchiamo di semplicemente specificare che sia ID corso
e ID istruttore hanno indici.
Ora andiamo avanti e salviamo.
Ed ora, solo per dimostrare la corrispondenza
tra ciò che è una bella Interfaccia amichevole GUI
e l'interfaccia a riga di comando.
Lasciatemi andare avanti e fare il in seguito a questo prompt di MySQL.
Io vado a dire l'uso courses50
che è il nome arbitrario Ho dato a questo database.
E ora, io non so nemmeno Ricordiamo quello che abbiamo fatto.
Così mi permetta di digitare SHOW tabelle
e generalmente virgola sarà tuo amico qui
per terminare la query.
Ed è così.
Così qui sono le righe o piuttosto le tabelle che abbiamo qui.
Ora, non ricordo cosa un corso sembra,
per cui vorrei fare descrivo corsi e ora vedo una sorta di ASCII
o una versione di quello phpMyAdmin stava facendo
e vedo che ID è un int.
C'è che 10.
Che cosa vuol dire?
Questo significa solo che quando si tratta di visualizzato sta andando a prendere
massimo 10 caratteri su la finestra del terminale.
È annullabile?
No. Questa è la chiave primaria.
Può avere un valore predefinito?
No. E in più, che è speciale bandiere come incremento automatico.
Così facciamo solo fare una coppia inserimenti dei veloci qui.
Ho intenzione di salire a - diciamo solo.
Cambiamo stato a una diapositiva
dove ho sorta di pre-preparo questo.
Questo è un riassunto poi di tutti e tre di tali tabelle.
Ho già solo manualmente digitato il primo comando.
E qui, sono andato avanti e digitare gli altri per voi.
Questo è solo l' cosa stilistica.
In generale, un sacco di gente digitare le istruzioni SQL in tutte le protezioni
e poi i nomi delle tabelle e nomi dei campi in minuscolo,
se non altro perché tipo di stand
che cosa è il tuo terminologia e qual è la sintassi del database.
Quindi qui abbiamo tre tabelle, corsi, istruttori,
e corsi istruttori.
Nella diapositiva che ho fatto in anticipo, Non ho avuto il campo ID
ma che non è in realtà una cosa affatto male.
Vorremmo solo vedere un terza colonna lì.
Se avessi fatto qui?
Così ora lasciatemi propongo facciamo un gruppo di inserzioni.
Quindi, ecco alcuni dati, Io lo zoom dentro
Quindi ho intenzione di proporre che in corsi,
abbiamo a che fare solo con i tre corsi.
E ho scelto questi tre Perche 'sono rappresentative
di qualche bella - hanno alcune proprietà belle.
CS1, CS50, CS51, hanno hanno crescenti ID
ma ciò che ID è ciò che è del tutto irrilevante.
Questo è solo l'ordine in cui sono stati inseriti automaticamente da me.
Che ne dici di istruttori?
Così ora, perché Henry Leitner insegna sia CS1 e CS51,
questo è una specie di un opportuno implicazioni per il nostro progetto.
E Jesse insegna CS51 e Malan insegna CS50.
Così ora - o meglio, questi sono solo ID univoci di quelle persone.
E corsi e istruttori, - corso istruttori, notano qui.
ID1 Corso, che è stato CS1 viene insegnato
da istruttore ID1 che è Henry.
ID2 Corso, che mi Ritieni stato CS50 viene insegnato
da istruttore ID2, che è Malan.
E poi, infine, CS51, e noti che ci sono due file.
E ora questo è il motivo per il join tabella è potente viene insegnato
sia da Henry e Jesse.
Quindi questo è tutto bello e buono,
ma posso a malapena ricordare la parte superiore
della mia testa chi è chi qui.
Come si può forse trattare con questo in codice,
senza dover Cose codice difficile?
Beh, questo è dove SQL sé comincia a diventare nostro amico.
E ho intenzione di proporre che possiamo digitare la seguente.
Farò questo a in richiesta attuale.
Lasciami andare avanti e inserire queste cose.
Quindi, nella tabella corsi cerchiamo di fare esattamente quello che abbiamo avuto una
momento fa.
Io vado a avanti e dire, inseriamo CS1 e CS50.
Inseriamo un paio di più righe alla volta, CS51.
Ora, lasciatemi andare avanti e salvare.
Va bene, quindi sono solo ricreando il più rapidamente
come posso rapporti abbiamo appena visto sullo schermo.
E così qui abbiamo Leitner, qui abbiamo Malan.
Diamo noi stessi un'altra fila, e Tov.
Ora vorrei salvare questo.
E sto facendo deliberatamente nello stesso ordine.
No, ho dimenticato di dare questo incremento automatico.
Consenti all'utente di risolvere rapidamente questo.
Ti preparo questo il codice linea.
Che non è riuscita come una digressione.
Il fatto che non potevo inserisci Leitner e Malan
e Tov fallito, perché non ho specificare un numero ID, anche se
si aspetta uno e ho ho dimenticato di controllare incremento automatico,
il che significa che erano tutti Per impostazione predefinita, ottenendo zero.
Ma che poi contraddice che proprietà che abbiamo specificato.
La chiave primaria è stata violata quindi non ha nemmeno lasciato fare a me.
Quindi lasciatemi risolvere questo problema.
Ora, lasciatemi tornare al Scheda Inserisci qui e specificare
che voglio Leitner, Malan e, ancora una riga, Tov.
E ora, infine, l'unica uno che è un po 'difficile
da ricordare è corso istruttore.
Inseriamo ora che Naturalmente ID1 è istruttore ID1
così che è CS1 e Henry.
ID2 corso è istruttore ID2 che è CS50 e Malan.
E poi gli ultimi che abbiamo a preoccupare è ovviamente ID3
che è CS51, viene insegnato
da istruttore del corso 1, che è Henry.
E tre come anche insegnato da 3, che è Tov.
Così si spera ora abbiamo ricreato questa -
accidenti, ho fatto la stessa cosa.
Istruttore del corso ha bisogno di incremento automatico.
Bene.
Farò questo più veloce questa volta, Corso 1, Corso 1, 2, 2.
Ed ora, infine, facciamo CS51 che ha corso ID3 e Henry.
E naturalmente ID3 e Jesse.
Che sembra buono.
OK. Così ora, torniamo alla finestra terminale.
Quindi, se io descrivo Corsi vedremo questo.
Se voglio vedere i corsi che posso ora fare seleziona stelle da corsi,
punto e virgola, e ora vediamo quei valori.
E ora, che altro cosa voglio fare?
Selezionare stelle da istruttori, che è come mi aspettavo,
e selezionare stella dai corsi - corso istruttore di sottolineatura.
Allora, come faccio ora unisco queste tabelle?
Così la bellezza di aver scelto i valori ID in questo modo è
che se ci pensate tenendo tabella naturalmente
e l'istruttore tabella e quindi inserendo
tra quei due in mente l'istruttore corso
tabella è possibile tipo di linea up tutte queste colonne ID
in modo che li si uniscono in una colonna massiccia che ha tutte
delle informazioni ci preoccupiamo.
La sintassi SQL per questo non è necessariamente evidente,
ma vediamo se possiamo farlo.
Quindi selezionare stelle da corsi,
e c'è un qualche modo come possiamo fare questo.
Sto andando a colpire Invio solo per tipo di cose ben formato,
ma che la freccia sia solo una sintomo dell'utensile lato client,
non ha nulla a fare con SQL stessa.
Quindi selezionare stella dai corsi.
Io vado ora ad aderire la tabella corsi
sul tavolo docente.
Come? Sul campo denominato courses.id corso pari
sottolineatura istruttore dot qual è il nome
del campo corrispondente qui che voglio una coppia.
Non è ID.
E'- che cosa, scusa?
>> ID corso.
OK, fammi zoom out.
Ma voglio prendere questo un ulteriore passo avanti.
Ora ho fatto questo tabella e questa.
Ora voglio tirare questo ragazzo in pure.
Quindi, mi permetta un ulteriore unire tutta questa faccenda
il docente del la tabella su cosa?
Sottolineatura Corso instructor.instructor id
pari instructors.id.
Così abbiamo potuto scrivere questa query in alcuni modi.
L'ordine in cui ho fatto questo non è poi così importante.
Ho solo tipo di fatto in la mia mente da sinistra a destra.
Avremmo potuto fare questo nei diversi modi
ma se ora ho l' punto e virgola e premere Invio,
notice torno un nuovo tabella temporanea, un set di risultati
per così dire nel database di parlare.
E che cosa devo in questa cosa?
Ho su ID, un nome, un altro ID, che è una specie di confusione
a me in questo momento, un ID del corso,
un istruttore ID, ID, e il nome.
Quindi, alla fine della giornata abbiamo i dati giusti momento.
Vedo che CS1 è insegnata da Leitner, CS51 viene insegnato
da Leitner e Tov, e CS50 è tenuto da Malan.
Ma io sono un po 'preoccupato questa ambiguità ho creato.
Qual è l'ambiguità Sto alludendo?
Sì?
[Inaudible Osservazione]
Ci sono tre colonne ID.
Così possiamo davvero risolvere questo problema e stiamo andando a realtà andando
di rinviare al nostro quadro in ultima analisi, di aiutarci con questo,
ma si scopre che non c'è una parola chiave in SQL chiamato S,
dove è possibile specificare un alias, un nuovo nome per un campo
in modo che possiamo evitare questo ambiguità del tutto.
Ma si rese conto che se non lo facciamo affrontare il problema in qualche modo come con
che parola chiave o un quadro,
c'è potenzialmente presente ambiguità se si tenta
per accedere al campo ID perché chiaramente ci sono quelli
con nomi duplicati lì.
Quindi questo è un join e penso con l'occhio della mente il modo migliore
a pensarci davvero è quello di prendere le due tabelle,
allinearli in modo desiderato.
E questo è un cosiddetto inner join in senso
che stiamo combinando le tabelle qui.
Ci sono altri tipi di join che potremmo incontrare
nel corso del tempo come outer join,
ma per la maggior parte questa è probabilmente il più comune
per ricostruire dati.
Quello che abbiamo fatto oggi è generalmente ciò che è chiamato
normalizzare i dati, in modo che non c'è duplicazione sul web
nelle tabelle.
E per la duplicazione, vorrei hanno fatto sì che primo approccio.
Se avessimo menzionato Leitner e Tov in luoghi diversi
nel database, non è generalmente la decisione migliore
soprattutto se il loro nome potrebbe cambiare lavoro straordinario o, nel caso
del matrimonio, cognome da nubile potenza cambiare sé ciò che vuole solo
luogo canonico per alcuni valore di dati come un nome.
Bene.
Quindi, per ricapitolare, abbiamo avuto una alcune decisioni di progettazione da fare
le più importanti probabilmente ridotto a qualche
di queste scelte di indici.
Ma vorrei sottolineare un'altra cosa pure.
Se dovessi tornare a phpMyAdmin,
una caratteristica che non potrebbe hanno incontrato prima è
il seguente.
Se vado a istruttore del corso, Ho già ha specificato che alcuni
di queste cose hanno indici.
Ma lasciatemi andare alla struttura Scheda del docente.
Lasciatemi fare clic ora su indici e notare quanto segue.
Ho specificato qui che vi è una chiave primaria
sulla colonna chiamata ID.
Questo è un po 'complicato modo di specificare cardinalità
e così via fatti ai la dimensione del campo in byte.
Ma ora ho anche un altro campo, ID del corso, che è -
ID corso che viene fatto in anticipo e unico, OK.
Ho fatto questo in anticipo per noi.
Quindi, perché è questo - lasciatemi cadere questo per il bene della discussione.
Oh, sai cosa ho fatto?
OK. Quindi, in precedenza, uno dei pericoli di utilizzare uno strumento GUI
così, quando eravamo La creazione di questo join tabella,
la tabella istruttore del corso, Ricordo che ho specificato
che voglio un indice su questo campo
e un indice in questa altro campo.
L'effetto collaterale di verificando tanto di quelle scatole
sullo stesso schermo è che phpMyAdmin dedurre che,
che voglio non due indici separati,
che voglio un indice di join che è in genere solo utili
o molto utile quando si è la ricerca su un campo non
ma entrambi questi campi.
Ed è per questo che abbiamo avuto li congiungono lì
così ho lasciato cadere perche 'questo Non era quello che intendevo.
Piuttosto, sto andando di rifare questo qui.
Ho intenzione di andare al ID corso
e in più io sono solo andare a dire aggiungere indice.
E ho intenzione di andare sotto ID istruttore e dire aggiungere indice.
E ora, se si clicca qui, noti che ci sono tre indici,
primario e come ho destinati uno per ciascun
di queste chiavi esterne.
E io chiamo straniera perché ID corso in questo mappe tavola
a quale campo, solo per essere cancellare, in un'altra tabella.
La chiave primaria denominato ID, nella tabella denominata corsi,
e accordo stesso per l'altro.
Ma ora, è un interessante trucco e molto tecnica.
Ho appena andato avanti e mi lascio farlo un po 'più lentamente.
Nella stessa schermata, avviso si dice vista Relation qui.
Clicco questo e ora mi accorgo arrivare a fare un paio di vincoli.
Quindi, uno dei pregi anche
non solo utilizzando concettualmente chiavi esterne e altre tabelle
come abbiamo appena su è che definendo un indice
su di loro si può avere la help database ancora più
garantire l'integrità di tale campo.
In particolare, posso ora specificare tramite questo calo
giù che il campo ID corso
in questa tabella realtà mappe a courses.id.
Allo stesso modo, istruttore di sottolineatura ID mappato instructors.id.
Ora, perché è utile?
Beh, si noti, sulla destra lato ciò che appare ora.
Ora posso insegnare il database che se Henry
per esempio sempre si ritira e la sua fila sparisce
dalla tabella del docente tutto essere così
cancellato, posso tramite questo cascata approccio garantire
che eventuali corsi che insegna sono non è più associato a lui.
Posso insegnare il database per eliminare le righe
in questa cosiddetta tabella di join automaticamente se Henry o se uno
dei suoi corsi scompare.
Ora, perché è questo avvincente?
Sì?
[Inaudible Osservazione]
Devi solo farlo una volta e lungo termine, giusto?
E 'molto facile se una sorta di le persone vanno e vengono, i corsi sono
e andare, il database potrebbe solo ottenere disseminato di corsi
e con i docenti che non sono più rilevante per il set di dati.
E i dati comincia a diventare molto disordinato e sporco e stantio,
e così qui possiamo ordinare
di rispettare alcune delle questi vincoli.
Sì?
[Inaudible Osservazione]
Si conosce per mezzo di questo.
Questa è la schermata dove stiamo specificando un collegamento
tra chiave esterna e la chiave primaria.
Così tutti i nomi convenzioni accennavo
in precedenza sono solo convenzioni.
Non c'è alcun significato intrinseco.
Questa è la schermata che è utile solo
dopo aver specificato indici su ciascuno di questi campi, come abbiamo fatto noi.
E per questo abbiamo discesa un paio di cose, per esempio
Se un corso viene cancellato si può effettivamente impedire che la cancellazione
accada se ci è una riga in questa tabella
semplicemente dicendo Limita.
In altre parole Henry non si può andare in pensione
fino a quando non lo disaccoppiare da CS51 e CS1.
Quindi questa è una buona cosa.
Ma potrebbe innescare errori nel codice
se non si prevede che, o possiamo avere una cascata,
una cascata simile a come fogli di stile CSS
e la cascata Cascata significa che se un -
se Henry si ritira così - ottenendo cancellato
così sarà la fila qui vengono eliminati.
Nessuna azione non significa nulla o nullo è una specie di utile se si tipo
di volere qualche record storico di Enrico aver insegnato CS51,
ma si vuole solo quel campo di essere nullo modo che le righe là
ma non è più associati con lui.
Quindi questi sono molto potenti tecniche che è possibile
e dovrebbe usare, anche se interesse particolare
di risparmio da te stesso.
Quindi, mi permetta di fare menzione di un paio di ultimi dettagli qui,
ingredienti con cui che potrebbe essere utile
come abbiamo in programma per la progettazione di database.
Avete anche la scelta il motore di database
che si utilizza nel codice.
Se avete familiarità di CS161 si potrebbe -
o anche 61, si potrebbe generalmente avere familiarità con i file system.
E ci sono cose come, NTFS e HFS +
e X2FS4 [fonetica] e 3 e così via.
Ci sono diversi modi di memorizzazione dei dati sulla scrivania.
Allo stesso modo ci sono diverse modalità di archiviazione dei dati
in un database di default almeno nel Appliance
con l'ultima versione di MySQL.
Abbiamo utilizzato l' motore di database chiamato, NODB,
che supporta una alcune caratteristiche piacevoli.
Ma un altro comune è anche chiamato MyISAM e un altro ancora
che può essere utilizzato è memoria, il che significa non mettere nulla
su disco, basta tenere cose in memoria.
Per la maggior parte probabilmente Non andrà male solo a partire
con NODB, ma per i progetti che tendono a coinvolgere alti tassi
di inserimento per esempio, come un sacco di rapida registrazione,
centinaia di cose al secondo o migliaia di cose.
Ogni volta che si dispone di un sacco di roba in corso
sul nel database allora questo tipo
decisioni a livello di minori iniziare a farsi coinvolgere.
La funzione di testo completo per esempio funziona solo in MyISAM
così che ha un implicazione.
Ma si può ricordare questo, cerchiamo di almeno motivare perché ci preoccupiamo
su NODB in particolare.
A condizioni di gara si riferisce generalmente a che cosa?
Va bene, questo è un allusione ad un esempio un po '
di potreste aver sentito in anni passati se 161 o 50
dove si ha un compagno di stanza, entrambi piace molto il latte,
uno di voi ottiene prima casa si apre il frigo non c'è latte,
chiudere la passeggiata frigo di tutti strade a CVS e ottenere
in fila per comprare il latte.
Nel frattempo, il tuo compagno di stanza torna qui.
Le piace anche il latte.
Aprire il frigo e realizza senza latte.
Eccola poi va al memorizzare, forse l'altro CVS.
Fast forward di un paio di minuti più tardi si torna e ora entrambi
di aver acquistato il latte.
Uno di loro sta ora a rovinare perché non lo fai
come il latte che tanto e questo è un problema, giusto?
Poiché entrambi controllati lo stato di una variabile
e preso una decisione basata su di essa anche se lo stato
di tale variabile era essenzialmente in procinto di essere cambiato,
tutto sia lentamente sul quantità di tempo necessario
da raggiungere e da CVS.
Così che cosa è una sorta di stupida reale soluzione mondiale a questo problema?
Lascia una nota, giusto?
E 'successo l'ultima volta.
Lasciare sempre una nota o lucchetto la cosa alla lettera.
E dico lucchetto, perché se si fa prendere o preso CS161,
bloccaggio è un fondamentale idea in che tipo di mondo.
Così possono nascere condizioni di gara anche nel mondo dei database
e si potrebbe ricordare forse da CS50 finanziare se hai preso 50,
questo codice che abbiamo effettivamente dato voi ragazzi nella specifica
al momento in modo che la vostra funzionamento è così chiamato atomico.
Se si voleva, in questo caso, acquistare una quota di azioni
e che la scorta ha qualche simbolo particolare.
Abbiamo detto di usare il codice come questo, perché per mezzo di questa
aggiornata chiave duplicata sintassi, che è costruito
in MySQL sei efficacemente facendo sia in insert
o in aggiornamento dopo facendo una selezione per vedere
se un titolo è già in là.
In altre parole, l'analogo in il mondo di acquistare uno stock
di latte e il frigorifero potrebbe essere, in primo luogo,
prima di acquistare una quota di Google si potrebbe desiderare di selezionare
dal database tutte le azioni di Google che David possiede
per vedere se possiede zero o più.
Una volta che vedete se possiede zero o più hai
per poi effettuare le seguenti operazioni.
O si deve fare un inserto
se egli possiede la causa zero ' non c'è fila per David ancora,
o dovete fare un aggiornamento se almeno in teoria desideri
avere una riga per ogni utente.
Il problema sta selezionando che il numero di azioni
e poi l'aggiornamento o inserimento può essere interrotta
da qualcun altro in un altro terminale di computer cercando di acquistare
o vendere alcuni dei David di azioni delle scorte se
per scopi buoni o liste di scopi malevoli.
E 'come andare al negozio quando il tuo compagno di stanza torna
e controlla lo stato della variabile.
Quindi questa sintassi al momento che era una sorta di adeguate
per CS50, evita che problema del tutto.
E lo fa solo tutto questo magia di bloccaggio per voi,
ma ora con questi tipi di progetti per questo corso
che molto probabilmente sarà coinvolgere insiemi di dati più complessi,
non è possibile ottenere sempre questa atomicità.
Tutto accade contemporaneamente o per niente
senza interruzione così elegantemente.
E così MySQL, un altro motore di database,
sostegno cose chiamate serrature,
per cui si può dire che questo blocco tavolo in modo che solo un ossequio
e generalmente solo utente può toccare in qualsiasi punto nel tempo
per leggere o scrivere e quindi è possibile sbloccarlo.
Questo è un esempio di uno dei propri riferimenti di MySQL,
dove se si dispone come una banca conto che si sta cercando
di detrarre soldi da e quindi aggiungere i soldi per.
Si potrebbe desiderare di assicurarsi che sia
di quelle cose accadere insieme
così che non c'è errori matematici
e senza perdite di uno soldi, in qualche modo.
Il problema con le serrature anche se in un database è
che significa generalmente l'intera tabella è bloccata,
che significa che se avete un centinaio di persone che cercano
di fare affari con la vostra banca in linea allo stesso importo
di tempo solo uno dei essi possono andare alla volta.
Che è stupido, soprattutto su server oggi
che hanno otto portate, 16 Certo, avere una quantità enorme
della memoria, non c'è motivo per serializzato tutti
delle transazioni se quelli i clienti sono solo andando
per interagire con le proprie righe.
Così NODB ti permette di fare le cose più intelligenti
e questo sarà generalmente l'approccio si prende in codice,
come si usa qualcosa chiamato la transazione.
E fate questo in genere nel codice PHP,
Codice Ruby, Python, a prescindere.
Ma il codice SQL che è in ultima analisi utilizzato è questo,
in genere.
Inizia transazione allora si specificare due o più query
che si desidera eseguire tutto
senza interruzione o per niente.
Non ci può essere anche un po ' seleziona dichiarazioni in
o alcune eliminazioni o aggiornamenti.
Ma la cosa bella è che l' database sarà abbastanza intelligente
per assicurarsi che solo i bloccare le righe sono in realtà
coinvolti in questo aggiornamento oppure sceglie o eliminazioni.
Quindi, se hai migliaia di righe e stai toccando solo tre
di loro, solo quel sottoinsieme della tabella sarà bloccato
il che significa che gli altri 99 i clienti possono toccare le loro righe
senza essere serializzato e rallentato da voi.
Nel frattempo, questo è il più bello aspetto da transazioni.
Si tratta di operazioni in un percepire come 161 su un file system,
sono transazionale
il che significa che si può rotolare indietro, è possibile annullare.
Questo è come il comando o controllare F di basi di dati.
Se si scopre parte modo attraverso tutti
del vostro vario funzionamento dei dati, sparare, qualcosa sta andando storto.
È letteralmente esegue una diverso rotolo query SQL indietro
e tutti questi tendenza - tutti delle dichiarazioni si eseguisse
dopo aver detto avvio transazione scomparire
come se non fossero mai accaduti,
che è una delle più suggestive cosa potente.
E questi sono i tipi di cose sicuramente nel 50 abbiamo liste
di spazzare sotto il tappeto e hai solo tipo di supporre
che tutto andrà bene.
Ma una volta che si avvia pensare a progetti reali
e utenti reali e la integrità del database,
questi sono i tipi di decisioni di progettazione
che stanno per essere importante.