>> Alle regte.
Dus, sonder verdere uitstel, SQL, Structured Query Language.
So, het jy waarskynlik by gebruik van hierdie minste in CS50, miskien in CS165,
Miskien in jou eie persoonlike projekte.
En wat beteken SQL laat jy dit doen, in 'n SQL Server meer algemeen?
Ja?
[Onhoorbaar Nota]
OK, dit was baie veilige manier om te sê nie.
Ja. So dit laat jy data te stoor
en meer belangrik kan jy kan soek data.
En dit is 'n stap vorentoe
van die gebruik van iets eenvoudiger soos 'n CSV, reg.
Comma Separated veranderlikes.
Soortgelyke waardes.
Net so laat slaan inligting op 'n ry
in 'n teks lêer.
Maar wat is die nadeel van 'n CSV vir die berging van jou data,
selfs al is jy effektief kry rye en kolomme van dit?
Ja.
>> Jy nie 'het dieselfde organisasie
doeltreffendheid [onhoorbaar].
>> Dieselfde Jy hoef nie organisasie doeltreffendheid.
Wat bedoel jy?
>> Wel, soos [onhoorbaar] het soos primêre [onhoorbaar].
>> OK. Ja.
>> Dit is 'n relasionele databasis jy verskeie databasisse kan hê
gekoppel aan mekaar in 'n baie spesifieke maniere.
>> OK. Goed.
>> Dit is [onhoorbaar] 'n CSV te stel.
>> En laat my aanpas 'n bietjie terminologie.
So verskeie tafels binne 'n databasis, seker,
en wat verder gaan as wat wat jy kan doen met net een CSV.
Maar regtig die beperking met CSV Ek sou argumenteer is
dat die ondoeltreffendheid van dit alles.
Dit is baie maklik om te uitleg.
Maar as jy wil 'n om te doen soektog, wat is die loop van die tyd
enige kies navraag op 'n CSV-lêer?
Ek bedoel dit is die groot ou [onhoorbaar], reg, want in die ergste geval,
hulle het op die heel onderste.
Selfs as jy die hele het gesorteer CSV, as jy nie weet nie
dat vooraf, goed, jy nog steeds gaan hê
die hele ding te soek.
So, een van die dinge wat ons gaan kry
van die gebruik van 'n werklike databasis met 'n taal
soos SQL is wat ons kan navraag en ons kan vooraf
as databasis ontwerpers spesifiseer wat die velde
wat waarskynlik op pad was om te hê vrae oor sodat mense
op MySQL of Microsoft of Oracle,
Wie het die databasis jy gebruik kan almal doen
van die harde werk van uitzoeken, OK,
gegee as 'n miljoen van hierdie IDS.
Hoe kan ons uitleg - hulle uit in die geheue?
'N soort van die boom struktuur miskien,
sodat wanneer jy dit doen eintlik voer Select,
dit is iets wat logaritmiese of logaritmiese
van logaritmiese in die tyd eerder as werklik te wentel
in iets lineêre.
So het ons 'n baie prestasie op die manier.
En ons kan ook 'n baie meer stoor data meer geredelik want die SQL
Bediener is tipies gestoor in die geheue selfs al dele
dit kan op skyf gestoor word en jy weet waarskynlik deur die nou
daardie ram is oor die algemeen vinniger as skywe,
so dit is 'n goeie ding.
En ons kan ook hanteer gelyktydigheid baie beter.
As jy geneem het 165 of 161 jy weet dat as twee mense probeer
dieselfde ding om te doen in 'n keer op 'n stelsel,
slegte dinge kan oor die algemeen gebeur nie.
So tussen die ander funksies wat ons kan kry as ons die ontwerp van ons tafels
in die regte manier is om beter ondersteuning en sekuriteit
wanneer dit kom by die gelyktydigheid.
So, twee mense in twee dele
van die wêreld met dieselfde webwerf, as hulle albei probeer
om iets te koop teen dieselfde tyd, is dat om nie te gaan
om te gaan in gelyktydig.
Een of ander manier sou hulle serialized word deur iemand anders as ons eie -
iemand anders as onsself.
Die databasis sal doen wat vir ons.
So wanneer dit eenvoudigste vorm,
SQL laat ons navraag 'n relasionele databasis.
'N relasionele databasis is een wat 'n
of meer tabelle gewoonlik.
En as dit 'n bietjie vreemd,
jy kan regtig dink net van hierdie as Excel of getalle
of Google sigblaaie.
Dit het net rye en kolomme en tipies die top van elke
van daardie rye het 'n naam vir dit.
So is dit dalk die ID wees kolom, die naam kolom
die adres kolom en so meer.
En dan kan jy verskeie het Sulke tafels as jy wil
om te begin uitlê verskillende tipes data.
Maar jy kan onthou ten minste van CS50 dat ons probeer
te gee jy 'n GUI-gebaseerde instrument [onhoorbaar]
jou databasis te bestuur.
Dit was bekend as phpMyAdmin.
So dit is net 'n toeval dat dit is geskryf in PHP, regtig,
maar dit was net 'n web-gebaseerde voor die einde van 'n databasis.
En via die verskillende tabs en links, kan jy begin
'n databasis op te stel vir jouself.
Maar 'n goeie instrument om te begin 'n bietjie meer gemaklik
met ook die opdrag-lyn kliënt.
Dus, as die gebruik van die CS50 toestel of eintlik die gebruik van enige makro PC
wat 'n command line MySQL kliënt is, kan jy dit ook doen soort
van die ou skool, soos hierdie.
As 'n eenkant die MySQL-projek, ten minste die open source weergawe
dit is nou bekend MariaDB vir verskeie redes wat jy kan lees
op Wikipedia, maar dit is dieselfde sagteware,
dit is dieselfde sintaks en so meer,
baie dieselfde kode basis.
En so wanneer ek by hierdie gevra wat ek nou kan interaksie
met my databasis veel meer met die hand.
So geval in punt, laat my gaan voort
en net oop 'n terminale venster.
Ek het toevallig word met behulp van die CS50 Toestel, maar jy kan dit doen
op die meeste 'n stelsel in wat jy het die reg om
sagteware geïnstalleer het.
En ek gaan MySQL-u te doen vir gebruiker John Harvard
op hierdie spesifieke stelsel,-p vir 'n wagwoord wat ek sal tik
in 'n bietjie meer veilig deur slaan Tik.
Nou is ek gevra.
Ek gaan bloedrooi te tik in die CS50 toestel
en nou sien ek in wese dat dieselfde skerm.
Maar daar is nou bevele dat ons kan begin tik
soos wys databasisse en wat gaan my alles te wys
van die databasis wat ek het reeds in die stelsel,
pretty much dieselfde lys jy wil sien in phpMyAdmin.
Daar is 'n paar van die ander soos inligting skedule en toets,
wat as jy steek om die CS50 toestel, ons steek 'n paar
van hierdie laer vlak tafels
maar hulle het al daar al hierdie tyd.
MySQL het eintlik 'n lae vlak eienskappe soos gebruikers
en wagwoorde vir die databasis self, nie vir jou aansoek
dat jy kan wees loop op die top van dit.
So in advance, vandag, ek het 'n paar databasisse,
een van wat genoem word courses50.
Kans is sommige van julle gebruik het CS50 natuurlik shopping instrument,
wat is 'n groot koppelvlak vir die registrateur se kursus katalogus.
En dit is eintlik 'n mooi dataset om te praat oor 'oorsaak,
een, ons is soort van alle natuurlik vertroud is met kursusse
en instrukteurs en vergadering plekke en al die soort
gewone dinge van die Universiteit,
maar dit is ook 'n paar interessante geleenthede
vir die ontwerp.
So het ons gedink ons ​​wil gebruik om die idee van 'n kursus katalogus
en 'n winkelsentrum instrument as 'n byvoorbeeld die hele vandag te sorteer
van die raam 'n paar van die ontwerp besluite wat ons moet maak.
So laat ons daar begin.
Veronderstel dat ek eintlik wou die super eenvoudigste te verteenwoordig
natuurlik die winkel gereedskap.
En die eenvoudigste wêreld Ek kan my voorstel en een is
waarin daar kursusse en daar is instrukteurs.
En laat ons veronderstel is om te ter wille van die bespreking
dat elke kursus het ten minste 'n naam.
So laat ons begin skets dit uit.
Ek gaan phpMyAdmin te gebruik net soos 'n gerief
sodat ons nie hoef te tik al die navrae met die hand.
Maar hier is ek in my courses50 databasis.
Indien nie vertroud met dit, dit sal baie maklik as jy duik
in jou eie projek As jy wil om dit te gebruik.
Ek gaan 'n tabel genaamd Kursusse
en ek kan net dink van een veld
Vir nou, die naam van 'n kursus.
Ek gaan om voort te gaan en sê gee my 'n kolom.
Nou, as jy onthou jy 'n koppelvlak wat is 'n bietjie
soos hierdie.
En die ander onderstebo eerlik van phpMyAdmin is dat dit soort
van self-opdraggewende en dat via die grens vertoon, kan jy sorteer
van sien wat jou moontlik ontwerp besluite is.
So ek gaan om te gee elke kursus 'n naam.
Dit is die naam van hierdie kolom.
En hoe oor die data tipe?
Die meeste van julle moet weet om minste sommige van hierdie data tipes
van vorige ervaring.
Wat is gepaste vir kursus naam?
Sharon?
>> Varchar.
>> OK, varchar wat is 'n veranderlike Char.
En wat beteken dit beteken meer tegnies?
[Onhoorbaar Nota]
OK. So dit is 'n string.
En die var aspek van impliseer dit wat?
Veranderlike. Maar wat beteken dit?
Ja?
[Onhoorbaar Nota]
Presies. So dit is 'n veranderlike aantal karakters
in die string sommige maksimum.
So hier is ons eerste ontwerp besluit.
Ons het eintlik het om te besluit hoeveel grepe maksimaal
toe te ken aan elke sodanige string.
Oor die algemeen, jy wil soort van dit nie maak nie te klein is,
maak dit nie te groot 'Veroorsaak voor die hand liggend
As dit te klein is jy net gaan begin truncating data
en jy sal inligting verloor.
En as dit is te groot, is jy net soort van die vertel van die databasis
om te verwag en te optimaliseer vir meer inligting
as wat dit kan eintlik ooit.
So, wat is 'n redelike gevoel nommer vir die naam van 'n kursus?
60? OK, so 60.
Dit lyk redelik redelike
solank is daar geen uitsonderings op daardie.
Daar is regtig geen hard, vinnig reël.
Om eerlik te wees, wees vir historiese redes 'n baie
van mense sal 255 kies 'Veroorsaak vir die jaar wat was soort
van die standaard maksimum gebruik van 8 grepe - 8 stukkies as jou toonbank.
Ek wil meer [onhoorbaar] dalk magte van 2 gebruik
maar dit is soort van irrelevant.
So ons kan gaan met 60.
Dit lyk redelik so lank
as ons uiteindelik betreur dit nie 'Veroorsaak dat 'n bogrens is.
Nou, veronderstel die teenoorgestelde besluit is,
nie veranderlike karakters, maar net die kar veld.
So in teenstelling met C en C + +, kar beteken nie een kar
en databasisse wat beteken oor die algemeen 'n vaste aantal
van die karakters in 'n string.
Wat sou die onderstebo en / of wees nadeel van my keuse 60
vir 'n kar veld, in plaas van varchar?
Dit is presies die eerste soort besluit wat jy sal moet maak,
wanneer die inspeksie [fonetiese] uit projek met jou vennote.
Ja, Sharon weer.
[Onhoorbaar Nota]
Goed. Dus, as die naam is minder
as 60 dan is jy mors wat dit ook al is delta
tussen 60 en die werklike lengte.
Sodat voel net verkwistende, meer grepe as jy nodig het.
Maar waarom is dit bestaan ​​nie?
Want daar is 'n paar onderstebo.
Ja?
[Onhoorbaar Nota]
Seker nie. So soms is jy dalk die vaste aantal ken
van karakters soos 10 syfers vir 'n telefoonnommer byvoorbeeld.
Maar wat omgee, soos waarom nie net sê 11 elk geval
of waarom nie sê 60 in elk geval met die varchar?
Watter voordeel kry ons deur te weet en ontwerp
vir 'n vaste aantal van die karakters?
[Onhoorbaar Nota]
Jy is op die regte pad is.
So dit is die optimalisering, maar dit is regtig van - ja?
[Onhoorbaar Nota]
OK. Goed. Kom ons fokus op die laaste deel.
So kruip.
So dit blyk of jy vooraf weet dat al
van jou velde gaan te wees 60 karakters,
jy kan regtig dink van hierdie kolom in die Excel databasis
as mense wat baie reguit, links geregverdig
en regs geregverdig kante
want elke kolom 60 karakters breed.
Dit beteken dat hierdie string 60 karakters weg
uit hierdie string, 60 karakters weg van hierdie een
en hierdie een en hierdie een.
Dus net graag terug wanneer jy geleer C, jy het ewekansige toegang
in die wêreld van die skikkings, Dieselfde idee hier.
As jou kolom verteenwoordig met behulp van slegs vaste lengte karakters,
jy kan effektief indeks lukraak tot 60 of 120 of 180
en jy kan individueel kry snare baie vinniger.
Dan as plaas, jou kolom gehad 'n reguit linker rand om so te praat
maar 'n baie ruig reg rand aan die kolom
want jy kan dalk het 10 karakters,
15 karakters, 5 karakters.
So dit is ook 'n nadeel.
En soms net deur probeer en tref
en eksperimentering Kan jy dink
uit te vind wat regtig die regte oproep is, maar dit is die soort
vrae wat moet gaan
deur jou verstand en / of tafels wanneer dit kom tyd
jou databasis te ontwerp.
So, nie noodwendig reg beantwoord, maar jy moet
ten minste 'n paar sin of twee in gedagte
te rugsteun alles besluit wat jy maak.
Alle regte.
So laat ons hou blaai in die instruksies hier
wat phpMyAdmin se UI.
So, die standaard waarde vir 'n naam, moet ek spesifiseer
dat dit behoort te wees nie 'n verstek waarde van nul?
Wat dink jy?
Kan 'n kursus het 'n nul naam?
Voel net vreemd, reg?
Ek kan nie dink aan enige naamlose kursusse by Harvard.
En miskien is daar 'n paar donker hoek geval
waar 'n kursus word 'n aantal
en die professor het nie gekies om 'n naam vir dit, maar -
Ek bedoel, te klink met wat,
soos laat ons nie eens pla ondersteun nie.
Ek in die belang sou sê van 'n mooi skoon databasis,
laat se spesifiseer dat jy nie kan 'n verstek waarde van nul.
Alternatiewelik kan ons doen iets soos untitled natuurlik
Dit is nie in teenstelling met Mac OS en Windows doen
wanneer jy 'n gids byvoorbeeld
maar daar wat maak 'n bietjie meer sin
sodat die menslike iets sien.
Ons praat oor 'n back-end databasis vermoedelik
vir kursus katalogus.
So ek het nie regtig selfs soos die idee om dit
in untitled natuurlik name
want dit is nie regtig gaan om iemand te help.
So kom ons laat dit as een, Dit beteken dat wanneer jy '
in hierdie databasis, het jy elke kursus 'n naam gee
wat 'n bietjie voel skoonmaker vir my.
Alle regte.
So blaai verder, saamgestel.
Dit het net te doen het met karakter sets en noem maar op
As jy nog ooit gesien het noem van die Sweedse
in phpMyAdmin dis Want die mense
wat phpMyAdmin geskryf was die Sweedse.
Is dat PHP of is dit MySQL?
Een van die twee, het ek vergeet onvoorbereid.
Maar dit is vir historiese redes
maar jy kan druk elke karakter in Engels
wat jy kan met 'n Sweedse so dit is grootliks 'n non-issue.
Die CS50 toestel is egter gebruik - ingestel UTF-8 te gebruik,
sodat die algemeen, moet nie pop vir jou.
Eienskappe.
So een van hierdie is regtig relevant is hier.
Ek sien Binary, Unsigned, Unsigned zerofill,
en update huidige tyd stempel.
Dit veld is slegs van toepassing vir 'n paar numeriese veld
of 'n paar keer velde.
So ons sal slaan oor wat geheel.
Nul. Kan hierdie veld null?
So nie. Ons het reeds dat die soort van gesprekke.
So wil ons nie 'n standaard waarde.
Ons wil dit nie te nul.
Wat van indeks?
Daar is vier keuses hier.
Wat beteken dit as ons spesifiseer
dat hierdie ry gaan 'n primêre sleutel te wees?
Dink terug te CS50 of CS165 as jy dit geneem.
[Onhoorbaar Nota]
Presies. So 'n primêre sleutel per definisie is die veld
wat uniek identifiseer elke ry in die tabel.
En jy kan staatmaak op dit te doen daardie unieke identifikasie.
So, wat beteken dit dan net uniek wees?
Wel, soort van hierdie twee het soort
van onder implikasies onder die kap.
Maar oor die algemeen, primêre sleutel is soort van 'n kontrak wat jy maak
met die databasis ding.
Wanneer ek dit doen navrae soek vir 'n kursus,
Ek gaan om dit te gebruik spesifieke veld.
En ons sal terug te kom na waarom ons dalk twee
sulke keuses hier, primêre of unieke.
Unieke sê net, hierdie gebied gaan uniek wees
maar ek is nie werklik 'n soort verbale verbintenis hier
die veld te gebruik my soektogte te doen
om redes wat ons sal sien in net 'n oomblik.
As ons spesifiseer plaas indeks, Wat beteken dit om te spesifiseer
dat 'n gebied 'n indeks op dit?
Ja?
[Onhoorbaar Nota]
Presies. Dit was geskik vir navrae.
So jy - databasis bediener, Oracle, MySQL, wat ook al,
sal oor die algemeen werk sy magie agter die skerms as jy kliek
dat die opsie en klik Red en dit sal bou
up tipies 'n boom struktuur, B-bome of jy gesien het
of gehoor af wat 'n baie kort op soek boom
wat gee jou baie mooi logaritmiese eienskappe
wanneer jy soek op die data.
As jy nie 'n indeks spesifiseer nie op 'n veld, wat gaan
die gang te wees tyd van soek
vir 'n arbitrêre [Fonetiese] Natuurlik naam?
Wat is dit?
[Onhoorbaar Nota]
O, [onhoorbaar], lineêre, reg?
As dit daar is geen optimalisaties gegun om die databasis
en jy nie gedink het nie die databasis watter soort
van data om te verwag.
Die beste wat jy kan doen is tjek alles wanneer jy op soek is na
vir 'n waarde, veral As daar kan
in werklikheid duplikate.
Full-text Intussen het ons sal beweeg ons hande vir nou.
Maar oor die algemeen, is dit 'n Tipe van die indeks wat u toelaat om
te optimaliseer vir die navraag soek op 'n veld.
So dit kan wees 'n goeie kandidaat
vir soos 'n kursus beskrywing waar jy kan 'n paar het
van paragrawe en jy kan wil substring wedstryde te doen.
Full-text sal oor die algemeen laat jy dit doen redelik doeltreffend.
AI, dit is 'n verskriklike soort verduideliking, maar as ons sweef
oor dit wat jy sal sien Auto Vermeerder.
Nie van toepassing beide hier maar die motor omgeslaan is nuttig
vir soos 'n int se veld, want die databasis sal sorg
van die proses van plus plusing dit elke keer as jy 'n insetsel.
Sodat selfs as twee mense letterlik kliek Stuur
op dieselfde tyd en probeer 'n ry om een ​​of ander manier te skep
in die databasis, een van Ek sal hulle die aantal Ek,
die ander sal kry die aantal Ek plus 1.
Jy hoef nie bekommerd te wees
sowat twee getalle word opgedra identies as jy
om dit te doen jouself in die kode.
Alle regte.
So ek hou waar Ons het 'n naam.
So laat ons op Save.
Is dit 'n goeie ontwerp vir 'n databasistabel?
En as 'n eenkant indien verroes op SQL of jy soort
van net altyd draai 'n blinde oog wat aan die gang was,
Ek kon getik het presies dit is -
die drie lyne op daardie swart en wit vinnige
in die command line kliënt of ek kon gedoen het
wat in die kode programmaties.
So al phpMyAdmin doen vir my net spaar my die moeite
onthou soms die sintaksis en tik vir
soos vervelige opdragte.
Alle regte.
So dit voel nie soos die beste ontwerp, 'n een veld tafel.
Nou kan ons 'n dinge soos professore
en plekke en beskrywings.
Maar selfs dan, met behulp van slegs die naam
kursusse te identifiseer nie ideaal voel.
Wat het oor die algemeen ons in die verlede gedoen
As jy databasisse gebruik het uniek rye?
Nie gebruik varchars tipies.
Ja?
[Onhoorbaar Nota]
Ja. So tipies 'n kursus ID.
So, die mees algemene benader hier veral
by die gebruik van 'n raamwerk is eintlik net
'n nommer te gebruik soos 'n heelgetal.
So laat my voort te gaan en dit doen.
En ons kan dit doen in 'n paar maniere, maar kennis as ek zoom
in die onderste hier.
Ek gaan om te sê voeg een kolomme aan die einde van die tafel,
algemeen net vir die visuele gerief jy sit ID's
aan die begin van die tafel Hoewel dit nog nie werklik
funksionele impak.
So ek gaan om te sê voeg een kolomme
aan die begin van die tafel.
Ek gaan om te klik trek, dat gee my terug hierdie UI hier.
Kom ons noem dit ID.
As ons dink ons ​​gaan te hê nie meer gedoen 4000000 kursusse
'n int se veld is fine.
Ons kan selfs krimp dit af
maar die ruimte is goedkoop so wat regtig omgee.
Maar, ons probeer om te skryf Facebook nou,
dalk nie 'n slegte ding wees groot ints om te verwag
wat sou gee ons 64-bit ints
maar dan is jy letterlik verdubbeling van die aantal bisse
wat jy gebruik, so klein nadeel
maar iets om te oorweeg.
Nou, hierdie is 'n verwarrende nalatenskap ding.
Jy kan onthou van die gebruik van MySQL
dat elke keer as jy 'n int verklaar gebied sal jy sien dikwels 'n aantal
langs dit soos die getal 10.
Dit het niks te doen met die grootte van die getal
of die aantal stukkies.
Dit het te doen met die aantal van die karakters wat gebruik word
vertoning om visueel dat int veld
by die gebruik van 'n terminale venster.
So kan ons sien dat in 'n oomblik.
So, moenie mislei word deur te tik nommers
daar selfs al is dit effektief te vra om ons
vir een hier.
Hier, ek gaan om te gaan voort en sê unsigned.
Daar is geen rede om te mors almal van ons negatiewe getalle
sedert die databasis is oor die algemeen gaan
om aan te neem positiewe waardes of nul.
Die ID beslis moet nie leeg wees.
En wat dink jy die indeks vir hierdie ID veld?
Kom ons maak dit die primêre.
So, wat as, al is, soos ek kan dink net van een CS164 natuurlik
by Harvard en slegs een CS50 kursus by Harvard
En dit is mooi baie ware algehele
dat daar dalk uitsonderings [Onhoorbaar] beide semesters
of iets weird soos dit.
Maar meer fundamenteel, Hoekom is dit beter
'n numeriese integrale ID te gebruik om te unieke kursusse identifiseer eerder
as net 'n unieke kombinasie?
Ja?
[Onhoorbaar Nota]
OK, interessant.
So as ons het soort van kruis-genoteerde kursusse.
So dit is 'n goeie voorbeeld.
Ek is nie seker of ek sou los dat alhoewel
deur aan hulle dieselfde ID-nommer as dit
waar jy gaan met dit.
Nee? OK. Maar beslis 'n hoek saak te oorweeg.
As daar 'n soort van - Ons moet 'n soort
van vleuelingsfilter potensieel.
[Onhoorbaar Nota]
Seker nie.
[Onhoorbaar Nota]
Dit is 'n goeie voorbeeld.
Die naam kan verander oor tyd, heeltemal redelike.
Wat anders?
[Onhoorbaar Nota]
Jammer, sê weer.
[Onhoorbaar Nota]
Ja, presies.
So regtig, dis die werklike dood doener is
dat die gebruik van 'n 32-bit int is waarskynlik gaan om vinniger te wees
as sommige veranderlike lengte kar veld.
In die eerste geval is, is die blikkie letterlik pas in 'n register,
nie veel om te noem kleiner geheue voetspoor.
In die laasgenoemde geval, jy gaan te hê oord te doen [fonetiese]
string vergelykings wat in hulself met die lineêre
in die grootte van die string potensieel.
So, dit is net 'n mooi optimalisering,
en in die besonder dit gaan
om ons te laat doen wat genoem word Sluit meer doeltreffend
in net 'n oomblik.
So laat ons dit doen.
Ons sal spesifiseer dat dit is die primêre
omdat ek nie besonder wil sorg of dink
oor wat die aantal is van 'n kursus.
Laat hulle neem watter waardes hulle wil.
Ek gaan die motor omgeslaan om te sê sodat ek kan kontrakteer dat detail.
Soos in tersyde jy dalk weet dat Harvard
ten minste het wel 'n unieke nommers vir kursusse.
Ek het geen herinnering wat hierdie kursusse is.
Ek weet dat CS50 se katalogus nommer is 4949,
heeltemal arbitrêre.
Maar daar is 'n vreemde hoek gevalle in dat selfs
in die registrarial stortingsterrein natuurlik katalogus data,
soms kursusse, ou kursusse het 'n aantal soos 4.
Maar tegnies wat gebied is 'n kar veld
wat eenvoudig begin met 0004.
So ook hier, wat jy hoef te wees versigtig wees om oor te onderskei
tussen dinge soos 'n Natuurlik katalogus nommer
wat dalk 'n menslike hê idee van vaste lengte, 0004,
en jy moet nie stoor wat byvoorbeeld in 'n ints.
Dat die soort van veld moet elders gestoor.
So in Harvard, as ons eintlik 'n kursus
shopping instrument, dit is waarskynlik nie voldoende
getal kursusse met net 1, 2, 3, 4.
Ons is waarskynlik gaan om te hê
'n ander veld te hê genoem katalogus nommer,
wat ook veronderstel uniek gebaseer word
op menslike konvensies hier maar dit is nie die beste keuse
vir 'n unieke identifikasie, want dit dalk veranderlike lengte wees.
Dit mag dalk nie wees vier karakters, kan dit wees vyf.
Trouens, ek dink 'n paar jaar gelede het hulle beweeg
tot vyf karakters se oorsaak is daar meer as 999 kursusse
in totaal of iets soos dat of 9999 kursusse.
So, dalk wat 'n voorbeeld wees waar die veld is nie die primêre
maar dit moet uniek wees.
En e-posadres is 'n ander een.
Jy mag dalk wil om dit te uniek wees
maar nie noodwendig jou primêre sleutel.
Alle regte.
So laat my nog bang om uit tafel baie vinniger as hierdie een.
So ek gaan om dit te noem een instrukteurs en ek gaan
hierdie gee 'n totale aantal kolomme van twee.
Ek gaan om te leer om my les van die laaste tyd.
Ek gaan om te bel die eerste kolom ID.
Ek gaan om te noem die tweede kolom Naam.
Ek gaan ook varchar te doen.
Ek gaan om te aanvaar nie professor het 'n naam meer
as 60 karakters, hoewel nou is dit dalk stoot dit
met 'n paar lang name, spesiale mense met middel name.
Dit is goed vir vandag.
So laat se rol hier.
Kom ons maak weer hierdie unsigned.
Kom ons maak hierdie primêre.
En ons sal dubbele name toelaat
in die geval is daar twee John Smith se of iets soos dit.
En nou het ons twee tafels.
So nou, dit lei tot die vraag hoe ek assosieer
in instrukteur met die kursus?
Ek voel asof ek soort het voor my
want as 'n instrukteur leer om 'n kursus,
my eerste instink eintlik om terug te gaan
om kursusse te besef, hierdie was nie 'n goeie idee.
Laat my eintlik voeg een kolom aan die einde van die tafel,
kliek gaan, en ek sal noem dit Instrukteur.
En Ek sal hierdie varchar maak en ek sal maak dit 60.
En miskien sal ek dit laat null nou
in die geval van die kursus het nie is unsigned in instrukteur
wat soms gebeur voordat kwartaal begin en klik op Save.
Watter van hierdie ontwerpe verkies jy?
Eerste een waar ons 'n afsonderlike instrukteur se tafel
of die tweede waar ons net Voeg 'n veld by die kursus?
So dit is 'n noue skakel instrukteur met verloop.
[Onhoorbaar Nota]
OK. Goed. Maar laat my terug te stoot.
Dit is net so eenvoudig soos ek kan tik net in die persoon se naam
in hierdie tabel, soos sekerlik wat 'n paar waarde of -?
[Onhoorbaar Nota]
Alle regte.
Wel, laat my moeilik wees om hier.
So laat my sê dat hierdie kursus is CS51
en ek weet dit is geleer vanjaar deur twee mense.
So, Henry Leitner en Isai Tov maar -
so ek sal net 'n komma tussen die twee, reg.
Ek is regtig 'n goeie by CSV van weleer.
[Onhoorbaar Nota]
Presies, reg.
Sodra jy oord na iets soos hierdie,
wat kan voel redelike en jy kan voel
soos hierdie is 'n soort van smart.
Ek is soort van lenings een idee wat om goed te werk,
leen 'n nuwe idee en soort van 'n kombinasie daarvan.
Jy is soort van heeltemal verslaan die punt van die gebruik van die databasis
in die eerste plek 'oorsaak As een van die waardes
van die gebruik daarvan is vinniger soektogte as gevolg van die verskillende indekse
en tafels wat kan word opgebou vir jou
deur die databasis enjin self.
Nou, as jy wil soek Vir al die kursusse
dat Jesse leer, nou het jy ' te doen substring ooreenstem met alle
van die instrukteur velde,
wat effektief beteken lineêre soek weer want jy
hierdie arbitrêre stel om uit te vind drie karakters oral
in die instrukteur veld voorafgegaan
binne Miskien gevolg deur 'n komma.
So dit beslis voorspel niks goeds.
So laat my terug na die tafel te gaan.
Laat my gaan voort om kursusse, ongedaan te maak nie.
Ek gaan om net te gaan voor en drop die veld.
En as jy wil die hand te doen dit,
Die kode is ALTER TABLE kursusse DROP instrukteur.
So laat ons gaan voort en ja sê nie.
En gaan terug na hierdie vroeër idee
waar ek het 'n aparte tafel vir instrukteurs.
Maar nou is dit voel 'n bietjie soos ek kan 'n kursus sit
in die kursus se tafel en instrukteur
in die instrukteur se tafel, maar ek een of ander manier moet die twee te koppel.
En hoe sal jy stel voor ons dit doen?
[Onhoorbaar Nota]
Goed. So laat ons dit doen.
En jy kan dit noem tabel in teorie nie.
Ek gaan doelbewus noem dit wat 'n baie
raamwerke sou noem dit, onder hulle,
Laravel as jy sien in 'n bietjie.
Ek gaan om dit te loop noem beklemtoon instrukteur.
Die gebruik van enkelvoud in hierdie geval vir elk van die woorde
en al laer geval weer, en ook met die -
dan alfabeties gesorteer van links na regs.
Dit is heeltemal arbitrêre maar dit is geneig om 'n konvensie te wees
in 'n groot deel van hierdie raamwerke in PHP in ander tale.
Hoeveel kolomme moet ek in dit wat ons noem 'n sluit tafel,
twee ander aan te sluit tafels saam?
Drie kolomme?
Watter een - wat sou dit wees?
[Onhoorbaar Nota]
OK. Goed. Dit werk.
En ons kon tegnies sny 'n hoek hier nie, maar 'n baie
raamwerke in die besonder nog steeds, selfs hierdie rye gee
unieke ID's, selfs al semanties die ry
dat ons regtig omgee of die kolomme wat ons regtig omgee
oor die laaste twee van wat jy gesê het, die kursus ID
en die instrukteur ID.
So laat ons dit doen.
Ek sal hierdie ry net ID noem, net soos ons gedoen het nie.
Maar hierdie een gaan ek Natuurlik ID te bel.
Hierdie een gaan ek noem instrukteur ID.
En ek gaan spesifiseer dat alle
van hulle is unsigned Want ek wil hê
my 4 te maksimeer miljard int reeks.
Nie een van hulle moet nul wees.
Ek gaan om te bepaal dat ID moet nog primêre wees.
En weer, dit is net 'n konvensie,
'n baie raamwerke selfs as jy nie sorteer nie
fundamenteel 'n Unieke identifiseerder vir die ry,
dit blyk dit is gerieflik vir die kode, die SQL wat gaan
outomaties wees gegenereer vir ons.
So ek sal laat dit as 'n primêre.
Maar nou, ek soort 'n ontwerp besluit,
Natuurlik ID en instrukteur ID.
Wat indekse indien enige moet hulle kry?
As ek nie indekse sal verlaat nie, Wat is die implikasie?
Wat is 'n implikasie?
Prestasie as voor, reg?
As daar is geen indeks, is die beste wat jy kan doen is 'n soort
van [onhoorbaar] deur die hele ding getalle soek.
Sodat nie slim voel.
Indien dit die primêre?
So hoekom nie?
Hoekom nie primêre?
[Onhoorbaar Nota]
Perfect. So ons rol uit [fonetiese] primêre.
Ons het reeds gekies het nie.
So, moet dit uniek wees?
[Onhoorbaar Nota]
Goed. Dus, as jy aanneem een instrukteur per kursus,
heeltemal fyn.
En dit is beslis die algemene geval
maar ons het al sit af een miskien bekende voorbeeld.
CS51 het twee instrukteurs so ons is soort
van nou geskroef in daardie geval.
As ons gedoen het toe net een instrukteur,
Ons kan eintlik nie 'n manier met die sluit tafel geheel en al,
gaan terug na die vorige benadering
en die persoon se naam sit nie miskien, maar die instrukteur se ID.
As jy weet van elke kursus, soos net een instrukteur kan jy net
een kolom.
Maar die variasie is wat ons in die moeilikheid beland.
Alle regte.
So, moet dit uniek wees?
No Volledige teks nie voel toepassing.
Soos ons vantevore gesê dis
vir soos substring ooreenstem vir beskrywings.
So, wat oor indeks?
Wel, indeks is waarskynlik ons beste kandidaat
wat vertel MySQL optimaliseer vir soektogte op hierdie
of laat my uit te brei, optimaliseer vir navrae of sluit aan by
soos ons sal sien in net 'n oomblik
sodat hulle 'n bietjie meer doeltreffende
as enigiets suiwer lineêre.
Wil ek die motor inkremente hierdie gebied?
So nee, want die ware Ouer element bestaan
in die kursusse tafel.
Dit is waar dit is gaan plus te kry,
plus wanneer dit is eintlik plaas.
Hier is dit al gaan met die hand te plaas
deur ons vermoedelik in die kode.
So laat ons net spesifiseer dat beide natuurlik ID
en instrukteur ID het indekse.
Nou sal ons gaan voort en red.
En nou, net om te wys jy die korrespondensie
tussen wat is 'n mooi GUI koppelvlak
en die command line interface.
Laat my gaan voort en doen die volgende op die MySQL prompt.
Ek gaan gebruik courses50 te sê
wat is die arbitrêre naam Ek op die databasis het.
En nou, ek het nie eens onthou wat ons gedoen het.
So laat my tik show tafels
en in die algemeen kommapunte sal jou vriend wees hier
die navraag te voltooi.
En daar is dit.
So hier is die rye of eerder die tafels wat ons hier het.
Nou, ek vergeet wat 'n kursus lyk,
so laat my nie beskryf kursusse en nou sien ek soort van 'n ASCII
of 'n weergawe van wat phpMyAdmin was om te doen
en ek sien dat ID is 'n int.
Daar is een wat 10.
Wat beteken dit?
Dit beteken net dat wanneer dit vertoon dit gaan neem
up 10 karakters op die terminale venster.
Is dit waarvoor geen nul mag?
Nee, dit is die primêre sleutel.
Kan dit 'n standaard waarde?
No En wat is ekstra spesiale vlae soos motor omgeslaan.
So laat ons net 'n paar vinnige invoegings hier.
Ek gaan om te gaan te - laat ons net sê.
Kom ons verander toestand na 'n skyfie
waar ek soort van vooraf voor te berei hierdie.
Dit is 'n opsomming dan al drie van die tafels.
Ek het reeds net met die hand getik die eerste gebod.
En hier, ek gaan voort en tik die ander vir jou.
Dit is net die stilistiese ding.
Die algemeen, 'n klomp mense tik SQL stellings in hoofletters
en dan tafel name en gebied name in kleinletters,
As net omdat dit soort van erwe
uit te vind wat is jou terminologie en wat is die databasis sintaksis.
So hier het ons drie tafels, kursusse, instrukteurs,
en kursusse instrukteurs.
In die skyfie wat ek gemaak het in advance, Ek het nie die ID-veld
maar dit is nie eintlik 'n slegte ding nie.
Ons wil net sien 'n derde kolom daar.
Het ek gedoen dat hier?
So nou laat my stel voor dat doen ons 'n klomp van die invoegings.
So hier is 'n paar data, Ek sal vergroot in
So ek gaan voor te stel wat in kursusse,
ons net met drie kursusse.
En ek het verkies om hierdie drie Want hulle is verteenwoordigend
van 'n paar mooi - hulle het 'n paar mooi eienskappe.
CS1, CS50, CS51, het hulle het die verhoging van ID's
Maar wat ID is wat is heeltemal irrelevant.
Dit is net die volgorde waarin hulle motor ingevoeg deur me.
Hoe gaan instrukteurs?
So nou, omdat Henry Leitner leer beide CS1 en CS51,
dit is soort van 'n gunstige implikasie vir ons ontwerp.
En Isai leer CS51 en Malan leer CS50.
So nou - of eerder hulle is net die mense se unieke ID.
En kursusse en instrukteurs, - Natuurlik instrukteurs, sien hier.
Natuurlik ID1, wat is CS1 geleer
deur instrukteur ID1 wat Henry.
Natuurlik ID2, wat ek dink was CS50 geleer
deur instrukteur ID2, wat is Malan.
En dan laastens, CS51, en sien ons twee rye.
En nou is dit die rede waarom die sluit tabel is 'n kragtige geleer
deur beide Henry en Jesse.
So, dit is alles goed en wel,
maar ek kan skaars onthou van die top
my kop wie is wie hier.
Hoe kan jy dalk hanteer wat in die kode,
sonder om te hard-kode dinge?
Wel, dit is waar SQL self begin ons vriend geword.
En ek gaan voor te stel dat Ons kan die volgende tipe.
Ek sal dit doen op in werklike vinnige.
Laat my gaan voort en voeg hierdie dinge.
So, in die kursusse tafel Kom ons doen presies wat ons het 'n
oomblik gelede.
Ek gaan voort en sê: laat se plaas CS1 en CS50.
Kom ons voeg 'n paar rye in 'n keer, CS51.
Nou, laat ek gaan voort en red.
Alle reg, so ek is net herskep so gou
as ek kan die verhouding sien ons net op die skerm.
En so hier het ons 'n Leitner, hier het ons Malan.
Kom ons gee onsself nog 'n ry, en Tov.
Nou laat my red nie.
En ek doen dit doelbewus in dieselfde volgorde.
Nee, ek het vergeet om te gee Hierdie motor omgeslaan.
Laat my vinnig regmaak.
Ek sal dit op te los in die aanlyn-kode.
Dit het misluk as 'n eenkant.
Die feit dat ek nie kon voeg Leitner en Malan
en Tov misluk, want ek het nie spesifiseer 'n ID-nommer, selfs al
dit is een verwag en ek vergeet motor omgeslaan om seker te maak,
wat beteken hulle was almal by verstek om nul.
Maar wat dan weerspreek wat eiendom wat ons verskaf het.
Die primêre sleutel is geskend so dit het nie eens laat my dit doen.
So laat my dit regmaak.
Nou, laat my terug te gaan na die Voeg blad hier en spesifiseer
wat ek wil Leitner, Malan en een ry, Tov.
En nou laastens, die enigste een wat 'n bietjie hard
om te onthou is natuurlik instrukteur.
Kom ons kyk nou voeg dat Natuurlik ID1 is instrukteur ID1
so dit is CS1 en Henry.
Natuurlik ID2 is instrukteur ID2 wat CS50 en Malan.
En dan is die laaste wat ons het te bekommer is natuurlik ID3
wat is CS51, geleer
deur natuurlik instrukteur 1, wat Henry.
En drie as ook geleer met 3, wat is Tov.
So hopelik nou Ons het herskep die -
damn dit, ek het dieselfde ding.
Natuurlik instrukteur moet die motor omgeslaan.
Alle regte.
Ek sal dit vinniger doen hierdie tyd, Kursus 1, natuurlik 1, 2, 2.
En nou laastens, ons doen CS51 wat natuurlik ID3 en Henry.
En natuurlik ID3 en Jesse.
Dit lyk goed.
OK. So nou, laat ons gaan terug die terminale venster.
So as ek beskryf kursusse wat ons sal sien.
As ek wil kursusse wat ek kan sien nou kies ster van kursusse,
semi kolon, en nou sien ons daardie waardes.
En nou, wat anders wil ek doen?
Kies ster van instrukteurs, dit is as wat ek verwag het,
en kies ster van kursusse - Natuurlik onderstreep instrukteur.
So hoe sluit ek nou hierdie tabelle?
So het die skoonheid van die kies die ID waardes op hierdie manier is
dat as jy dink oor neem die loop tafel
en die instrukteur tafel en dan inbring
tussen die twee in jou gedagtes die kursus instrukteur
tabel kan soort van lyn al hierdie ID kolomme
sodat jy hulle saamsmelt in een massiewe kolom wat al
van die inligting ons omgee.
Die SQL syntax vir hierdie is nie noodwendig voor die hand liggend,
maar laat ons kyk of ons dit kan doen.
So kies ster van kursusse,
en daar is 'n paar manier as ons kan dit doen.
Ek gaan om te tref Tik net soort van formaat dinge mooi,
maar dat pyl is net 'n simptoom van die kliënt se kant instrument,
dit het niks te doen met SQL self.
So kies ster van kursusse.
Ek gaan nou saam met die kursusse tafel
op die kursus instrukteur tafel.
Hoe? Op die veld geroep courses.id gelykstaande kursus
beklemtoon instrukteur dot wat is die naam
van die ooreenstemmende gebied hier waar ek wil 'n paar.
Dit is nie ID.
It's - wat, jammer?
>> Kursus ID.
OK, laat my zoom uit.
Maar ek wil neem hierdie een stap verder.
Ek het nou gedoen tafel en hierdie een.
Nou wil ek om te trek hierdie man in so goed.
So, laat my verder sluit hierdie hele ding
op die instrukteur se tabel op wat?
Natuurlik onderstreep instructor.instructor id
gelykstaande instructors.id.
So ons kon geskryf het hierdie navraag in 'n paar maniere.
Die volgorde waarin ek dit gedoen is nie al wat belangrik is.
Ek het net soort van het dit in my gedagtes van links na regs.
Ons kon dit gedoen het in die paar verskillende maniere
Maar as ek nou die semi kolon en druk Enter,
sien ek terug te kry 'n nuwe tydelike tafel, gevolg stel
om so te praat in die databasis spreek.
En wat moet ek in hierdie saak?
Ek het op die ID, 'n naam, 'n ander ID, wat soort van verwarrend
vir my op die oomblik, 'n kursus ID,
'n instrukteur ID, ID, en die naam.
So, aan die einde van die dag Ons het die reg om data nou.
Ek kan sien dat CS1 geleer deur Leitner, is CS51 geleer
deur Leitner en Tov en CS50 is geleer deur Malan.
Maar ek is 'n bietjie senuweeagtig oor Hierdie teenstrydighede wat ek gemaak het.
Wat is die dubbelsinnigheid Ek verwys na?
Ja?
[Onhoorbaar Nota]
Daar is drie ID kolomme.
So kan ons eintlik regmaak en ons gaan eintlik gaan
te stel om ons raamwerk uiteindelik om ons te help met hierdie,
Maar dit blyk dat daar 'n navraag in SQL genoem S,
waar jy kan spesifiseer 'n alias, 'n nuwe naam vir 'n veld
sodat ons kan verhoed dat hierdie dubbelsinnigheid geheel en al.
Maar het besef dat as ons dit nie doen nie spreek dit een of ander manier as met
die navraag of 'n raamwerk,
daar is potensieel hierdie dubbelsinnigheid as jy probeer
die ID-veld om toegang te verkry want duidelik is daar diegene
met dubbele name daar.
So dit is 'n nader en ek dink in jou geestesoog die beste manier
na te dink oor dit regtig is die twee tafels te neem,
laat hulle almal in die manier wat jy wil.
En dit is 'n sogenaamde innerlike sluit in die sin
dat ons 'n kombinasie Die tabelle hier.
Daar is ander vorme van sluit dat ons mag teëkom
verloop van tyd soos die buitenste aansluit,
maar vir die grootste deel van hierdie is waarskynlik die mees algemene
vir die rekonstruksie van data.
Wat ons nou gedoen is Die algemeen wat genoem
jou data te normaliseer, sodat daar is geen duplisering oral
in jou tafels.
En deur duplisering, sou ek het beteken dat die eerste benadering.
As ons Leitner genoem het en Tov in verskeie plekke
in jou databasis, dit is nie gewoonlik die beste besluit
veral as hul naam mag verander oortyd of in die geval
van die huwelik, nooiensvan mag self verander nie jy wil net een
kanonieke plek vir 'n paar data waarde soos 'n naam.
Alle regte.
So, om saam te vat, het ons het 'n paar ontwerp besluite te neem
en die belangrikste waarskynlik verminder na 'n paar
van hierdie keuses van indekse.
Maar laat my daarop wys 'n ander ding as well.
As ek gaan terug na phpMyAdmin,
een kenmerk wat jy dalk nie voor teëgekom
die volgende.
As ek gaan natuurlik instrukteur, Ek het reeds het bepaal dat 'n
hierdie dinge het indekse.
Maar laat my gaan na die struktuur blad natuurlik instrukteur.
Laat my kliek nou op indekse en kennis van die volgende.
Ek het hier vermeld dat daar is 'n primêre sleutel
op die kolom genoem ID.
Dit is 'n ietwat ingewikkelde weg van die spesifiseer cardinality
en so meer as 'n verwysing na die grootte van die veld in grepe.
Maar nou het ek ook 'n ander veld, loop ID, wat -
Natuurlik ID wat gedoen is vooruit en unieke, OK.
Ek het hierdie een in vooraf vir ons.
So, hoekom is dit - laat my daal ter wille van die bespreking.
O, jy weet wat ek gedoen het?
OK. So, vroeër, een van die gevare van die gebruik van 'n grafiese hulpmiddel
soos hierdie, wanneer ons die skep van hierdie sluit tafel,
die kursus instrukteur tafel, onthou dat ek gespesifiseerde
wat ek wil 'n indeks op hierdie gebied
en 'n indeks op hierdie ander gebied.
Die newe-effek van kontrole beide van die bokse
op dieselfde skerm is dat phpMyAdmin afgelei dat,
wat ek wil nie meer as twee aparte indekse,
dat ek wil 'n sluit-indeks wat is gewoonlik net nuttig
of die meeste nuttig wanneer jy soek op nie een veld
maar beide van die velde.
En dit is hoekom ons ' hulle is daar assosieer
so ek laat val dit saak wat was nie wat ek bedoel.
Inteendeel, ek gaan hierdie om hier te herhaal.
Ek gaan om te gaan na die kursus ID
en onder meer Ek is net gaan sê voeg indeks.
En ek gaan onder gaan instrukteur ID en sê voeg indeks.
En nou as ons hier kliek, kennisgewing wat ons het drie indekse,
een primêre en as ek bedoel een vir elke
van daardie vreemde sleutels.
En ek noem dit omdat buitelandse Natuurlik ID in hierdie tabel kaarte
waartoe veld, net om te wees skoon te maak, in 'n ander tafel.
Die primêre sleutel genoem ID, in die tabel genoem kursusse,
en dieselfde deal vir die ander een.
Maar nou, is 'n interessante mislei en regtig tegniek.
Ek het net voortgegaan en laat my doen 'n bietjie stadiger.
In dieselfde skerm, kennisgewing dit sê Betrokkenheid oog hier.
Ek kliek op hierdie en nou sien ek kry 'n paar beperkinge te doen.
So, een van die upsides ook
nie net gebruik konseptueel vreemde sleutels en ander tafels
soos ons nou net op is wat deur die definisie van 'n indeks
op hulle kan jy die databasis help jy selfs meer
verseker dat die integriteit van daardie gebied.
Spesifiek, kan ek nou spesifiseer via die drop
bepaal dat die kursus ID-veld
in hierdie tabel eintlik kaarte op te courses.id.
Net so, instrukteur underscore ID koppel aan instructors.id.
Nou, hoekom is dit nuttig?
Wel, kennisgewing, aan die regterkant kant wat nou blyk.
Ek kan nou leer om die databasis wat as Henry
byvoorbeeld ooit aftree en sy ry verdwyn
van die instrukteur se tafel heeltemal daardeur word
verwyder, kan ek via hierdie waterval benadering verseker
dat enige kursusse wat hy leer is nie meer wat verband hou met hom.
Ek kan die databasis leer die rye te verwyder
in hierdie sogenaamde sluit tafel outomaties as Henry of as een
van sy kursusse verdwyn.
Nou, hoekom is dit interessant?
Ja?
[Onhoorbaar Nota]
Jy moet dit net een keer te doen en langer termyn, reg?
Dit is baie maklik as soort mense kom en gaan, kursusse kom
en gaan, jou databasis kon net besaai raak met kursusse
en met fakulteit wat nie meer relevant vir die data stel.
En jou data begin om te kry baie slordig en vuil en verjaar,
en so hier het ons kan sorteer
van dwing sommige van hierdie beperkinge.
Ja?
[Onhoorbaar Nota]
Dit weet deur middel van hierdie.
Dit is die skerm waar ons spesifiseer van 'n koppeling
tussen vreemde sleutel en primêre sleutel.
So al die benaming konvensies Ek verwys
vroeër is net konvensies.
Daar is geen inherente betekenis.
Dit is die skerm wat is net nuttig
nadat jy bepaalde indekse op elk van die velde soos ons gedoen het.
En vir hierdie dropdown ons het 'n paar dinge byvoorbeeld
Indien 'n kursus geskrap jy kan eintlik verhoed dat skrap
gebeur indien daar is 'n ry in die tabel
deur net te sê, te beperk.
Met ander woorde Henry kan nie aftree
totdat ons ontkoppel hom van CS51 en CS1.
So dit is 'n goeie ding.
Maar dit kan lei foute in jou kode
As jy nie verwag nie dat, of ons kan 'n waterval het,
'n waterval soortgelyk aan graag Cascading Style Sheets
en die waterval waterval beteken dat indien 'n -
As Henry aftree so - deur om geskrap
so sal sy ry hier verwyder kry.
Geen aksie beteken niks of null is 'n soort van nuttige As jy soort
wil 'n paar van die historiese rekord Henry het geleer CS51,
maar jy moet net wil hê dat die gebied te wees null sodat die rye daar
maar dit is nie meer verband hou met hom.
So dit is baie sterk tegnieke wat jy kan
en moet gebruik, selfs al is in belang veral
spaar jy van jouself.
So laat my melding maak van 'n paar finale besonderhede hier,
bestanddele waarmee wat nuttig kan wees
soos ons beplan vir databasis ontwerp.
Jy het ook die keuse oor die databasis enjin
wat jy gebruik in jou kode.
As jy vertroud is van CS161 jy kan -
of selfs 61 is, kan jy oor die algemeen vertroud te wees met die lêer stelsels.
En daar is dinge soos, NTFS en HFS +
en X2FS4 [fonetiese] en 3 en so meer.
Daar is verskillende maniere van die stoor van data op die lessenaar.
Net so is daar verskillende maniere van die stoor van data
in 'n databasis by verstek ten minste in die toestel
met die nuutste weergawe MySQL.
Ons het al met behulp van die databasis-enjin genoem, Nodb,
wat ondersteun 'n paar mooi eienskappe.
Maar nog 'n algemene een is ook genoem MyiSAM en nog 'n
wat kan wees gebruik is Memory, wat beteken nie sit enigiets
op die skyf, hou net dinge in die geheue.
Vir die grootste deel jy waarskynlik sal nie verkeerd gaan net begin
met Nodb nie, maar vir enige projekte wat geneig is om hoë pryse te betrek
van plasing byvoorbeeld, soos 'n baie vinnige te meld,
honderde van die dinge wat per sekonde of duisende van die dinge.
Wanneer jy 'n baie dinge aan die gang
in die databasis Dan is hierdie soorte
van 'n laer vlak besluite begin om betrokke te raak.
Die volledige teks funksie vir byvoorbeeld werk net in MyiSAM
sodat 'n implikasie.
Maar jy kan onthou dit, laat ons ten minste te motiveer hoekom ons omgee
oor Nodb in die besonder.
'N wedloop voorwaardes algemeen verwys na wat?
Alle reg, dit is 'n verwysing na 'n voorbeeld 'n paar
van julle dalk in gehoor het die afgelope jare of 161 of 50
waar jy 'n kamermaat, albei van julle regtig soos melk,
een van julle by die huis kom eerste oop die yskas is daar geen melk,
sluit die yskas loop oor strate te CVS en kry
in lyn melk te koop.
Intussen het jou kamermaat kom terug hier.
Sy hou ook van melk.
Maak die yskas en besef nie melk.
Hier dan gaan sy die stoor, miskien is die ander CVS.
Vinnig vorentoe 'n paar minute later kom jy terug en nou het beide
van julle het melk gekoop.
Een van hulle is nou gaan te bederf omdat jy nie
soos melk wat veel en dit is 'n probleem, reg?
Omdat beide van julle geïnspekteer die toestand van sommige veranderlike
en 'n beslissing op dit selfs al is die staat
van daardie veranderlike was in wese in die proses om te verander,
al word dit stadig oor die bedrag van die tyd wat dit neem
te kry en na CVS.
So, wat is 'n soort van dom werklike wêreld oplossing vir die probleem?
Laat 'n noot, reg?
Dit gebeur laaste keer.
Altyd laat 'n nota of slot die ding letterlik.
En ek sê slot, want As jy nie neem of geneem CS161,
sluiting is 'n fundamentele idee in daardie soort van die wêreld.
So wedloop omstandighede kan ontstaan ook in die databasis wêreld
en jy kan miskien onthou uit CS50 finansier as jy het 50,
hierdie kode wat ons eintlik het julle ouens in die spesifikasie
in die tyd, sodat jou werking word so genoem atoom.
As jy wil, in hierdie geval, koop 'n aandeel van voorraad
en dat die voorraad het 'n besondere simbool.
Ons het jou kode te gebruik soos hierdie, want deur middel van hierdie
op duplikaatsleutel update sintaksis, wat gebou is
in MySQL jy effektief is doen óf in insetsel
of in update na doen 'n kies om te sien
As 'n voorraad is reeds daar.
Met ander woorde, die analoog in die wêreld van die koop van 'n voorraad
melk en die yskas mag wees, in die eerste,
voor die koop van 'n deel van Google jy dalk wil om te kies
uit die databasis van al die aandele van Google dat Dawid besit
om te sien of hy besit nul of meer.
Sodra jy sien of hy besit nul of meer jy
dan doen die volgende.
Jy het óf 'n insetsel te doen
indien hy die eienaar van nul want daar is geen ry vir Dawid nie,
of jy het 'n werk te doen indien minstens in teorie wat jy wil hê
een ry per gebruiker te hê.
Die probleem is die keuse van dat die getal aandele
en dan werk of invoeging kan onderbreek word
deur iemand anders by 'n ander rekenaar terminale probeer om te koop
of te verkoop 'n paar van Dawid se aandele van aandele of
vir 'n goeie doel of soort van kwaadwillige doeleindes.
Dit is soos om na die winkel wanneer jou kamermaat kry terug
en gaan die staat van die veranderlike.
So hierdie sintaksis in die tyd wat was soort van toepaslike
vir CS50, vermy wat probleem geheel en al.
En dit is nie net dit alles magic van sluit vir jou,
maar nou met hierdie soort projekte vir hierdie kursus
wat waarskynlik sal behels meer komplekse data-stelle,
jy kan nie bereik altyd hierdie atomiciteit.
Alles gebeur in 'n keer of glad nie
sonder onderbreking so elegant.
En so MySQL, 'n ander databasis enjin,
ondersteuning dinge genoem slotte,
waardeur jy kan slot sê dit tabel sodat net een verrassing
en oor die algemeen net een gebruiker kan raak dit in enige punt in die tyd
lees of skryf nie en dan kan jy dit ontsluit.
Dit is 'n voorbeeld van een MySQL se eie verwysings,
waar as jy soos 'n bank rekening wat jy probeer
geld te trek uit en voeg dan geld.
Jy mag dalk wil maak seker dat beide
van daardie dinge saam gebeur
sodat daar geen wiskundige foute
en niemand verliese geld, een of ander manier.
Die probleem met die slotte alhoewel in 'n databasis is
dat dit in die algemeen beteken die hele tafel is gesluit,
wat beteken as jy ' 'n honderd mense wat probeer
besigheid te doen met jou bank aanlyn by dieselfde bedrag
van die tyd slegs een van hulle kan gaan op 'n tyd.
Wat is dom, veral op bedieners deesdae
wat agt natuurlik, 16 Natuurlik, het 'n groot hoeveelheid
geheue, is daar geen rede al te serialized
van jou transaksies indien daardie kliënte gaan net
om met hul eie rye.
So Nodb kan jy doen dinge meer intelligent
en dit in die algemeen sal wees die benadering wat jy neem in die kode,
as jy iets gebruik genoem die transaksie.
En jy doen dit in die algemeen in PHP-kode,
Ruby kode, Python, wat ook al.
Maar die SQL-kode wat uiteindelik gebruik, is dit,
tipies.
Begin transaksie dan is jy spesifiseer twee of meer navrae
wat jy wil voer heeltemal
sonder onderbreking of glad nie.
Daar kan selfs 'n paar kies state in
of 'n Verwijdert of updates.
Maar die lekker ding is dat die databasis sal slim genoeg wees
om seker te maak dat dit sal slegs sluit die rye hulle is eintlik
betrokke is by hierdie updates of kies of verwyder.
So as jy het duisende rye en jy net raak drie
van hulle nie, net dat subset van die tafel sal gesluit word
wat beteken die ander 99 kliënte hul rye kan raak
sonder om serialized en vertraag deur jou.
Intussen is dit die mooiste aspek van transaksies.
Hulle is transaksies in 'n voel soos 161 op 'n lêer stelsel,
hulle is transaksionele
wat beteken dat jy kan rol hulle terug, kan jy ongedaan hulle.
Dit is soos die opdrag of beheer F van databasisse.
As jy ontdek deel pad deur al
van jou verskeie data operasie, skiet, is iets wat verkeerd gaan.
Jy voer letterlik 'n verskillende SQL navraag roll terug
en al hierdie tendens - al van die stellings wat jy uitgevoer
nadat sê begin transaksie verdwyn
asof hulle nooit gebeur het nie,
wat is 'n ongelooflike kragtige ding.
En dit is die aard van die dinge beslis in 50 ons soort
van vee onder die mat en jy net soort van aanvaar
dat al sal goed wees.
Maar sodra jy begin dink oor die werklike projekte
en die werklike gebruikers en die integriteit van die databasis,
Dit is die soort van ontwerp besluite
wat gaan belangrik wees.