>> Regulă.
Deci, fără alte formalități, SQL, Structured Query Language.
Deci, probabil, ați folosit acest lucru la cel puțin în CS50, poate în CS165,
poate în propria ta proiecte personale.
Și ce SQL lasa sa faci, într-un SQL Server, în general?
Da?
[Inaudibil Observație]
OK, asta a fost foarte mod securizat de a spune ea.
Da. Deci, vă permite vă pentru a stoca date
și permite mai important să interogare pentru date.
Și acesta este un pas înainte
utilizeze ceva simplu ca un CSV, drept.
Separate prin virgula Variabile.
Valori similare.
În mod similar vă permit să salvați informații un rând
într-un fișier text.
Dar ceea ce e dezavantaj de un Csv pentru stocarea datelor,
chiar dacă în mod eficient obține rânduri și coloane de la ea?
Da.
>> Nu "au aceeași organizație
Eficiența [inaudibil].
>> Nu aveți aceleași eficiența organizației.
Ce vrei să spui?
>> Ei bine, cum ar fi [inaudibil] au ca principal [inaudibil].
>> OK. Da.
>> Este o bază de date relațională puteți avea mai multe baze de date
legate între ele în moduri foarte specifice.
>> OK. Bun.
>> E [inaudibil] pentru a seta un CSV.
>> Și lasă-mă să tweak un pic de terminologie.
Tabele astfel încât mai multe într-o bază de date, sigur,
și care merge dincolo de ceea ce se poate face doar cu o CSV.
Dar, de fapt limitarea cu CSV aș argumenta este
că ineficiența toate.
Este foarte ușor de aspect.
Dar dacă vrei să faci o interogare, ceea ce este timpul de executie
din orice interogare de selectare pe un fișier CSV?
Vreau să spun că e mare vechi [inaudibil], dreapta, pentru că în cel mai rău caz,
ele au crescut la partea de jos.
Chiar dacă ai fi sortate în ansamblu CSV, dacă nu știi
că în avans, bine, sunteți încă de gând să aibă
pentru a căuta totul.
Astfel, printre lucrurile vom obține
de la utilizarea unui real bază de date folosind un limbaj
cum ar fi SQL este, putem interoga ea și putem în avans
ca designeri de baze de date precizează care sunt domeniile
care au fost probabil va avea întrebări cu privire la astfel încât oamenii
la MySQL sau Microsoft sau Oracle,
oricine a făcut în baza de date utilizați pot face toate
din munca grea de imaginind, OK,
dat un milion de aceste IDS.
Cum putem aspect - le în memorie?
Un fel de copac structura, probabil,
astfel că atunci când faci executa de fapt Select,
este ceva care este logaritmică sau logaritmică
de logaritmică în timp, mai degrabă de fapt, delegarea
în ceva liniar.
Deci avem o mulțime de performanță în acest fel.
Și putem stoca, de asemenea, mult mai mult date mai ușor pentru că SQL
Server sunt stocate în mod obișnuit în RAM chiar dacă părți
de ar putea fi stocate pe disc și probabil știți de acum
că RAM este, în general, mai repede decât discuri,
așa că e un lucru bun.
Și putem, de asemenea, ocupa concurenta mult mai bine.
Dacă ați luat 165 sau 161, știți că, dacă doi oameni încercați
să facă același lucru în același timp pe un sistem,
lucruri rele, în general, se poate întâmpla.
Deci, printre alte caracteristici noi se poate obține dacă vom proiecta mesele noastre
în mod corect este mai bine de sprijin și securitate
atunci când vine vorba de concurență.
Deci, doi oameni din două părți
din lume, folosind aceeași site-ul, în cazul în care ambii încerca
pentru a cumpara ceva de la aceeași timp, că pentru a nu se întâmplă
pentru a merge în același timp.
Cumva le-ar fi serializate de către o persoană, alta decât a noastră -
altcineva decât noi înșine.
Voința de baze de date face acest lucru pentru noi.
Deci, atunci când este mai simplă formă,
SQL ne permite o interogare baze de date relaționale.
O bază de date relațională este unul care are un
sau mai multe tabele în ea de obicei.
Și dacă acest lucru este o puțin necunoscut,
puteți într-adevăr cred că doar de acest lucru ca Excel sau numere
sau foi de calcul Google.
Pur și simplu are rânduri și coloane și de obicei în partea de sus a fiecărei
din aceste rânduri are un nume pentru el.
Deci, acest lucru ar putea fi ID-ul de coloana, coloana nume,
coloana adresă și așa mai departe.
Și apoi puteți avea mai multe astfel de tabele, dacă doriți
pentru a începe de stabilire în diferite tipuri de date.
Dar s-ar putea aminti cel puțin din CS50 că am încercat
pentru a vă oferi o baza de GUI instrument [inaudibil]
pentru a gestiona baza de date.
Acesta a fost numit phpMyAdmin.
Deci e doar o coincidență faptul că a fost scris în PHP, într-adevăr,
dar a fost doar un web-based front-end la o bază de date.
Și prin intermediul diferitelor file și link-uri, ar putea începe
pentru a configura o bază de date pentru tine.
Ci un instrument bun pentru a începe să a obține un pic mai confortabil
cu este, de asemenea, client linie de comandă.
Deci, în cazul în care utilizarea aparatului CS50 sau într-adevăr, folosind orice PC macro
care are o linie de comandă MySQL client, puteți, de asemenea, face un fel
scoala de vechi, cum ar fi aceasta.
Ca o parte a proiectului MySQL, cel puțin versiunea open source
din ea se numește acum MariaDB pentru diverse motive puteți citi
pe Wikipedia, dar e același software,
este aceeași sintaxă și așa mai departe,
destul de mult aceeași bază de cod.
Și așa, atunci când eu sunt la acest cere Pot să comunic acum
cu baza mea de date mult mai manual.
Astfel de caz de la punctul, lasă-mă să merg mai departe
și doar deschide o fereastră terminal.
I sa întâmplat să fie folosind CS50 Aparat, dar puteți face acest lucru
pe aproape orice sistem din care ai dreptul
software-ul instalat.
Și am de gând să fac MySQL-u pentru numele de utilizator John Harvard
pe acest sistem particular, p- pentru o parolă care voi tip
într-un pic mai mult în siguranță prin apăsarea Enter.
Acum am determinat.
Am de gând să tastați roșu în aparat CS50
și acum văd, în esență, că același ecran.
Dar există comenzi acum că putem începe să tastați
cum ar arata baze de date, și că o să-mi arate tot
a bazelor de date pe care le-am deja creat în sistem,
destul de mult aceeași listă te-ar vedea în phpMyAdmin.
Există o serie de alte persoane, cum ar fi schema de informare și de testare,
care dacă scormoni în jurul CS50 Appliance, ne ascundem unii
acestor tabele de nivel inferior
dar le-am fost acolo tot acest timp.
MySQL are de fapt un nivel scăzut proprietăți, cum ar fi nume de utilizator
și parole pentru baza de date în sine, nu pentru cererea dvs.
că ați putea fi care rulează pe partea de sus a acesteia.
Deci, în avans, ziua de azi, am a creat câteva baze de date,
dintre care unul este numit courses50.
Cote sunt unii dintre voi s-au folosit Desigur CS50 instrument de shopping,
care este o interfață de mare pentru Catalog de curs registratorului.
Și aceasta este de fapt un frumos set de date pentru a vorbi despre "cauza,
unul, suntem un fel de toate evident familiarizat cu cursuri
și instructori și de întâlnire locații și toate fel
de lucruri obișnuite de universitate,
dar este, de asemenea, are unele oportunități interesante
pentru proiectare.
Așa că ne-am gândit folosi noțiune de un catalog curs
și un instrument comercial ca de exemplu, de-a lungul astăzi pentru a sorta
de o parte din cadru proiectare deciziile pe care le avem de a face.
Așa că haideți să începem acolo.
Să presupunem că am vrut de fapt să reprezinte super-simple
unelte de cumpărături de curs.
Și mai simplu lumea Îmi pot imagina și unul este
în care există cursuri și există instructori.
Și să presupunem că pentru a de dragul discuției
că fiecare curs are cel puțin un nume.
Așa că haideți să începem să schița asta.
Am de gând să utilizeze phpMyAdmin doar ca o comoditate,
așa că nu trebuie să tastați în toate interogările manual.
Dar aici, eu sunt în mea Baza de date courses50.
Dacă familiarizat cu acest lucru, acesta va fi foarte ușor, odată ce se arunca cu capul
in pentru propriul proiect dacă doriți să-l folosească.
Am de gând să creeze un tabel numit Cursuri
și mă pot gândi doar de un domeniu
pentru acum, numele unui curs.
Am de gând să merg mai departe și să zicem da-mi o singură coloană.
Acum, după cum vă amintiți te o interfață care este un pic
ca aceasta.
Și cealaltă sensul creșterii sincer de phpMyAdmin este că un fel
de auto-de instrucție și care prin intermediul dropdowns, aveți posibilitatea să sortați
de a vedea ce este posibil dvs. decizii de design sunt.
Așa că am de gând să dea fiecare curs un nume.
Acesta este numele de această coloană.
Și cum despre tipul de date?
Cei mai mulți dintre voi ar trebui să știi la puțin unele dintre aceste tipuri de date
din experiența anterioară.
Ce este potrivit pentru nume de curs?
Sharon?
>> Varchar.
>> OK, varchar care este variabilă Char.
Și ceea ce face ca înseamnă mai multe punct de vedere tehnic?
[Inaudibil Observație]
OK. Deci, este un șir de caractere.
Și aspectul var a presupune ce?
Variabilă. Dar ceea ce înseamnă asta?
Da?
[Inaudibil Observație]
Exact. Deci, este o variabilă numărul de caractere
în șir în sus într-o anumită maxim.
Deci, aici e prima noastră decizie de design.
Noi de fapt, trebuie să decidă cât de multe bytes maxim
să aloce la fiecare astfel de șir.
În general vorbind, pe care doriți să un fel de a nu face prea mic,
nu face prea mare Pentru ca evident
dacă prea mic esti doar de gând să înceapă trunchiere date
și veți pierde informații.
Și dacă e prea mare, esti doar un fel de a spune bazei de date
să se aștepte și la optimizarea pentru mai multe date
decât s-ar putea obține de fapt, niciodată.
Deci, ce este un sentiment rezonabil număr de numele unui curs?
60? OK, deci 60.
Asta pare destul de rezonabil
atâta timp este nu există nici o excepții de la care.
Nu există într-adevăr nici o regulă greu, repede.
Pentru a fi sincer, pentru Din motive istorice, o mulțime
de oameni vor alege 255 Pentru că de ani de zile, care a fost un fel
de maxim prestabilit folosind 8 bytes - 8 biți ar fi contra ta.
Mi-ar mai mult [inaudibil] s-ar putea folosi puterile de 2
dar e un fel de irelevant.
Astfel încât să putem merge cu 60.
Care pare rezonabilă atât de mult timp
ca noi în cele din urmă nu-l regret Pentru că este o limită superioară.
Acum, să presupunem că opusul decizia a fost făcută,
caractere nu variabile, dar doar domeniul char.
Deci, spre deosebire de C și C + +, char nu înseamnă un char
și baze de date care înseamnă, în general, un număr fix
de caractere dintr-un șir.
Care ar fi sensul creșterii și / sau dezavantaj de a alege mele 60
pentru un câmp char, în loc de varchar?
Acest lucru este exact de primul tip de decizie va trebui să facă
când inspectează [fonetic] afară de proiect cu partenerii dumneavoastră.
Da, Sharon din nou.
[Inaudibil Observație]
Bun. Deci, dacă numele este mai
decât 60, atunci îți pierzi indiferent de faptul că delta este
între 60 și Lungimea efectivă.
Astfel că doar se simte risipitor, mai multe bytes decât aveți nevoie.
Dar de ce nu mai există?
Cu siguranță nu e ceva cu susul.
Da?
[Inaudibil Observație]
Sigur. Astfel încât, uneori, s-ar putea cunoaște numărul fix
de personaje, cum ar fi 10 cifre pentru un număr de telefon, de exemplu.
Dar cui îi pasă, cum ar fi de ce nu spun doar 11 oricum
sau de ce nu spune 60 oricum cu varchar?
Ce avantaj primim prin cunoașterea și proiectarea
pentru un număr fixat de caractere?
[Inaudibil Observație]
Ești pe drumul cel bun.
Deci, e de optimizare, dar este într-adevăr de - Da?
[Inaudibil Observație]
OK. Bun. Să se concentreze în ultima parte.
Deci indexare.
Deci, se dovedește, dacă știe în avans că toate
de câmpurile vor să fie de 60 de caractere,
vă puteți gândi într-adevăr a acestei coloană în baza de date Excel
ca având foarte drepte, stânga justificate
și marginile justificate dreapta
pentru că fiecare coloană este de 60 de caractere late.
Asta înseamnă că această șir este de 60 de caractere distanță
din acest șir, 60 caractere departe de acesta
și acesta și acesta.
Deci, la fel ca înapoi când învățat C, ai avut acces aleator
în lumea de tablouri, aceeași idee aici.
În cazul în care coloana este reprezentată folosind caractere lungime numai fixe,
vă poate în mod eficient index aleatoriu la 60 sau 120 sau 180
și puteți obține la individual siruri de caractere mult mai repede.
Apoi, dacă în schimb, coloana a avut o margine de stânga drept ca să spunem așa
ci un drept foarte robust margine la coloana
pentru că s-ar putea avea 10 de caractere,
15 caractere, 5 caractere.
Deci, aceasta este de asemenea un compromis.
Și, uneori, doar prin încercare și eroare
și experimentare poate îți dai seama
ce într-adevăr apel corect este, dar acestea sunt tipurile
de întrebări care ar trebui să fie merge
prin mintea voastră și / sau tabele atunci când vine vorba de timp
pentru a proiecta baza de date.
Deci, nu neapărat corect răspunde, dar ar trebui să
cel puțin câteva propoziție sau două în minte
de rezervă, indiferent de decizie pe care o face.
Bine.
Deci, haideți să țină defilare în instrucțiunile de aici
că sunt UI phpMyAdmin lui.
Deci, valoarea implicită pentru un nume, ar trebui să specificați
că ar trebui să fie să aibă o valoare implicită de nul?
Ce crezi?
Poate un curs au un nume nul?
Doar se simte ciudat, nu?
Nu mă pot gândi la orice cursuri anonime de la Harvard.
Și poate că există unele caz colț obscur
în cazul în care un curs este dat un număr
și profesorul nu are ales un nume pentru el, dar -
Adică, la naiba cu asta,
ca să nu mai e deranja sprijinirea asta.
Aș spune că, în interesul a unei baze de date curat frumos,
să precizeze că nu se poate au o valoare implicită de nul.
Alternativ, am putea face ceva de genul curs fără titlu
care nu este, spre deosebire de Mac OS și Windows face
atunci când creați o folder, de exemplu,
dar acolo care face un pic mai mult sens
astfel că omul vedea ceva.
Vorbim despre o Baza de date back-end, probabil,
catalog de curs.
Deci, eu nu prea mai cum ar fi ideea de a oferi o
în numele curs untitled
din moment ce nu este adevărat va ajuta pe nimeni.
Așadar, să lăsăm acest lucru ca nici unul, ceea ce înseamnă că atunci când introduceți
în această bază de date, aveți pentru a da fiecare curs un nume
care se simte un pic curat pentru mine.
Bine.
Deci defilare în continuare, colaționare.
Acest lucru are de a face doar cu seturi de caractere și fleacuri
dacă le-ați văzut vreodată menționează din suedeză
în phpMyAdmin care este Pentru ca oamenii
care a scris phpMyAdmin au fost suedez.
Este ca PHP sau este MySQL?
Unul dintre cei doi, am ai uitat dezinvolt.
Dar este pentru motive istorice
dar vă puteți exprima fiecare caractere în limba engleză
care ai putea cu suedeză așa că este în mare măsură o problemă non-.
CS50 Appliance, deși este folosit - configurat pentru a utiliza UTF-8,
astfel că, în general, ar trebui nu pop-up pentru tine.
Atribute.
Deci, nici una dintre acestea sunt într-adevăr relevant aici.
Văd Binary, nesemnat, Zerofill nesemnate,
și pe actualizare timestamp curent.
Acest domeniu se aplică numai pentru unii câmp numeric
sau unele domenii de timp.
Așa că vom sări peste care în întregime.
Null. Poate acest domeniu să fie nul?
Deci, nu. Avem deja acest tip de conversații.
Deci, noi nu vrem o valoare implicită.
Noi nu vrem să fie nul.
Ce despre index?
Există patru opțiuni aici.
Ce înseamnă dacă am specifica
că acest rând se întâmplă a fi o cheie primară?
Gândire înapoi la CS50 sau CS165 dacă ai luat-o.
[Inaudibil Observație]
Exact. Deci, o cheie primară prin definiție este câmpul
care identifică unic, fiecare rând din acest tabel.
Și vă puteți baza pe ea pentru a face ca unic de identificare.
Deci, ce înseamnă apoi a fi doar unic?
Ei bine, un fel de aceste două are un fel
de sub implicații sub capota.
Dar, în general, cheie primară este un fel de contract de a face
cu lucrul de baze de date.
Când m-am face interogări în căutarea pentru un curs,
Am de gând să utilizeze acest anumit domeniu.
Și ne vom întoarce la de ce ne-ar putea avea două
astfel de alegeri aici, primar sau unic.
Unic spune doar, această câmp va fi unic
dar eu nu sunt într-adevăr face orice un fel de angajament verbal aici
de a utiliza acest domeniu de a face căutări mele
pentru motive vom a se vedea într-o clipă.
Dacă vom specifica în schimb index, ce înseamnă să precizeze
că un câmp are un index pe ea?
Da?
[Inaudibil Observație]
Exact. A fost optimizată pentru interogare.
Deci tu - server de baze de date, Oracle, MySQL, oricare ar fi,
va lucra în general magia în spatele scenei o dată ce faceți clic pe
ca opțiune și apoi faceți clic pe Salvați și se va construi
up de obicei, o structură arborescentă, B-arbori dacă ați văzut
sau auzit off, care este un copac foarte scurt în căutarea
care vă oferă foarte frumos proprietăți logaritmice
atunci când caută pe datele.
Dacă nu specificați un index pe un teren, ce se întâmplă
să fie pornit timp de căutare
pentru un arbitrară [Fonetic] nume de curs?
Ce-i asta?
[Inaudibil Observație]
Oh, [inaudibil], liniar, corect?
În cazul în care nu există nici o optimizare acordată în baza de date
și nu te-ai gândit baza de date ce fel
de date pentru a aștepta.
Cel mai bun il poti face este de a verifica tot atunci când sunteți în căutarea
pentru o anumită valoare, mai ales dacă ar putea
în fapt, să fie duplicate.
Full-text între timp, vom val mâinile noastre de acum.
Dar, în general, aceasta este o tip de index, care vă permite
pentru a optimiza pentru cuvinte cheie caută pe un câmp.
Deci, acest lucru ar putea fi un candidat bun
pentru ca o descriere curs în cazul în care ar putea avea un cuplu
de paragrafe și s-ar putea vrei sa faci meciuri subșir.
Full-text, în general, va permite să faci asta destul de eficient.
AI, aceasta este un fel oribil de explicație, dar, dacă ne-am hover
peste acesta, veți vedea Auto Increment.
Nu se aplică atât aici dar creștere auto este util
pentru ca teren un int, deoarece baza de date va avea grijă
procesului de plus plusing de fiecare dată când face un insert.
Astfel încât, chiar dacă două persoane literalmente faceți clic pe Submit
în același timp și să încerce pentru a crea un rând într-un fel
în baza de date, unul dintre le va primi numărul I,
celălalt va primi numărul I plus 1.
Nu trebuie să vă faceți griji
aproximativ două numere fiind atribuit identic dacă ai fi fost
pentru a face acest lucru singuri în cod.
Bine.
Asa ca am un fel de place unde avem un nume să fie.
Deci, haideți să faceți clic pe Salvare.
Este aceasta un design bun pentru un tabel de bază de date?
Și, ca o parte în cazul în care ruginit pe SQL sau de sortare
de doar rândul său, întotdeauna un orb ochi pentru ceea ce se întâmplă,
Aș fi putut să tastat exact asta -
cele trei linii de la care promptă alb-negru
în linia de comandă client sau am fi putut face
că în codul programatic.
Astfel încât toate phpMyAdmin este de a face pentru mine, este doar de mine economisire efortul
de a ne aminti, uneori, sintaxa și tastarea pentru
cum ar fi comenzi de plictisitoare.
Bine.
Deci, acest lucru nu se simte ca cel mai bun design, o masă de teren unul.
Acum, am putea avea lucruri cum ar fi profesori
și locații și descrieri.
Dar chiar și atunci, folosind doar nume
pentru a identifica cursuri nu se simte perfect.
Ce au în general am făcut în trecut
dacă ați folosit baze de date a unic, rânduri?
Nu folosesc varchars de obicei.
Da?
[Inaudibil Observație]
Da. Deci, de obicei, un ID de curs.
Deci, cele mai frecvente se apropie aici mai ales
atunci când se utilizează un cadru este de fapt doar
de a utiliza un număr ca un întreg.
Deci, lasă-mă să merg mai departe și de a face acest lucru.
Și putem face acest lucru în câteva moduri, dar o notificare dacă am zoom
în partea de jos pe aici.
Am de gând să spun adăuga un coloane la sfârșitul tabelului,
în general, doar pentru vizuale comoditate ai pus ID-uri
la începutul tabelului chiar dacă acest lucru nu are nici o reală
impact funcțional.
Așa că am de gând să spun adăuga unul coloane
la începutul tabelului.
Am de gând să faceți clic pe Du-te, că mi-a dat înapoi acest UI aici.
Să numim acest ID.
Dacă ne gândim că vom avea nu mai facut 4 milioane de cursuri
câmp un int este în regulă.
Chiar am putea micsora jos
dar spațiul este ieftin deci cui îi pasă cu adevărat.
Dar, încercăm să Trimite pe Facebook acum,
nu ar putea fi un lucru rău pentru a anticipa int mari
care ne-ar da int pe 64 de biți
dar atunci esti literalmente dublarea numărului de biți
pe care îl utilizați, compromis atât de minor
dar ceva să ia în considerare.
Acum, acest lucru este un confuz lucru moștenire.
S-ar putea aminti de la folosirea MySQL
că oricând declara un int câmp veți vedea de multe ori un număr
lângă el ca numarul 10.
Nu are nimic de-a face cu mărimea numărului
sau numărul de biți.
Care are de a face cu numărul de de caractere care sunt folosite
la vizual de afișare acest domeniu Int
atunci când se utilizează o fereastră terminal.
Deci, putem vedea că într-o clipă.
Deci, să nu fie induși în eroare prin tastarea numere
acolo, chiar dacă este eficient ne cere
pentru unul aici.
Aici, am de gând să mergeți mai departe și spune nesemnate.
Nu există nici un motiv pentru a deșeurilor toate numerele noastre negative,
deoarece baza de date se întâmplă în general
să-și asume pozitiv valori sau nul.
ID-ul de siguranta nu trebuie să fie nulă.
Și ce crezi despre indicele pentru acest domeniu de identitate?
Hai să-l primar.
Deci, ceea ce în cazul în care, totuși, cum am putea cred că numai de un curs CS164
la Harvard și un singur Desigur CS50 la Harvard
și asta e destul de mult adevărat global
că există, poate, excepții [Inaudibil] ambele semestre
sau ceva ciudat de genul asta.
Dar mai fundamental, de ce este mai bine
pentru a utiliza un ID numeric integrantă a identifice în mod unic de cursuri, mai degrabă
mult decât doar un șir unic?
Da?
[Inaudibil Observație]
OK, interesant.
Deci, dacă am avea un fel de cursuri de eco-enumerate.
Deci asta e un exemplu bun.
Eu nu sunt sigur că ar fi rezolva că, deși
oferindu-le același lucru Numărul de identificare în cazul în care este
unde te duci cu asta.
Nu? OK. Dar cu siguranta o caz colț să ia în considerare.
Dacă există un fel de - avem nevoie de un fel
de aliasing potențial.
[Inaudibil Observație]
Sigur.
[Inaudibil Observație]
Acesta este un exemplu bun.
Numele ar putea schimba peste timp, total rezonabil.
Ce altceva?
[Inaudibil Observație]
Ne pare rău, spun din nou.
[Inaudibil Observație]
Da, exact.
Deci, într-adevăr, asta e clincher real este
că folosind un 32-bit int este probabil, va fi mai rapid
decât unele variabile câmp char lungime.
In primul caz, cutia se potrivesc pur și simplu într-un registru,
să nu mai vorbim mai mult amprenta de memorie mai mic.
În acest ultim caz, ai de gând pentru a avea de a face statiunea [fonetic]
la comparații șir care în ei înșiși, cu liniar
în mărimea șir potențial.
Deci, e doar un frumos optimizare,
și, în special, că va
să ne lase să facem ceea ce se numește Se alătură mai eficient
într-o clipă.
Deci, haideți să facem asta.
Vom preciza că aceasta este primar
pentru că eu nu deosebit de doresc să aibă grijă sau credeți că
despre ceea ce numărul este de un curs.
Lasă-i să ia în indiferent de valorile pe care doresc.
Am de gând să spun creștere auto așa că am putea externaliza acest detaliu.
Ca și în parte s-ar putea Știu că Harvard
cel puțin are unic Numerele de cursuri.
Nu am nici o amintire ceea ce este de aceste cursuri.
Știu că e CS50 Numărul de catalog este de 4949,
complet arbitrar.
Dar nu e ciudat cazuri colț în care, chiar
în groapa de gunoi registrarial desigur date catalog,
uneori cursuri, vechi cursuri au un număr de ca 4.
Dar punct de vedere tehnic, care câmp este un câmp char
care pur și simplu începe cu 0004.
Deci aici, va trebui să fie atent despre a distinge
între lucruri, cum ar fi o Desigur, numărul de catalog
care ar putea avea unele uman noțiune de lungime fixă, 0004,
și nu ar trebui să stocați ca, de exemplu, într-un int.
Acest tip de domeniu ar trebui să fi stocate în altă parte.
Deci, în Harvard, dacă ne-am a face de fapt un curs
instrument de shopping, e probabil nu suficient
la cursuri de numărul cu doar 1, 2, 3, 4.
Suntem, probabil, va avea
de a avea un alt domeniu numit număr de catalog,
care este, de asemenea, ar trebui pentru a fi unic, bazat
la convențiile umane aici dar aceasta nu este cea mai buna alegere
pentru un identificator unic, deoarece ar putea fi de lungime variabilă.
S-ar putea să nu fie de patru caractere, ar putea fi cinci.
De fapt, cred că o câteva ani în urmă se misca
la cauza cinci caractere "acolo au fost mai mult de 999 de cursuri
în total, sau ceva de genul care, sau 9.999 de cursuri.
Deci, care ar putea fi un exemplu unde câmpul nu este primar
dar ar trebui să fie unic.
Si adresa de e-mail este un altul.
S-ar putea dori să fie unic
dar nu neapărat cheia primară.
Bine.
Deci, lasă-mă să-bang-ului pe un alt tabel mult mai rapid decât acesta.
Așa că am de gând pentru a apela acest unul Instructorii și am de gând
pentru a da aceasta un total de Numărul de coloane din două.
Am de gând să învețe meu lecție de la ultima dată.
Am de gând pentru a apela primul ID-ul de coloană.
Mă duc să sun la de-al doilea nume coloana.
Am, de asemenea, de gând să faci varchar.
Am de gând să-și asume nici o profesor are un nume mai lung
mult de 60 de caractere, deși acum acest lucru ar putea fi împingându-l
cu unele nume lungi, special persoane cu nume de mijloc.
Asta e bine pentru ziua de azi.
Deci, haideți să defila pe aici.
Să facem din nou acest nesemnate.
Să facem acest primar.
Și vom permite nume duplicat
în cazul în care există două John Smith sau ceva de genul asta.
Și acum avem două mese.
Deci, acum, acest lucru îl imploră întrebarea cum pot asocia
în instructor de curs?
Simt ca am un fel de Trebuie înainte de mine
pentru că în cazul în care un instructor predă un curs,
Primul meu instinct ar fi fi de fapt pentru a merge înapoi
la cursuri realiza, acest nu a fost o idee bună.
Permiteți-mi să adaug, de fapt o coloană la sfârșitul tabelului,
faceți clic pe Du-te, și eu voi numesc acest Instructor.
Și voi face acest lucru varchar și voi face acest lucru 60.
Și poate că voi pleca nul acum
în cazul în care, desigur, nu are fost unsigned în instructor
care se întâmplă, uneori, înainte de Termenul începe și faceți clic pe Salvare.
Care dintre aceste modele ai prefera?
Primul unde avem o masa instructor separat de
sau a doua în care ne-am adăuga un câmp la cursul?
Deci, este o legătură strânsă instructor de curs.
[Inaudibil Observație]
OK. Bun. Dar lasă-mă împinge înapoi.
E așa de simplu cum am putea doar tastați în numele persoanei
în acest tabel, cum ar fi cu siguranță care are o anumită valoare sau -?
[Inaudibil Observație]
Bine.
Ei bine, lasă-mă să fie dificil aici.
Deci, permiteți-mi să spun că acest curs este CS51
și știu că e învățat în acest an de către două persoane.
Deci, Henry Leitner și Jesse Tov, dar -
asa ca voi pune doar o virgulă între cei doi, chiar.
Mă pricep la CSV de odinioară.
[Inaudibil Observație]
Exact, corect.
De îndată ce se recurgă la ceva de genul asta,
care s-ar putea simți rezonabil și-ar putea simți
ca aceasta este un fel de inteligent.
Sunt un fel de împrumut o idee care este de a lucra bine,
împrumuta o idee nouă și un fel de a le combina.
Ești un fel de total înfrângerea punctul de utilizarea bazei de date
în cauză în primul rând " dacă una dintre valorile
de a folosi este căutări rapide din cauza diferitelor indicilor
și tabele care pot să fie construit pentru tine
de motorul de baze de date în sine.
Acum, dacă doriți să căutați pentru toate cursurile
că Jesse învață, acum aveți Pentru a face subșir de potrivire pe toate
din domeniile de instructor,
ceea ce înseamnă efectiv liniar căuta din nou pentru că aveți
pentru a găsi acest set arbitrar de trei personaje oriunde
în domeniul instructor precedat
în termen de urmat poate printr-o virgulă.
Deci, acest lucru cu siguranță nu este de bun augur.
Deci, lasă-mă să mă întorc la masa.
Lasă-mă să merg mai departe la cursuri, care anulează.
Am de gând să merg doar înainte și picătură acest domeniu.
Și, dacă doriți să face acest lucru manual,
sintaxa este ALTER TABLE cursuri DROP instructor.
Deci, haideți să mergem mai departe și spune da la asta.
Și du-te înapoi la această idee mai devreme
în cazul în care am avea un separat masă de instructori.
Dar acum acest lucru se simte un pic cum pot pune un curs
în tabelul cursului și instructor
în tabelul de instructor, dar am într-un fel are nevoie pentru a lega cele două.
Și cum ar fi propun să facem asta?
[Inaudibil Observație]
Bun. Deci, haideți să facem asta.
Și ai putea numi acest masă în teorie nimic.
Am de gând să în mod deliberat numim ceea ce o mulțime
de cadre ar fi numesc, printre ei,
Laravel cum veți vedea într-un pic.
Am de gând să-l numesc curs subliniere instructor.
Folosind singular în acest caz pentru fiecare dintre cuvintele
și toate litere mici din nou, și, de asemenea, cu -
apoi în ordine alfabetică sortate de la stânga la dreapta.
Acest lucru este complet arbitrară, dar acesta tinde să fie o convenție
într-o mulțime de aceste cadre în PHP în alte limbi.
Câte coloane am nevoie în aceasta ceea ce noi numim un tabel se alăture,
să se alăture alte două tabele împreună?
Trei coloane?
Care unul - care ar fi acestea?
[Inaudibil Observație]
OK. Bun. Care funcționează.
Și am putea punct de vedere tehnic tăiat un colț aici, dar mult
de cadre, în special s-ar da în continuare chiar și aceste rânduri
ID-uri unice, chiar dacă semantic rândul
care ne interesează cu adevărat sau coloanele pe care le pasă într-adevăr
despre sunt ultimele două din ceea ce ați spus, cursul de identitate
și ID-ul de instructor.
Așa că hai să facem asta.
Îl sun pe acest rând doar ID-ul, la fel cum am făcut-o înainte.
Dar asta am de gând pentru a apela curs de identitate.
Asta am de gând să apel instructor ID.
Și am de gând să specifică faptul că toate
dintre acestea sunt unsigned Pentru că vreau
pentru a maximiza 4 mi miliarde gamă Int.
Nici unul dintre ei trebuie să fie nulă.
Am de gând să se precizeze că ID trebuie să fie în continuare primar.
Și, din nou, acest lucru este doar o convenție,
o mulțime de cadre chiar dacă nu sunt sortate
au nevoie de un fundamental identificator unic pentru rând,
se pare că e convenabil pentru codul, SQL care va
pentru a fi în mod automat generate de noi.
Așa că vom lăsa asta în calitate de primar.
Dar acum, am un fel de au o decizie de design,
ID curs și instructor de identitate.
Ce indici dacă este cazul ar trebui să primesc?
Dacă voi pleca nici indici, ceea ce este implicarea?
Ce este o implicare?
Performanță ca și mai înainte, nu?
Dacă nu există nici un index, Cel mai bun il poti face este un fel
de [auzite] prin Toată chestia asta în căutarea pentru numere.
Astfel că nu se simte inteligent.
Ar trebui să fie primar?
Deci, de ce nu?
De ce nu primar?
[Inaudibil Observație]
Perfect. Așa că am rola din [fonetic] primar.
Am ales deja.
Deci, ar trebui să fie unic?
[Inaudibil Observație]
Bun. Deci, dacă vă asumați un instructor pe curs,
în regulă.
Și asta e sigur comune cazul
dar am pus deja pe una de exemplu, poate familiar.
CS51 are doi instructori așa că suntem un fel
de acum înșurubată în acest caz.
Dacă am făcut-o permite doar un instructor,
am putea face de fapt o modalitate cu alătura masă cu totul,
du-te înapoi la abordarea mai devreme
și nu pune numele persoanei probabil, dar ID-ul instructorului.
Dacă știți fiecare curs ca doar un instructor puteți avea doar
o coloană.
Dar variabilitatea este ceea ce ne-a intrat în necazuri.
Bine.
Deci, ar trebui să fie unic?
Nu Textul complet nu simt aplicabil.
Așa cum am spus mai înainte că este
pentru ca subșir potrivite pentru descrieri.
Deci, ce despre index?
Ei bine, indicele este, probabil, cel mai bun candidat noastre
care spune MySQL optimizarea de căutări pe acest
sau lasă-mă să elaboreze, optimiza pentru căutări sau se alătură
așa cum vom vedea într-o clipă
astfel încât acestea sunt o puțin mai eficient
decât orice pur liniar.
Nu vreau să auto incrementează acest domeniu?
Deci, nu, pentru că adevărata există elementul părinte
în tabelul cursurile ".
Acolo este mergi la a lua plus,
în plus, atunci când este de fapt inserat.
Aici, totul se întâmplă să fie introduse manual
de noi probabil în cod.
Deci, haideți să specificați pur și simplu că atât curs ID
și instructor ID au indici.
Acum, vom merge mai departe și de a salva.
Și acum, doar pentru a arăta vă corespondența
între ceea ce este un frumos Interfata prietenoasa GUI
și interfața linie de comandă.
Lasă-mă să merg mai departe și de a face în urma la acest prompt MySQL.
Am de gând să spun utilizare courses50
care este numele arbitrară I-am dat la această bază de date.
Și acum, eu nici măcar nu amintesc ce am făcut.
Deci, lasă-mă să tastați SHOW tabele
și, în general, punct și virgulă va fi prietenul tau aici
pentru a termina interogarea.
Și acolo este.
Deci, aici sunt rândurile sau mai degrabă tabelele pe care le avem aici.
Acum, mi-am uitat ce un curs arata ca,
așa că lasă-mă să-mi descriu cursuri și acum văd un fel de ASCII
sau o versiune a ceea ce phpMyAdmin făcea
și văd că ID-ul este un int.
Există acel 10.
Ce înseamnă asta?
Asta înseamnă că, atunci când este afișată se va lua
la 10 caractere pe fereastra terminalului.
Este null?
Nu. Aceasta este cheia primară.
Poate avea o valoare implicită?
Nu. Și în plus, care este special steaguri, cum ar fi creștere auto.
Așa că hai să facem un cuplu insertii de rapide aici.
Am de gând să meargă în sus la - să spunem.
Să schimbăm stat la un diapozitiv
unde am un fel de pre-pregătesc aceasta.
Acesta este un rezumat, atunci de toate cele trei dintre aceste tabele.
Am deja doar manual tastat prima comandă.
Și aici, am mers înainte și tip ceilalți pentru tine.
Acesta este doar lucru stilistic.
În general, o mulțime de oameni tip declarațiile SQL în toate capace
și apoi numele de tabele și nume de câmpuri, în cazul în care mai mici,
dacă numai pentru că un fel de standuri
ce-i terminologie ta și ceea ce este sintaxa de baze de date.
Deci, aici avem trei mese, cursuri, instructori,
și cursuri de instructori.
În slide-am făcut în avans, Nu am avut câmpul ID
dar asta nu e de fapt un lucru rău deloc.
Ne-ar vedea doar o treia coloană acolo.
Dacă aș fi făcut asta aici?
Deci, acum, permiteți-mi să propun ca vom face o grămadă de inserții.
Deci, aici este unele date, Voi mări inch
Așa că am de gând să propună că la cursuri,
avem de a face doar cu trei cursuri.
Și am ales aceste trei Pentru că sunt reprezentative
de unele frumos - au unele proprietăți frumos.
CS1, CS50, CS51, ele au ID-uri de creștere
dar ceea ce ID-ul este ceea ce este total irelevant.
Asta e doar ordinea în care au fost auto introdusa de mine.
Cum despre instructori?
Deci, acum, pentru că Henry Leitner învață atât CS1 și CS51,
aceasta este un fel de oportun implicație pentru noastre de design.
Și Jesse învață CS51 și Malan învață CS50.
Deci, acum, - sau, mai degrabă acestea sunt doar ID-uri unice acelor oameni.
Și cursuri si instructori, - instructori de curs, observa aici.
ID1 curs, care a fost CS1 este predat
de instructor ID1 care este Henry.
ID2, desigur, pe care am cred că a fost CS50 este predat
de instructor ID2, care este Malan.
Și apoi în cele din urmă, CS51, și observa, avem două rânduri.
Iar acum acesta este motivul pentru join tabel este puternic se predă
atât de Henry și Jesse.
Deci, acest lucru este tot fin și bun,
dar pot abia amintiți-vă de pe partea de sus
din capul meu, care este cine aici.
Cum poți, eventual, a face cu faptul că, în cod,
fără a fi nevoie să lucruri greu de cod?
Ei bine, acest lucru este în cazul în care ea însăși SQL începe să devină prietenul nostru.
Și am de gând să propună putem tastați următoarele.
Voi face acest lucru la în promptă real.
Lasă-mă să merg mai departe și introduce aceste lucruri.
Deci, în tabelul cursuri hai să facem exact ceea ce am avut o
clipă în urmă.
Am de gând să mai departe și spune, să introduceți CS1 și CS50.
Să introduce o mai puține rânduri dintr-o dată, CS51.
Acum, lasă-mă să merg mai departe și de a salva.
Bine, așa că eu sunt doar recrearea cât mai repede
cum pot relațiile Tocmai am văzut pe ecran.
Și așa aici avem Leitner, aici avem Malan.
Să ne dea un alt rând, și Tov.
Acum, lasă-mă să salveze această.
Și eu fac ei în mod deliberat în aceeași ordine.
Nu, am uitat să dea această creștere auto.
Permiteți-mi rezolva rapid acest lucru.
Voi rezolva această problemă în codul de on-line.
Că a eșuat ca o paranteza.
Faptul că nu am putut introduceți Leitner și Malan
și Tov a eșuat, pentru că nu am specifica un număr de identificare, chiar dacă
se așteaptă o și eu a uitat să verifice creștere auto,
ceea ce înseamnă că toate au fost implicit obtinerea zero.
Dar că apoi contrazice ceea ce proprietate pe care le-am specificat.
Cheia primară a fost încălcat așa că nici măcar nu lasa-ma sa-l fac.
Deci, lasă-mă să rezolv asta.
Acum, lasă-mă să mă întorc la Introduceți fila aici și specificați
că vreau Leitner, Malan și, mai mult un rând, Tov.
Și acum în cele din urmă, singura unul care este un pic cam greu
de reținut este desigur instructor.
Să introduce acum că Desigur ID1 este instructor ID1
așa că e CS1 și Henry.
ID2 curs este instructor ID2 care este CS50 și Malan.
Și apoi ultimii cele pe care le au să vă faceți griji este, desigur ID3
care este CS51, se predă
de instructor curs 1, care este Henry.
Și trei ca, de asemenea, a învățat de 3, care este Tov.
Deci sperăm că acum am recreat acest lucru -
la naiba, am făcut același lucru.
Instructor curs are nevoie de creștere auto.
Bine.
Voi face acest lucru mai repede de data asta, Desigur 1, desigur 1, 2, 2.
Și acum în cele din urmă, vom face CS51 care are, desigur ID3 și Henry.
Și, desigur, ID3 și Jesse.
Asta arată bine.
OK. Deci, acum, să ne întoarcem la fereastra terminalului.
Deci, dacă am descriu cursuri vom vedea acest lucru.
Dacă vreau să văd cursuri I pot acum face să selectați stea la cursuri,
virgulă, iar acum vom vedea aceste valori.
Și acum, ce altceva Nu vreau să fac?
Selectați stele de la instructori, asta e ca m-am așteptat,
și selectați stea de la cursuri - Desigur instructor de subliniere.
Deci, cum am acum se alăture aceste tabele?
Deci, frumusetea de a fi ales valorile de identitate în acest mod este
că dacă te gândești a lua masa de curs
și instructorul masă și apoi inserarea
în între cele două în dumneavoastră mințile instructor curs
masă puteți fel de linie tot din aceste coloane de identitate
astfel încât să le îmbina într- o coloană masivă, care are toate
informațiilor ne pasă.
Sintaxa SQL pentru acest Nu este neapărat evident,
dar să vedem dacă o putem face.
Deci, selectați stea la cursuri,
și nu există o cale de câteva cum putem face acest lucru.
Am de gând să lovi Enter doar la un fel de format lucruri frumos,
dar că săgeata este doar o simptom al instrumentului partea de client,
nu are nimic de a face cu SQL în sine.
Deci, selectați stea la cursuri.
Am de gând să se alăture acum tabelul cursuri
pe masa de instructor curs.
Cum? Pe câmpul numit courses.id curs egală cu
subliniere instructor dot ceea ce este numele
din câmpul corespunzător de aici că vreau un cuplu.
Nu e de identitate.
Este - ceea ce, îmi pare rău?
>> ID curs.
Bine, lasă-mă să zoom out.
Dar vreau să ia aceasta un pas mai departe.
Am făcut acest lucru acum masă și asta.
Acum vreau să trageți acest tip în la fel de bine.
Deci, lasă-mă în continuare alăture toată chestia asta
pe instructor lui tabelul de la ce?
Subliniere curs instructor.instructor id
egală instructors.id.
Deci, am putea fi scris această interogare în câteva moduri.
Ordinea în care am făcut acest nu este atat de important.
Am doar un fel de a făcut-o în mintea mea de la stânga la dreapta.
Am fi putut face acest lucru în câteva moduri diferite
dar dacă am avea acum virgulă și apăsați Enter,
observa mă întorc un nou tabel temporar, un set de rezultate
ca să spunem așa, în vorbi de baze de date.
Și ce am în acest lucru?
Am pe ID-ul, un nume, o altă ID-ul, care este un fel de confuz
pentru mine în acest moment, un ID de curs,
un instructor ID-ul, ID-ul, și numele.
Deci, la sfârșitul zilei avem datele corecte acum.
Eu pot vedea că CS1 este predat de Leitner, CS51 este predat
de Leitner și Tov, și CS50 este predat de Malan.
Dar eu sunt un pic nervos despre această ambiguitate am creat.
Ce-i ambiguitatea Am aluzie la?
Da?
[Inaudibil Observație]
Există trei coloane de identitate.
Astfel încât să putem rezolva de fapt acest lucru și vom fapt de a merge
de a amâna pentru cadrul nostru în cele din urmă pentru a ne ajuta cu acest lucru,
dar se pare că nu există un cuvânt cheie în SQL numit S,
în cazul în care aveți posibilitatea să specificați o alias, un nume nou pentru un câmp
astfel încât să putem evita acest lucru ambiguitate cu totul.
Dar a dat seama că dacă nu o facem adresa cumva și cu
acel cuvânt cheie sau un cadru,
există potențial acest ambiguitate dacă încercați
pentru a accesa câmpul ID pentru că în mod clar nu sunt cele
cu nume duplicat de acolo.
Deci, aceasta este o adera și cred că în ochii mintii cel mai bun mod
să se gândească într-adevăr este de a lua cele două tabele,
linia i, în modul în care doriți.
Și aceasta este o așa-numită alăture interior, în sensul
că suntem combinarea tabelele de aici.
Există și alte tipuri de se alătură pe care le-ar putea întâmpina
în timp, ca se alatura exterior,
dar cea mai mare parte această este, probabil, cele mai frecvente
pentru reconstrucția de date.
Ceea ce am făcut acum este în general, ceea ce se numește
normalizarea datelor, astfel încât nu exista nici o dublare oriunde
în tabele.
Și prin duplicarea, mi-ar au însemnat că prima abordare.
Dacă am fi menționat Leitner Tov și în mai multe locuri
în baza de date, care nu este în general, cea mai bună decizie
mai ales în cazul în care s-ar putea numele lor schimba ore suplimentare sau în cazul
căsătoriei, numele de fată s-ar putea schimba sine vrei doar unul
loc canonică pentru unele Valoarea de date ca un nume.
Bine.
Deci, la recapitulare, am avut o câteva decizii de proiectare pentru a face
și cele mai importante probabil redusă moderat
dintre aceste opțiuni de indici.
Dar permiteți-mi să subliniez un alt lucru la fel de bine.
Dacă mă întorc la phpMyAdmin,
o caracteristică ce nu s-ar putea s-au întâlnit înainte este
următoarele.
Dacă mă duc la instructor curs, Mi-am dat deja specifică faptul că unele
aceste lucruri au indici.
Dar lasă-mă să merg la structura Fila de instructor, desigur.
Permiteți-mi să faceți clic acum pe Indici și observați următoarele.
Am precizat aici că este o cheie primară
pe coloana numită ID.
Aceasta este o oarecum complicat mod de a specifica cardinalitate
și așa mai departe ca referindu-se dimensiunea câmpului în octeți.
Dar acum am, de asemenea, un alt domeniu, ID desigur, care este -
Desigur, ID-ul care se face în avans și unic, OK.
Am făcut asta în avans pentru noi.
Deci, de ce este aceasta - lasă-mă să scadă acest lucru de dragul discuției.
Știi ce am făcut?
OK. Deci, mai devreme, unul dintre pericole de a folosi un instrument de GUI
ca aceasta, când am fost Crearea acestui tabel se alăture,
tabelul instructor curs, amintesc că am specificat
că vreau un index în acest domeniu
și un index pe această alt domeniu.
Efectul secundar al verificarea atât a acestor cutii
pe același ecran este că phpMyAdmin dedus din faptul că,
că vreau nu două indici separate,
că vreau un indice care se alăture este, în general, numai că vine
sau cel mai util atunci când sunteți căutare pe nu un domeniu
dar ambele din aceste domenii.
Și de aceea am avut le îmbina acolo
așa că am scăpat pentru că asta Nu a fost ceea ce am vrut.
Mai degrabă, am de gând pentru a reface această aici.
Am de gând să merg la ID-ul de curs
și în mai mult eu sunt doar O să spun adăuga index.
Și am de gând să meargă în instructor ID-ul și spune adăuga index.
Și acum, dacă ne-am faceți clic aici, observa, avem trei indici,
un primar și cum am destinate unul pentru fiecare
din aceste chei străine.
Și eu numesc străine, deoarece ID curs în acest hărți de masă
în domeniu care, doar pentru a fi clar, într-un alt tabel.
Cheia primară denumit ID, în tabelul numit de cursuri,
și aceeași afacere pentru celălalt.
Dar acum, este un interesant truc și într-adevăr tehnica.
Am mers mai departe și să-mi face acest lucru un pic mai lent.
În același ecran, o notificare se spune vedere legătură aici.
Am faceți clic pe acest lucru și acum am observat ajunge să facă câteva constrângeri.
Deci, unul dintre upsides asemenea
a nu numai folosind conceptual chei externe și alte tabele
ca și cum ne-am doar pe este că prin definirea unui index
pe ele le puteți avea ajutor de baze de date chiar mai mult
asigura integritatea din acest domeniu.
În mod specific, pot acum specifica prin această scădere
jos care câmpul curs de identitate
în acest tabel, de fapt hărți pe courses.id.
În mod similar, instructor de subliniere ID mapate la instructors.id.
Acum, de ce este aceasta utilă?
Ei bine, observa, pe dreapta partea de mână ceea ce pare acum.
Eu pot învăța acum bază de date care, dacă Henry
de exemplu, se retrage vreodată și rândul său dispare
din masa instructor totul fiind astfel
șterse, pot prin aceasta cascadă abordare asigura
că toate cursurile el învață sunt nu mai este asociat cu el.
Eu pot preda în baza de date pentru a șterge rândurile
în această așa-numita masă se alăture în mod automat în cazul în care Henry sau în cazul în care un
din cursurile sale dispare.
Acum, de ce este acest convingătoare?
Da?
[Inaudibil Observație]
Trebuie doar să o faci o dată și pe termen lung, nu?
Este foarte ușor dacă un fel de oamenii vin și se duc, cursuri de vin
și du-te, baza de date ar putea doar se presărat cu cursuri
și cu facultate, care nu sunt mai relevante pentru setul de date.
Și datele dumneavoastră începe să se foarte murdar și murdar și vechi,
și așa că aici putem rezolva
a impune unele aceste constrângeri.
Da?
[Inaudibil Observație]
Se știe prin intermediul acestui.
Acesta este ecranul unde suntem specificând o legătură
între cheie externă și cheie primară.
Deci, toate de numirea convenții am făcut aluzie
mai devreme sunt doar convenții.
Nu există nici un sens inerent.
Acesta este ecranul care este numai util
după ce l-ați specificat indexuri pe fiecare dintre aceste domenii așa cum am făcut-o.
Și pentru acest vertical avem câteva lucruri, de exemplu
în cazul în care un curs este șters poți împiedica de fapt, că ștergerea
de la întâmplă dacă există este un rând în acest tabel
doar prin a spune, Restricționarea.
Cu alte cuvinte Henry nu se pot pensiona
până îl decupla din CS51 și CS1.
Deci, asta e un lucru bun.
Dar s-ar putea declanșa erori in codul
dacă nu anticipa că, sau putem avea o cascadă,
o cascadă similar place Cascading Style Sheets
și cascadă Cascada înseamnă că, dacă o -
dacă Henry retrage astfel - prin obtinerea eliminat
așa va rând lui aici fi șters.
Nicio acțiune nu înseamnă nimic sau nul este un fel de util dacă aveți un fel
de vrei record istoric de Henry au învățat CS51,
dar vrei doar ca domeniu de fie nulă, astfel încât rândurile de acolo
dar nu e nici mai mult asociat cu el.
Deci, acestea sunt foarte puternice tehnici pe care le puteți
și ar trebui să utilizeze, chiar dacă în interes special
de ce de economisire de la tine.
Deci, permiteți-mi să fac referire la un cateva detalii finale aici,
ingrediente cu care care ar putea fi de ajutor
așa cum ne-am propus pentru proiectarea bazelor de date.
De asemenea, aveți de ales pe motorul de baze de date
pe care le utilizați în cod.
Dacă sunteți familiarizat de CS161 s-ar putea -
sau chiar 61, s-ar putea, în general, să fie familiarizați cu sisteme de fișiere.
Și nu există lucruri cum ar fi, NTFS si HFS +
și X2FS4 [fonetic] și 3 și așa mai departe.
Există moduri diferite de stocare a datelor pe birou.
În mod similar există moduri diferite de stocare a datelor
într-o bază de date în mod implicit cel puțin în aparat la
cu cea mai recentă versiune de MySQL.
Am fost cu ajutorul motor de baze de date numit, NoDB,
care susține o câteva caracteristici frumos.
Dar un alt unul comun este, de asemenea, numit MyISAM și încă un alt
care poate fi utilizat este de memorie, ceea ce înseamnă că nu se pune nimic
pe disc, chiar a păstra lucruri în memorie.
Pentru cea mai mare parte, probabil, nu va merge prost doar la început
cu NoDB, dar pentru orice proiecte care au tendința de a implica rate ridicate
de inserție, de exemplu, ca o mulțime de logare rapid,
sute de lucruri pe secundă sau mii de lucruri.
Ori de câte ori aveți o mulțime de lucruri merge
pe în baza de date atunci acest tip
decizii la nivel de mai jos începe să se implice.
Caracteristica full text pentru exemplu funcționează numai în MyISAM
astfel că are o implicație.
Dar s-ar putea aminti acest lucru, să cel puțin să motiveze de ce ne pasa
despre NoDB în special.
A condițiile de rasă în general, se referă la ce?
Bine, asta este o aluzie la un exemplu, unele
de s-ar putea să fi auzit în ultimii ani fie 161 sau 50
în cazul în care aveți un coleg de cameră, amândoi vă place foarte mult lapte,
unul dintre voi ajunge acasă în primul rând se deschide frigider nu e lapte,
închide plimbare frigider peste străzi la CVS și a obține
în linie pentru a cumpăra niște lapte.
Între timp, colegul tău de cameră se întoarce aici.
Ii place, de asemenea, de lapte.
Deschideți frigider și își dă seama nici lapte.
Aici, ea apoi se duce la stoca, poate cealaltă CVS.
Fast forward câteva minute mai târziu să te întorci și acum atât
de le-ați cumpărat lapte.
Una dintre ele se întâmplă acum pentru a strica pentru că nu
cum ar fi lapte atât de mult și aceasta este o problemă, nu?
Pentru că amândoi inspectate starea unor variabile
și a făcut o decizie bazată pe ea, chiar dacă statul
acelei variabile a fost în esență în curs de a fi schimbat,
tot fie că este vorba încet de-a lungul cantitatea de timp este nevoie
pentru a ajunge la și de la CVS.
Deci, ce este un fel de adevărat prost soluție lume la această problemă?
Lasă un bilet, nu?
Sa întâmplat ultima dată.
Lăsați întotdeauna o notă sau lacăt lucru literalmente.
Și spun lacăt, pentru că dacă nu ia sau a luat CS161,
de blocare este un drept fundamental idee în acest tip de lume.
Astfel pot apărea condiții de rasă De asemenea, în baza de date din lume
și s-ar putea aminti poate de CS50 finanța dacă ați luat 50,
acest cod, care de fapt ne-a dat voi în caietul de sarcini
în timp, astfel încât dvs. operațiune este așa-numita atomic.
Dacă ai vrut să, în acest caz, cumpara o parte din stoc
și că stocul a unele simbol special.
Ne-a spus să folosiți codul de ca aceasta, pentru că prin intermediul acestui
pe duplicat actualizare cheie sintaxa, care este construit
în MySQL esti eficient face fie în inserție
sau în actualizare după face o selectați pentru a vedea
în cazul în care un stoc este deja acolo.
Cu alte cuvinte, în analogul lumea de a cumpara un stoc
de lapte și frigider ar putea fi, în primul rând,
inainte de a cumpara o parte din Google s-ar putea dori pentru a selecta
din baza de date a tuturor acțiuni ale Google, care detine David
pentru a vedea dacă acesta deține zero sau mai mult.
Odată ce ați vedea dacă el deține zero sau mai multe aveți
de atunci face următoarele.
Ori trebuie sa faci o inserție
în cazul în care acesta deține cauza zero " nu există nici un rând pentru David încă,
sau ce trebuie sa faci un update în cazul în care, cel puțin în teorie pe care doriți
pentru a avea un rând pentru fiecare utilizator.
Problema este selectarea că numărul de acțiuni
și apoi actualizarea sau inserarea ar putea fi întrerupt
de altcineva de la un alt terminal de calculator încearcă să cumpere
sau de a vinde o parte din a lui David acțiuni de stocuri dacă
în scopuri bune sau de sortare scopuri de malware.
E ca si cum a merge la magazin atunci când colegul tău de cameră se întoarce
și verifică starea variabilei.
Deci, această sintaxă, la momentul care a fost un fel de potrivit
pentru CS50, evită că problemă cu totul.
Și chiar face toate că magie de blocare pentru tine,
dar acum cu aceste tipuri de proiecte pentru acest curs
care cel mai probabil va implica mai complexe seturi de date,
nu se poate realiza întotdeauna acest atomicitate.
Tot ceea ce se întâmplă la o dată sau deloc
fără întrerupere atât de elegant.
Și așa MySQL, un alt motor de baze de date,
suport lucruri numite încuietori,
, prin care puteți spune de blocare acest masă, astfel încât un singur tratament
și, în general, doar un singur utilizator poate atingeți-l în orice moment, în timp
pentru a citi sau a scrie și atunci puteți să-l debloca.
Acesta este un exemplu dintr-un de referințe proprii MySQL,
în cazul în care, dacă aveți ca o bancă cont de faptul că sunteți încercarea
de a deduce bani de la și apoi se adaugă bani pentru a.
S-ar putea dori să asigurați-vă că atât
de aceste lucruri se întâmplă împreună
astfel încât nu există nici o erori matematice
și nu există pierderi de unul bani, într-un fel.
Problema cu încuietori deși într-o bază de date este
că aceasta înseamnă în general întregului tabel este blocat,
ceea ce înseamnă că dacă aveți o sută de oameni care încearcă
de a face afaceri cu banca dvs. on-line la aceeași sumă
de timp doar unul dintre ele pot merge la un moment dat.
Care este o prostie, mai ales pe servere în zilele noastre
care au opt curs, 16 Desigur, au o cantitate mare
de memorie, nu exista nici o motiv pentru serializat toate
tranzacțiilor dumneavoastră dacă cei clienții sunt doar de gând
pentru a interacționa cu propriile lor rânduri.
Deci NoDB vă permite să faci lucruri mai inteligent
și aceasta va fi în general abordarea luați în cod,
pe măsură ce utilizați ceva numit tranzacția.
Și ce face acest lucru, în general, în cod PHP,
Cod Ruby, Python, orice.
Dar codul SQL care este în cele din urmă este folosit acest lucru,
de obicei.
Începeți tranzacție atunci specificați două sau mai multe interogări
pe care doriți să executa cu totul
fără întrerupere sau nu la toate.
Nu poate fi chiar unele selectați declarații în
sau unele Șterge sau actualizări.
Dar un lucru frumos este că Baza de date va fi destul de inteligent
pentru a vă asigura că aceasta va fi doar bloca rândurile ei sunt de fapt
implicat în acest actualizări sau selectează sau ștergeri.
Deci, dacă ai mii de rânduri si tu esti doar atinge trei
dintre acestea, numai subsetul tabelului va fi blocat
ceea ce înseamnă că acele alte 99 clienții pot atinge rândurile lor
fără a fi serializate și încetinit de tine.
Între timp, acesta este cel mai frumos aspect de tranzacții.
Ele sunt tranzacții în simt ca 161 pe un sistem de fișiere,
sunt tranzacțională
ceea ce înseamnă că poate rula le înapoi, aveți posibilitatea să le anulați.
Acest lucru este ca comanda sau de control F de baze de date.
Dacă descoperiți parte drum prin toate
de operare de date diferite, trage, ceva nu este în regulă.
Vă literalmente executa o diferit interogare SQL rola înapoi
și toate aceste tendințe - toate situațiilor voi executate
dupa ce a declarat start tranzacție dispărea
ca și cum nu s-au întâmplat,
care este un uimitor lucru puternic.
Și acestea sunt tipurile de lucrurile cu siguranță în 50 am un fel
a matura sub covor și ai doar un fel de presupun
că totul va fi bine.
Dar odată ce începe gândesc la proiecte reale
și utilizatori reali și integritatea bazei de date,
acestea sunt tipurile de deciziile de design
care vor fi importante.