>> Oke.
Dus, zonder verder oponthoud, SQL, Structured Query Language.
Dus, heb je waarschijnlijk gebruik gemaakt van deze op althans in CS50, misschien in CS165,
misschien in je eigen persoonlijke projecten.
En wat betekent SQL laten doen, in een SQL Server-meer in het algemeen?
Yeah?
[Onhoorbaar Opmerking]
OK, dat was erg beveiligde manier om het te zeggen.
Ja. Zo is het mogelijk u om gegevens op te slaan
en nog belangrijker maakt u te vragen voor data.
En dit is een stap vooruit
van het gebruik van iets eenvoudiger als een CSV, rechts.
Comma Separated Variabelen.
Gelijkaardige waarden.
Op dezelfde manier kunt u besparen informatie een rij
in een tekstbestand.
Maar wat is het nadeel van een CSV-bestand voor het opslaan van uw gegevens,
ook al heb je effectief krijgen rijen en kolommen van het?
Yeah.
>> Je hoeft niet 'hebben dezelfde organisatie
efficiëntie [onverstaanbaar].
>> Je hoeft niet hetzelfde zijn organisatie efficiëntie.
Wat bedoel je?
>> Nou, zoals [onverstaanbaar] hebben als primaire [onverstaanbaar].
>> OK. Yeah.
>> Het is een relationele database kunt u meerdere databases
elkaar verbonden in zeer specifieke manieren.
>> OK. Goed.
>> Het is [onverstaanbaar] naar een CSV stellen.
>> En laat me tweaken een beetje terminologie.
Dus meerdere tabellen in een database, zeker,
en die verder gaat dan wat je kunt doen met slechts een CSV.
Maar echt de beperking met CSV Ik zou willen stellen is
dat de inefficiëntie van dit alles.
Het is heel gemakkelijk om de lay-out.
Maar als je wilt een doen vraag, wat is de looptijd
van een selectiequery op een CSV-bestand?
Ik bedoel het is groot oud [onverstaanbaar], recht, want in het ergste geval,
zij stonden helemaal onderaan.
Zelfs als je de hele opgelost had CSV-bestand, als je niet weet
dat vooraf, goed, je bent nog steeds gaat hebben
het geheel zoeken.
Dus, onder de dingen we gaan krijgen
gebruiken een effectief database met behulp van een taal
zoals SQL is dat we kunnen opvragen het en we kunnen op voorhand
als databaseontwerpers specificeren hoeveel de velden
die waarschijnlijk zouden moeten gaan vragen over zodat mensen
bij MySQL of Microsoft of Oracle,
wie heeft de database gemaakt je gebruikt allemaal kunnen doen
van het harde werk van uitzoeken, OK,
krijgt een miljoen van deze IDS.
Hoe kunnen we de lay-out - ze in het geheugen?
Een soort van boom structureren misschien,
zodat wanneer je dat doet daadwerkelijk uit te voeren Select,
het is iets dat is logaritmische of logaritmische
van logaritmische in tijd in plaats dan eigenlijk delegeren
in iets lineair.
Zo kregen we een heleboel prestaties die manier.
En we kunnen ook veel meer op te slaan gegevens gemakkelijker want de SQL
Server wordt meestal opgeslagen RAM hoewel delen
daarvan kan worden opgeslagen op schijf en u waarschijnlijk weet nu
dat RAM algemeen sneller dan schijven,
dus dat is een goede zaak.
En we kunnen ook omgaan met concurrency veel beter.
Als u hebt genomen 165 of 161, je weet dat als twee mensen proberen
om hetzelfde te doen tegelijkertijd op een systeem,
slechte dingen kunnen gebeuren in het algemeen.
Dus tussen de andere functies die we kunnen krijgen als we het ontwerp van onze tafels
op de juiste manier is betere ondersteuning en beveiliging
als het gaat om concurrency.
Dus, twee mensen in twee delen
van de wereld met dezelfde website, als ze beide proberen
iets tegelijkertijd kopen tijd, is die volgorde niet van plan
gelijktijdig in te gaan.
Een of andere manier zouden ze in series door andere dan de onze iemand -
iemand anders dan onszelf.
De database wordt dat voor ons doen.
Dus als het eenvoudigste vorm,
SQL-query laat ons een relationele database.
Een relationele database is een dat men
of meer tabellen in het algemeen.
En als dit een kleine onbekende,
kan je eigenlijk alleen maar denken van deze als Excel of nummers
of Google spreadsheets.
Het heeft alleen rijen en kolommen en typisch boven aan elke
van die rijen heeft een naam voor.
Dus dit kan het ID worden kolom, de kolom naam,
de kolom adres enzovoort.
En dan kun je meerdere hebt dergelijke tabellen als u wilt
om te beginnen met de aanleg van verschillende soorten data.
Maar je kan herinneren tenminste van CS50 die we hebben geprobeerd
om u een GUI-gebaseerde gereedschap [onverstaanbaar]
om uw database te beheren.
Het heette phpMyAdmin.
Dus het is gewoon toeval dat het werd in PHP geschreven, echt,
maar het was gewoon een web-based front-end voor een database.
En via de verschillende tabbladen en links kan je begint
met een database configureren voor jezelf.
Maar een goed hulpmiddel om te beginnen met krijg een beetje meer comfortabel
met ook de command-line client.
Dus, als u de CS50 Appliance of echt gebruik van een macro PC
dat heeft een command line van MySQL client, kunt u ook sorteren doen
van de oude school, zoals deze.
Even terzijde: de MySQL project, althans de open source versie
ervan heet nu MariaDB voor verschillende redenen waarom je kunt lezen
op Wikipedia, maar het is dezelfde software,
het is dezelfde syntax enzovoort,
vrijwel dezelfde codebasis.
En dus als ik op dit prompt Ik kan nu communiceren
met mijn gegevensbestand veel meer handmatig.
Dus geval, laat me ga je gang
en gewoon open te stellen een terminal venster.
Ik was toevallig worden met behulp van de CS50 Toestel, maar u kunt dit doen
op vrijwel elk systeem die je de juiste
software geïnstalleerd.
En ik ga doen MySQL-u voor gebruikersnaam John Harvard
dit specifieke systeem, p- voor een wachtwoord dat ik typ
in iets meer stevig door op Enter.
Nu ben ik gevraagd.
Ik ga karmozijn typen in de CS50 Appliance
en nu zie ik in wezen dat hetzelfde scherm.
Maar er is nu opdrachten dat we kunnen beginnen met typen
zoals blijkt databases en dat gaat me alles laten zien
van de databases die ik heb al gemaakt in het systeem,
vrijwel dezelfde lijst je zou zien in phpMyAdmin.
Er zijn een paar anderen zoals informatie schema en de test,
die als je zak rond de CS50 Appliance, verbergen we een aantal
van deze lagere niveau tabellen
maar ze geweest zijn er al die tijd.
MySQL heeft eigenlijk laag niveau eigenschappen zoals gebruikersnamen
en wachtwoorden voor de database zelf, niet voor uw toepassing
dat je misschien wel draait op de top van het.
Dus op voorhand, vandaag, ik creëerde een paar databases,
een van die heet courses50.
Kansen zijn sommigen van u hebben gebruikt CS50 natuurlijk shopping tool,
die een grote interface voor van de registrar studiegids.
En dit is eigenlijk een mooi dataset om te praten over 'oorzaak,
een, we zijn een soort van alle uiteraard vertrouwd met cursussen
en instructeurs en ontmoeting locaties en alle soort
van gewone dingen van de universiteit,
maar het is ook nog wat interessante mogelijkheden
voor het ontwerp.
Dus dachten we dat we gebruik maken van de notie van een studiegids
en een shopping tool als een bijvoorbeeld gedurende om te sorteren
kader van enkele ontwerp beslissingen die we moeten maken.
Dus laten we daar beginnen.
Stel dat ik eigenlijk wilde de super eenvoudigste vertegenwoordigen
natuurlijk winkelen gereedschappen.
En de eenvoudigste wereld Ik kan me voorstellen en een is
waar zijn er cursussen en er zijn instructeurs.
En laten we veronderstellen Ter wille van de discussie
dat elke cursus minstens een naam.
Dus laten we beginnen te schetsen dit uit.
Ik ga phpMyAdmin gebruiken net als een gemak,
zodat we niet hoeven te typen alle vragen handmatig.
Maar hier ben ik in mijn courses50 databank.
Als u niet weet dit, het zal heel makkelijk als je eenmaal duiken
in om je eigen project als je wilt om het te gebruiken.
Ik ga het creëren van een tabel met de naam Cursussen
en ik kan alleen maar denken van een veld
voor nu, de naam van een cursus.
Ik ga om te gaan en zeg geef me een kolom.
Nu, als u zich herinneren je krijgt een interface die een beetje
als deze.
En de andere ondersteboven eerlijk gezegd van phpMyAdmin is dat het soort
van zelf-instructie en die via de dropdowns, kunt u sorteren
van zien wat uw mogelijke ontwerpbeslissingen zijn.
Dus ik ga geven elke cursus een naam.
Dat is de naam van deze kolom.
En hoe zit het gegevenstype?
De meesten van jullie moeten kennen op Tenminste enkele van deze gegevenstypen
uit eerdere ervaring.
Wat is de juiste voor de cursus naam?
Sharon?
>> Varchar.
>> OK, varchar die is Variabele Char.
En wat doet dat betekenen meer technisch?
[Onhoorbaar Opmerking]
OK. Dus het is een string.
En de var aspect van het impliceert wat?
Variabele. Maar wat betekent dat?
Yeah?
[Onhoorbaar Opmerking]
Precies. Dus het is een variabele aantal tekens
in de string omhoog sommige maximum.
Dus hier is onze eerste ontwerpbeslissing.
We hebben eigenlijk te beslissen hoeveel bytes maximaal
toe te wijzen aan elk van deze string.
In het algemeen, je wilt soort van het niet te klein te maken,
het niet te groot maken Want voor de hand liggende
als te klein je bent gewoon gaan beginnen truncerende gegevens
en je zult informatie verliezen.
En als het te groot is, je bent gewoon soort van het vertellen van de database
te verwachten en te optimaliseren voor meer gegevens
dan is het misschien eigenlijk ooit.
Dus wat is een redelijk gevoel nummer voor de naam van een cursus?
60? OK, dus 60.
Dat lijkt redelijk
zolang is er geen uitzonderingen op dat.
Er is echt geen harde, snelle regel.
Om eerlijk, voor zijn historische redenen veel
mensen zullen kiezen voor 255 Want al jaren dat soort was
van het standaard maximum behulp van 8 bytes - 8 bits als uw toonbank.
Ik zou meer [onverstaanbaar] misschien machten van 2 gebruiken
maar het is een soort irrelevant.
Dus we kunnen gaan met 60.
Dat lijkt redelijk zo lang
als we uiteindelijk geen spijt Want dat is een bovengrens.
Nu, stel dat het tegenovergestelde besluit was genomen,
niet variabel chars maar gewoon het veld char.
Dus in tegenstelling tot C en C + +, char betekent niet dat men char
en databases die betekent over het algemeen een vast aantal
tekens in een string.
Wat zouden de kop en / of zijn nadeel van mijn keuze 60
voor een char veld, in plaats van varchar?
Dit is precies de eerste soort van de beslissing die je zult moeten maken
bij het inspecteren [fonetisch] uit van het project met uw partners.
Ja, Sharon opnieuw.
[Onhoorbaar Opmerking]
Goed. Dus als de naam is minder
dan 60 dan ben je verspilt wat dat ook delta is
tussen 60 en werkelijke lengte.
Dus dat voelt gewoon verspilling, meer bytes dan je nodig hebt.
Maar waarom bestaat het?
Zeker is er een aantal op zijn kop.
Yeah?
[Onhoorbaar Opmerking]
Tuurlijk. Dus soms moet je zou het vaste nummer te kennen
van karakters als 10 cijfers voor een telefoonnummer bijvoorbeeld.
Maar who cares, zoals waarom Niet alleen zeggen 11 toch
of waarom niet zeggen 60 toch met de varchar?
Welk voordeel krijgen we door te weten en ontwerpen
voor een vast aantal tekens?
[Onhoorbaar Opmerking]
Je bent op de goede weg.
Dus het is optimalisatie, maar het is echt van - ja?
[Onhoorbaar Opmerking]
OK. Goed. Laten we de focus Op dat laatste deel.
Zo indexeren.
Dus het blijkt als je van tevoren weten dat alle
van uw velden gaan 60 tekens zijn,
kan je echt denken van deze kolom in de Excel databank
als het hebben van zeer rechte, links uitgevuld
en rechts uitgelijnd randen
omdat elke kolom is 60 tekens breed.
Dat betekent dat deze string 60 letters weg
van deze string, 60 personages weg van deze
en deze en deze.
Dus gewoon graag terug als je geleerd C, je random access had
in de wereld van arrays hetzelfde idee hier.
Als uw kolom wordt vertegenwoordigd met alleen vaste lengte tekens,
U kunt effectief index willekeurig in 60 of 120 of 180
en je kunt op individueel krijgen snaren veel sneller.
Dan als in plaats daarvan, je column had een rechte linker rand zogezegd
maar een zeer robuust recht rand aan de kolom
omdat je misschien hebben 10 tekens,
15 tekens, 5 karakters.
Dus ook dit is een afweging.
En soms alleen door middel van trial and error
en experimenten kunt u uitzoeken
wat echt de juiste oproep is maar dit zijn de soorten
van vragen die te gaan
door je gedachten en / of tafels wanneer het tijd is
voor het ontwerpen van uw database.
Dus, niet noodzakelijkerwijs recht beantwoorden, maar je moet
tenminste enige zin of twee in het achterhoofd
een back-up wat beslissing die je maakt.
Oke.
Dus laten we blijven scrollen in de aanwijzingen hier
dat zijn UI phpMyAdmin's.
Dus, de standaardwaarde voor een naam, moet ik opgeven
dat het zou moeten zijn een standaardwaarde van nul?
Wat denk je?
Kan een cursus hebben een null naam?
Voelt gewoon raar, toch?
Ik kan niet denken van een naamloos cursussen op Harvard.
En misschien is er een aantal obscure hoek geval
waar een cursus wordt gegeven van een aantal
en de professor heeft niet gekozen voor een naam voor, maar -
Ik bedoel, om heck met dat,
als laten we eens niet moeite ondersteunen dat.
Ik zou zeggen in het belang van een mooie schone database,
laten we aangeven dat u niet kunt hebben een standaard waarde van nul.
Als alternatief kunnen we doen iets als untitled cursus
die niet anders met Mac OS en Windows doen
wanneer u een te maken map bijvoorbeeld,
maar dat maakt een beetje meer zin
zodat de mens iets zien.
We hebben het over een back-end database vermoedelijk
voor studiegids.
Dus ik doe niet echt eens het idee van het geven van het
in untitled cursus namen
want dat is niet echt gaan om iedereen te helpen.
Dus laten we dit laten zoals niemand, wat betekent dat wanneer u invoegt
in deze databank niet, je hebt aan elke cursus een naam te geven
die een beetje voelt reiniger voor mij.
Oke.
Dus scrollen verder, collatie.
Dit heeft gewoon te maken met tekensets en wat al niet
als je ooit hebt gezien vermeldingen van de Zweedse
phpMyAdmin is dat Want het volk
die phpMyAdmin schreef waren Zweeds.
Is dat PHP of is het MySQL?
Een van de twee I vergat onvoorbereid.
Maar het is om historische redenen
maar u kunt elke uitdrukken karakter in het Engels
dat je kon met de Zweedse dus het is grotendeels een non-issue.
De CS50 Appliance is echter gebruikt - geconfigureerd om UTF-8 te gebruiken,
zodat algemeen moet geen pop-up voor je.
Attributen.
Dus geen van deze zijn echt relevant hier.
Ik zie Binary, Unsigned, Unsigned zerofill,
en op bijwerken huidige timestamp.
Dit veld is alleen van toepassing sommige numeriek veld
of een tijdvelden.
Dus we zullen overslaan die volledig.
Null. Kan dit gebied null?
Dus geen. Die we al hebben dat soort gesprekken.
Dus we willen niet een standaardwaarde.
We willen niet dat het nul zijn.
Hoe zit index?
Er zijn vier keuzes.
Wat betekent het als we opgeven
dat deze rij gaat een primaire sleutel zijn?
Terugdenkend aan CS50 of CS165 als je het hebt genomen.
[Onhoorbaar Opmerking]
Precies. Dus een primaire sleutel per definitie is het veld
die uniek identificeert elke rij van deze tabel.
En u kunt vertrouwen op te doen die unieke identificatie.
Dus, wat betekent het dan om gewoon uniek?
Nou ja, soort van deze twee heeft soort
van minder gevolgen onder de motorkap.
Maar over het algemeen, primaire sleutel is soort van een contract dat u te maken
met de database ding.
Toen ik queries te doen op zoek naar een cursus,
Ik ga dit gebruiken bepaald gebied.
En we komen terug te komen waarom we zouden kunnen hebben twee
dergelijke keuzes, primaire of unieke.
Unieke gewoon zegt, is dit veld zal uniek zijn
maar ik ben niet echt het maken van een soort verbale engagement hier
dat veld gebruiken naar mijn opzoekingen doen
om redenen die we zullen zien in slechts een moment.
Als we opgeven in plaats index, wat betekent het om op te geven
dat een veld heeft een index op het?
Yeah?
[Onhoorbaar Opmerking]
Precies. Het is al geoptimaliseerd voor zoekopdracht.
Dus u - databaseserver, Oracle, MySQL, wat,
zal in het algemeen zijn magische werk achter de schermen als u klikt
die optie en klik vervolgens op Opslaan en het zal bouwen
up typisch een boomstructuur B-bomen als je hebt gezien
of gehoord off dat is een zeer korte uitziende boom
dat geeft je heel mooi logaritmische eigenschappen
bij het zoeken op de gegevens.
Als je niet een index opgeven op een veld, wat is er
de running tijd van het zoeken
voor een willekeurige [Fonetisch] Natuurlijk naam?
Wat is dat?
[Onhoorbaar Opmerking]
Oh, [onverstaanbaar], lineaire, toch?
Als het er geen optimalisaties toegekend aan de database
en je hebt niet gedacht de database wat voor soort
gegevens verwachten.
Het beste wat je kunt doen is controleren alles wanneer je op zoek bent
enige waarde, vooral indien er kon
in feite duplicaten.
Full-text ondertussen, zullen we zwaaien onze handen voor nu.
Maar in het algemeen is dit een type index waarmee u
te optimaliseren voor zoekwoorden zoekt op een veld.
Dus dit misschien een goede kandidaat
voor als een vakbeschrijving waar je een paar zou kunnen hebben
van alinea's en je zou willen substring wedstrijden doen.
Volledige tekst zal in het algemeen laten je dat redelijk efficiënt te doen.
AI, dit is een vreselijke soort uitleg maar als we zweven
overheen zie je Autotoename.
Niet van toepassing zowel hier maar autotoename is nuttig
voor als het veld een int, omdat de database zal zorg dragen
het proces van plus plusing het elke keer als je een insert doen.
Zodat zelfs wanneer twee personen letterlijk op Verzenden
tegelijkertijd en probeer een rij of andere manier te maken
in de database, een van ze zal het aantal die ik krijg,
de andere krijgen het nummer dat ik plus 1.
U hoeft geen zorgen te maken
twee nummers worden identiek toegewezen als je
om dit zelf te doen in de code.
Oke.
Dus ik soort graag waar we hebben een naam te hebben.
Dus laten we op Opslaan.
Is dit een goed ontwerp voor een database tabel?
En als een terzijde als roestige op SQL of u sorteren
van gewoon altijd door de vingers oog op wat er gaande was,
Ik had getypt precies dat -
deze drie lijnen die zwart en wit prompt
in de opdrachtregel cliënt of ik had kunnen doen
dat in de code programmatisch.
Dus alle phpMyAdmin doet voor me, is gewoon bespaart me de moeite
herinneren soms de syntaxis en typen uit voor
als vervelend opdrachten.
Oke.
Dus dit voelt niet als de beste ontwerp, een veld tafel.
Nu konden we dingen zoals professoren
en locaties en beschrijvingen.
Maar zelfs dan, met behulp van alleen de naam
om cursussen te identificeren voelt niet ideaal.
Wat algemeen we in het verleden gedaan
als je hebt gebruikt databases voor de unieke rijen?
Het niet gebruiken van varchars typisch.
Yeah?
[Onhoorbaar Opmerking]
Yeah. Zo typisch een cursus-ID.
Dus, de meest voorkomende aanpak hier vooral
bij gebruik van een raamwerk is eigenlijk alleen
een nummer te gebruiken als een geheel.
Dus laat me gaan en doen dit.
En we kunnen dit doen in een paar manieren, maar bericht als ik zoom
in de bodem hier.
Ik ga zeggen voeg een kolommen bij het einde van de tabel,
over het algemeen alleen voor visuele gemak je IDs
aan het begin van de tabel ook al is dit geen echte
functioneel effect.
Dus ik ga zeggen voeg een kolommen
aan het begin van de tabel.
Ik ga klik op Start, dat geeft me terug deze UI hier.
Laten we noemen dit ID.
Als we denken dat we zullen moeten niet meer gedaan 4.000.000 cursussen
veld een int is prima.
We konden zelfs krimp neer
maar de ruimte is goedkoop dus die echt cares.
Maar, we proberen schrijf Facebook nu,
zou een slechte zaak zijn om te anticiperen op grote ints
die ons zou geven 64-bit ints
maar dan heb je letterlijk bent verdubbeling van het aantal bits
dat u gebruikt, zo gering afruil
maar iets om te overwegen.
Nu is dit een verwarrende legacy ding.
Je herinnert je misschien van het gebruik van MySQL
dat wanneer je een int verklaren veld zul je vaak zien een aantal
naast het als de nummer 10.
Het heeft niets te maken met de omvang van het aantal
of het aantal bits.
Dat heeft te maken met het aantal van tekens die worden gebruikt
om het display visueel dat int veld
bij gebruik van een terminal venster.
Zo kunnen we zien dat in een moment.
Dus, laat je niet misleiden door het intikken van nummers
daar ook al is het ons wezen te vernemen
voor een hier.
Hier, ik ga ga je gang en zeg niet ondertekend.
Er is geen reden om afval al onze negatieve getallen
aangezien de database algemeen gaat
positief veronderstellen waarden of null.
De ID zeker mag niet null zijn.
En wat vind je van de index voor dit veld ID?
Laten we het belangrijkste.
Dus, wat als, hoewel, zoals ik kan alleen maar denken aan een CS164 natuurlijk
aan Harvard en slechts een CS50 cursus bij Harvard
en dat is vrij veel waar algemene
dat er misschien uitzonderingen [Onverstaanbaar] beide semesters
of iets raar als dat.
Maar meer fundamenteel, waarom is het beter
een numerieke integraal ID gebruiken unieke cursussen te identificeren in plaats
dan alleen een unieke reeks?
Yeah?
[Onhoorbaar Opmerking]
OK, interessant.
Dus als we hadden een soort van cross-genoemde cursussen.
Dus dat is een goed voorbeeld van.
Ik weet niet of ik zou lossen dat hoewel
door hen dezelfde ID-nummer als dat
waar je gaat mee.
Nee? OK. Maar zeker een hoek zaak te overwegen.
Als er een soort van - we een soort nodig
van aliasing mogelijk.
[Onhoorbaar Opmerking]
Tuurlijk.
[Onhoorbaar Opmerking]
Dat is een goed voorbeeld.
De naam zou dan veranderen tijd, volstrekt redelijk.
Wat anders?
[Onhoorbaar Opmerking]
Sorry, zeg nogmaals.
[Onhoorbaar Opmerking]
Ja, precies.
Dus echt, dat is de echte dooddoener is
dat het gebruik van een 32-bits int is waarschijnlijk gaat sneller
dan sommige variabele lengte char veld.
In het eerste geval kan de letterlijk passen in een register,
niet veel om op te noemen kleinere memory footprint.
In het laatste geval, je gaat te hebben om plaats te doen [fonetisch]
string vergelijkingen die op zichzelf met de lineaire
de omvang van de snaar potentieel.
Dus, het is gewoon een leuke optimalisatie,
en in het bijzonder het gaat
om ons te laten doen wat worden genoemd Efficiënter sluit zich
in slechts een moment.
Dus laten we dat doen.
We zullen aangeven dat Dit is primair
want ik heb niet bijzonder willen zorgen of denken
over wat het aantal is van een cursus.
Laat ze nemen welke waarden ze willen.
Ik ga autotoename zeggen dus ik kan dat detail uit te besteden.
Zoals in opzij je misschien weten dat Harvard
tenminste wel unieke nummers voor cursussen.
Ik heb geen herinnering wat deze cursussen is.
Ik weet dat CS50's catalogusnummer is 4949,
volkomen willekeurig.
Maar er is vreemd hoek gevallen dat zelfs
in de registrarial dump natuurlijk catalogus gegevens,
soms cursussen, oud opleidingen hebben een nummer als 4.
Maar dat technisch veld is een char veld
die gewoon begint bij 0004.
Dus ook hier, je moet voorzichtig over het onderscheid
tussen dingen als een Natuurlijk catalogusnummer
waarin sommige menselijke misschien begrip vaste lengte, 0004,
en je moet niet opslaan die bijvoorbeeld in een integers.
Dat soort veld moet elders worden opgeslagen.
Dus in Harvard, als we eigenlijk het maken van een cursus
shopping tool, het is waarschijnlijk niet voldoende
naar nummer cursussen met slechts 1, 2, 3, 4.
We waarschijnlijk zullen moeten
een ander veld hebben riep catalogusnummer,
die wordt ook verondersteld Based uniek zijn
op de menselijke conventies hier maar het is niet de beste keuze
voor een unieke identificatie, omdat kan het variabele lengte.
Het is misschien niet vier chars, is het misschien vijf.
Sterker nog, ik denk dat een paar jaar geleden verhuizen ze
naar oorzaak vijf tekens 'er waren meer dan 999 cursussen
in totaal of iets dergelijks dat, of 9999 cursussen.
Dus, dat zou een voorbeeld zijn wanneer het veld niet primair
maar het moet uniek zijn.
En e-mailadres is een andere.
Je zou willen dat het uniek zijn
maar niet noodzakelijkerwijs uw primaire sleutel.
Oke.
Dus laat me bang van een ander tabel veel sneller dan deze.
Dus ik ga dit noemen een Instructeurs en ik ga
om dit een totaal geven aantal kolommen van twee.
Ik ga om te leren mijn les van de vorige keer.
Ik ga om te bellen de eerste kolom ID.
Ik ga om te roepen tweede kolom Naam.
Ik ben ook gaan doen Varchar.
Ik ga ervan uit dat er geen professor heeft een naam langer
dan 60 tekens, hoewel Nu dit zou kunnen duwen
met een aantal lange namen, speciale mensen met midden namen.
Dat is prima voor vandaag.
Dus laten scrollen over hier.
Laten we opnieuw te maken deze niet ondertekend.
Laten we dit primair.
En we zullen dubbele namen toe
in het geval er twee John Smith's of iets dergelijks.
En nu hebben we twee tafels.
Dus nu, dit roept de vraag hoe kan ik associëren
in instructeur met de cursus?
Ik voel me alsof ik soort van kreeg voor mezelf
want als een instructeur leert een cursus,
mijn eerste instinct zou eigenlijk om terug te gaan
om cursussen te realiseren, dit was geen goed idee.
Laat me daadwerkelijk toe te voegen een kolom Aan het einde van de tabel,
klik op Start, en ik zal noemen dit Instructeur.
En ik zal dit varchar maken en Ik zal dit 60 te maken.
En misschien zal ik het nu weg null
in het geval de cursus heeft niet zijn unsigned in instructeur
die soms gebeurt er voor termijn begint en klik op Opslaan.
Welke van deze ontwerpen heeft uw voorkeur?
Eerste waar we een tafel aparte instructeur
of de tweede waar we net voeg een veld aan de cursus?
Dus het is een nauw verband instructeur cursus.
[Onhoorbaar Opmerking]
OK. Goed. Maar laat me terug te duwen.
Het is net zo simpel als ik kan typ gewoon de naam van de persoon
in deze tabel, net als zeker dat heeft enkele waarde of -?
[Onhoorbaar Opmerking]
Oke.
Nou, laat me hier moeilijk zijn.
Dus laat ik zeggen dat deze cursus is CS51
en ik weet dat het onderwezen dit jaar door twee personen.
Dus, Henry Leitner en Jesse Tov maar -
dus ik zal gewoon een komma tussen de twee, rechts.
Ik ben erg goed in CSV van weleer.
[Onhoorbaar Opmerking]
Precies, rechts.
Zodra je toevlucht om iets als dit,
die zou kunnen voelen redelijk en je zou voelen
als dit is soort van smart.
Ik ben soort van lenen van een idee, dat is goed te werken,
lenen een nieuw idee en soort combineren.
Je bent soort totaal verslaan het punt met de database
in oorzaak de eerste plaats ' Als een van de waarden
van het gebruik ervan is sneller zoekopdrachten vanwege de verschillende indexen
en tafels die kunnen worden opgebouwd voor u
door de database-engine zelf.
Nu, als je wilt zoeken voor alle cursussen
dat Jesse leert, nu heb je te doen substring matching op alle
van de instructeur velden,
wat in feite betekent lineaire opnieuw zoeken want je hebt
deze willekeurige reeks vinden van drie personages overal
in de instructeur veld voorafgegaan
binnen misschien gevolgd door een komma.
Dus dit zeker voorspelt niet veel goeds.
Dus laat me terug naar de tafel gaan.
Laat me gaan vooruit naar cursussen, ongedaan te maken dat.
Ik ga gewoon gaan vooruit en drop dat veld.
En als je wilt handmatig doen dit,
de syntax is ALTER TABLE cursussen DROP instructeur.
Dus laten we verder gaan en ja zeggen tegen dat.
En ga terug naar deze eerdere idee
waar ik een aparte tafel voor instructeurs.
Maar nu dit voelt een beetje zoals ik kan een cursus zetten
in de tafel van de cursus en instructeur
in tabel van de instructeur, maar ik een of andere manier moet verbinden de twee.
En hoe zou je stellen wij dat doen?
[Onhoorbaar Opmerking]
Goed. Dus laten we dat doen.
En je zou kunnen noemen dit tafel in theorie iets.
Ik ga bewust noem het wat veel
kaders zou noemen, onder hen,
Laravel zoals u zult zien in een beetje.
Ik ga het natuurlijk bellen onderstrepen instructeur.
Met enkelvoud in deze Bij elk van de woorden
en alle kleine letters weer, en ook met de -
vervolgens alfabetisch gesorteerd van links naar rechts.
Dit is volstrekt willekeurig, maar het neigt naar een conventie
in veel van deze kaders in PHP in andere talen.
Hoeveel columns heb ik nodig Dit noemen we een join tabel,
twee andere sluiten tafels bij elkaar?
Drie kolommen?
Welke - wat zouden ze zijn?
[Onhoorbaar Opmerking]
OK. Goed. Dat werkt.
En we konden technisch snijd een hoekje hier, maar veel
van de kaders in het bijzonder zou nog even deze rijen geven
unieke ID's ook al semantisch de rij
dat we echt zorgen over of de kolommen die we echt zorg
over zijn de laatste twee van wat je zei, de cursus-ID
en de instructeur ID.
Dus laten we dit doen.
Ik zal deze rij net ID noemen, net als wij vroeger.
Maar deze ga ik om de koers ID bellen.
Deze ga ik noemen instructeur ID.
En ik ga opgeven dat alle
van hen zijn unsigned Want ik wil
naar mijn 4 maximaliseren miljard int bereik.
Geen van hen moet nul zijn.
Ik ga om aan te geven dat ID moet nog steeds primair.
En nogmaals, dit is gewoon een conventie,
veel kaders zelfs als je niet sorteren
van fundamenteel behoefte aan een unieke identificatie voor de rij,
Het blijkt dat het is handig voor de code, de SQL dat gaat
automatisch worden gegenereerd voor ons.
Dus ik laat dat als primair.
Maar nu, ik soort van hebben een ontwerp besluit,
Natuurlijk ID en instructeur ID.
Wat indexen eventueel moeten ze krijgen?
Als ik geen indexen zal vertrekken, wat is de implicatie?
Wat is een implicatie?
Prestaties als voorheen, toch?
Als er geen index, het beste wat je kunt doen is een soort
van [onverstaanbaar] door de hele ding op zoek naar nummers.
Dus dat voelt niet slim.
Moet het primaire?
Dus waarom niet?
Waarom niet de primaire?
[Onhoorbaar Opmerking]
Perfect. Dus we roll out [fonetisch] primair.
We kozen voor al dat.
Dus, moet het uniek?
[Onhoorbaar Opmerking]
Goed. Dus, als je aanneemt een instructeur per cursus,
helemaal prima.
En dat is zeker het voorkomende geval
maar we al afschrikken een misschien wel bekendste voorbeeld.
CS51 kreeg twee instructeurs dus we zijn aardig
van nu geschroefd in dat geval.
Als we dat toestaan ​​alleen een instructeur,
we eigenlijk konden doen een manier met de join tabel helemaal,
ga terug naar de eerdere aanpak
en de naam van de persoon die we niet misschien maar de instructeur ID.
Als je elke cursus weet als gewoon een instructeur kunt u zojuist
een kolom.
Maar de variabiliteit wat heeft ons in de problemen.
Oke.
Dus, moet het uniek?
Nee Volledige tekst niet voelen van toepassing.
Zoals we al eerder gezegd dat het
voor als substring matching voor beschrijvingen.
Dus wat over-index?
Nou, index is waarschijnlijk onze beste kandidaat
die MySQL optimaliseren vertelt voor onderzoeken op deze
of laat me werken, optimaliseren voor zoekopdrachten of joins
zoals we zullen zien in slechts een moment
zodat ze een weinig efficiënter
dan iets puur lineair.
Wil ik auto stappen op dit gebied?
Dus nee, want de ware bovenliggend element bestaat
in de tafel van de cursussen '.
Dat is waar het gaat plus te krijgen,
plus wanneer het eigenlijk geplaatst.
Hier, dit is allemaal handmatig invoegen
door ons vermoedelijk in code.
Dus laten we gewoon opgeven dat zowel natuurlijk ID
en instructeur ID hebben indexen.
Nu gaan we verder gaan en op te slaan.
En nu, om te laten zien u de correspondentie
tussen wat is een leuke GUI interface
en de command line interface.
Laat me ga je gang en doe de volgende op deze MySQL prompt.
Ik ga gebruik courses50 zeggen
dat is de willekeurige naam Ik gaf tot deze database.
En nu, ik weet niet eens herinneren wat we deden.
Dus laat me typt tonen tafels
en over het algemeen puntkomma zal je vriend hier
de query voltooien.
En daar is het.
Dus hier zijn de rijen of liever de tabellen die we hier hebben.
Nu, ik vergeet wat een cursus eruit ziet,
dus laat me niet te beschrijven cursussen en nu zie ik een soort van ASCII
of een versie van wat phpMyAdmin deed
en ik zie dat ID is een int.
Er is dat 10.
Wat betekent dat?
Dat betekent gewoon dat wanneer het verschijnt het gaat duren
maximaal 10 karakters op het terminalvenster.
Is het nullable?
Nee, dit is de primaire sleutel.
Kan het een standaard waarde hebben?
Nee, en dat is extra speciaal vlaggen zoals auto increment.
Dus laten we gewoon een paar van snelle inserties hier.
Ik ga om omhoog te gaan om - laten we maar zeggen.
Laten status wijzigt in een dia
waar ik een soort van pre-voorbereiding deze.
Dit is een samenvatting dan van alle drie van die tabellen.
Ik heb al gewoon handmatig getypt de eerste opdracht.
En hier, ik ging vooruit en Typ de anderen voor jou.
Dit is slechts het stilistische ding.
In het algemeen, veel mensen typen SQL-instructies in hoofdletters
en dan tabelnamen en veldnamen in kleine letters,
alleen al omdat het soort stands
wat is uw terminologie en wat is de database syntax.
Hier hebben we drie tafels, cursussen, docenten,
en cursussen instructeurs.
In de dia maakte ik van tevoren, Ik heb het ID-veld niet
maar dat is niet echt een slechte zaak.
We zouden net een derde kolom daar.
Had ik dat gedaan hier?
Dus nu laat me voorstellen dat we doen een heleboel toevoegingen.
Dus hier is een aantal gegevens, Ik zal vergroten
Dus ik ga voor te stellen dat in cursussen,
we alleen bezighouden met drie gangen.
En ik koos deze drie Want ze zijn vertegenwoordiger
van een aantal leuke - ze hebben een aantal leuke eigenschappen.
CS1, CS50, CS51, ze hebben toenemende IDs
maar wat ID is wat is totaal irrelevant.
Dat is gewoon de volgorde waarin ze werden automatisch ingevoegd bij me.
Hoe zit het met instructeurs?
Dus nu, want Henry Leitner leert zowel CS1 en CS51,
dit is een soort van een wenselijke gevolgen voor ons ontwerp.
En Jesse leert CS51 en Malan leert CS50.
Dus nu - of liever deze zijn gewoon van die mensen unieke ID's.
En cursussen en instructeurs, - Natuurlijk instructeurs, merken hier.
Natuurlijk ID1, die werd CS1 wordt onderwezen
door instructeur ID1 die Henry.
Natuurlijk ID2, die ik denken werd CS50 wordt onderwezen
door instructeur ID2, dat is Malan.
En dan tot slot, CS51, en merken we hebben twee rijen.
En nu is dit de reden waarom de join tafel is krachtig wordt onderwezen
door zowel Henry en Jesse.
Dus dit is allemaal prima en goed,
maar ik kan nauwelijks herinner me uit de top
van mijn hoofd wie wie is hier.
Hoe kun je gaan met dat in de code,
zonder harde code dingen?
Nou, dit is waar SQL zelf begint om onze vriend te worden.
En ik ga voor te stellen dat We kunnen de volgende typen.
Ik zal dit doen in werkelijke prompt.
Laat me gaan en Steek deze dingen.
Dus, in de tabel cursussen laten we doen precies wat we hadden een
daarnet.
Ik ga je gang en zeg, laten we voegen CS1 en CS50.
Laten we voegen een paar meer rijen tegelijk, CS51.
Nu, laat me gaan en op te slaan.
Oke, dus ik ben gewoon zo snel recreëren
als ik kan de relatie we zagen op het scherm.
En dus hier hebben we Leitner, hier hebben we Malan.
Laten we onszelf een andere rij, en Tov.
Nu wil ik deze op te slaan.
En ik ze doe bewust in dezelfde volgorde.
Nee, ik vergat te geven deze auto increment.
Laat mij dit snel op te lossen.
Ik zal dit vast te stellen in de online code.
Dat is mislukt als een terzijde.
Het feit dat ik niet kon Steek Leitner en Malan
en Tov mislukt, omdat ik niet geeft u een ID-nummer, ook al
het wordt verwacht een en ik vergat te autotoename controleren,
wat betekent dat ze allemaal Standaard krijgen nul.
Maar dat dan tegenspreekt die eigenschap die we hebben opgegeven.
De primaire sleutel werd geschonden dus het was zelfs niet laat mij het doen.
Dus laat me dit op te lossen.
Nu wil ik terug te gaan naar de Tabblad Invoegen hier en geef
dat ik wil Leitner, Malan en, nog een rij, Tov.
En nu tot slot, de enige een dat is een beetje moeilijk
om te onthouden is natuurlijk instructeur.
Laten we nu voegen dat Natuurlijk ID1 is instructeur ID1
dus dat is CS1 en Henry.
Natuurlijk ID2 is instructeur ID2 die CS50 en Malan.
En dan de laatste die we hebben zorgen te maken over is natuurlijk ID3
die CS51, onderwezen
per cursus instructeur 1, dat Henry.
En drie als ook geleerd met 3, die Tov.
Dus hopelijk nu we hebben deze herschapen -
verdomme, ik deed hetzelfde.
Cursus instructeur moet autotoename.
Oke.
Ik zal dit sneller deze keer doen, Natuurlijk 1, cursus 1, 2, 2.
En nu tot slot, doen we CS51 welke cursus ID3 en Henry heeft.
En natuurlijk ID3 en Jesse.
Dat ziet er goed uit.
OK. Dus nu, laten we terug gaan naar de terminal venster.
Dus als ik beschrijf cursussen zullen we dit zien.
Als ik wil cursussen die ik kan zien nu doen selecteer ster van cursussen,
puntkomma, en nu zien we die waarden.
En nu, wat anders wil ik doen?
Selecteer ster van instructeurs, dat is zoals ik had verwacht,
en selecteer ster van cursussen - Natuurlijk underscore instructeur.
Dus hoe kan ik nu meedoen deze tabellen?
Dus de schoonheid van het hebben gekozen ID waarden op deze wijze
dat als je erover nadenkt nemen van de cursus tafel
en de instructeur tafel en vervolgens invoegen
tussen deze twee in geesten de cursus instructeur
tabel kun je soort van lijn up van al deze ID kolommen
zodat u ze kunt samenvoegen tot een enorme kolom die alles heeft
van de informatie we de zorg over.
De SQL-syntaxis voor deze niet noodzakelijkerwijs duidelijk,
maar laten we eens kijken of we het kunnen doen.
Dus selecteer ster van cursussen,
en er een paar weg als we dit kunnen doen.
Ik ga druk op Enter gewoon om soort van formaat dingen mooi,
maar die pijl is slechts een symptoom van de client tool,
het heeft niets te maken met SQL zelf.
Dus selecteer ster van cursussen.
Ik ga nu lid de tafel cursussen
op de cursus instructeur tafel.
Hoe? Op het veld genaamd courses.id gelijk natuurlijk
onderstrepen instructeur dot wat is de naam
van het overeenkomende veld hier dat ik wil een paar.
Het is geen ID.
Het is - wat, sorry?
>> Cursus ID.
OK, laat me uitzoomen.
Maar ik wil nemen nog een stap verder.
Ik heb dit nu gedaan tafel en deze.
Nu wil ik trek deze kerel in ook.
Dus, laat me verder lid worden van deze hele zaak
op de instructeur tabel op wat?
Cursus underscore instructor.instructor id
gelijk instructors.id.
Dus we konden hebben geschreven deze query op een aantal manieren.
De volgorde waarin ik dit deed is niet zo belangrijk.
Ik deed het gewoon een soort van in mijn hoofd van links naar rechts.
We konden dit gedaan hebben in de verschillende manieren
maar als ik nu de puntkomma en druk op Enter,
merkt dat ik terug een nieuwe tijdelijke tabel, een resultaat geven
dus in de database spreken te spreken.
En wat heb ik in dit ding?
Ik heb op ID, een naam, een ander ID, welke soort is verwarrend
voor mij op het moment, een cursus-ID,
een instructeur ID, ID, en de naam.
Dus op het eind van de dag hebben we nu de juiste gegevens.
Ik kan zien dat CS1 wordt onderwezen by Leitner, wordt CS51 onderwezen
by Leitner en Tov, en CS50 wordt gegeven door Malan.
Maar ik ben een beetje nerveus over deze dubbelzinnigheid die ik heb gemaakt.
Wat is de dubbelzinnigheid Ik zinspelend op?
Yeah?
[Onhoorbaar Opmerking]
Er zijn drie ID kolommen.
Dus we kunnen eigenlijk dit oplossen en gaan we eigenlijk aan de hand
uit te stellen om ons raamwerk uiteindelijk om ons te helpen met dit,
maar het blijkt dat er een trefwoord in SQL genaamd S,
waar u een kunt opgeven alias, een nieuwe naam voor een veld
zodat we dit kunnen vermijden dubbelzinnigheid helemaal.
Maar realiseerde zich dat als we niet adres of andere manier als met
dat zoekwoord of een kader,
er is mogelijk deze dubbelzinnigheid als u probeert
om naar de ID-veld want er zijn duidelijk degenen
met dubbele namen daar.
Dus dit is een join en ik denk in het oog van je geest de beste manier
om echt goed over nadenkt is de twee tabellen nemen,
lijn ze op in de manier die u wilt.
Dit is een zogenaamd inner join in de zin
dat we het combineren de tafels hier.
Er zijn andere vormen van joins die we tegenkomen
na verloop van tijd als outer joins,
maar Grotendeels is waarschijnlijk de meest voorkomende
voor het reconstrueren van gegevens.
Wat we nu hebben gedaan is algemeen wat heet
normaliseren van uw gegevens, zodat er is geen overlapping overal
in de tabellen.
En door duplicatie, zou ik die eerste benadering hebben betekend.
Als we Leitner had vermeld en Tov op meerdere plaatsen
in uw database, dat is niet over het algemeen de beste beslissing
vooral als hun naam macht veranderen overwerk of in het geval
van het huwelijk, meisjesnaam macht zelf veranderen wil je gewoon een
canonieke plek voor een aantal waardegegevens als een naam.
Oke.
Dus om samen te vatten, hebben we een enkele design beslissingen te maken
en de belangrijkste waarschijnlijk gereduceerd tot enkele
van deze keuzes van indexen.
Maar wil ik erop wijzen een ander ding ook.
Als ik terug naar phpMyAdmin,
een functie die u misschien niet hebben voordat wordt aangetroffen
de volgende.
Als ik naar cursus instructeur, Ik al heb aangeven dat sommige
van deze dingen hebben indexen.
Maar laat me gaan naar de structuur tabblad natuurlijk instructeur.
Laat ik nu klik op Indexes en let op de volgende.
Ik heb hier aangegeven dat er is een primaire sleutel
in de kolom genoemd ID.
Dit is een gecompliceerd manier van specificeren kardinaliteit
enzovoort als een verwijzing naar de grootte van het veld in bytes.
Maar nu heb ik een ander heb ook veld, cursus-ID, die -
Natuurlijk ID die wordt gedaan vooraf en unieke, op OK.
Ik deed dit een in vooruit voor ons.
Dus, waarom is dit - laat me vallen Dit omwille van discussie.
Oh, weet je wat ik deed?
OK. Dus, eerder een van de gevaren van het gebruik van een GUI tool
als dit, toen we het creëren van deze join tabel,
de cursus instructeur tafel, herinneren dat ik heb opgegeven
dat wil ik een index op dit gebied
en een index op deze andere veld.
Het neveneffect van het controleren van deze beide dozen
op hetzelfde scherm is dat phpMyAdmin afgeleid dat,
dat wil ik niet twee aparte indexen,
dat ik wil een join index die algemeen alleen nuttig
of het meest nuttig wanneer je zoeken op niet een veld
maar beide van deze gebieden.
En dat is waarom we hadden ze daar conjoin
dus ik liet het vallen want dat was niet wat ik bedoelde.
Integendeel, ik ga om dit hier opnieuw.
Ik ga naar de cursus ID
en onder meer ik ben gewoon gaan zeggen toe te voegen index.
En ik ga ten onder gaan instructeur ID en zeggen toe te voegen index.
En nu, als we hier, merken we hebben drie indexen,
een primaire en als ik bestemd voor elke
van die buitenlandse sleutels.
En ik noem het buitenland omdat Natuurlijk ID in deze tabel kaarten
naar welk veld, alleen maar om te duidelijk, in een andere tabel.
De primaire sleutel genaamd ID, in de tabel genoemd cursussen,
en dezelfde deal voor de ander.
Maar nu, is een interessante truc en echt techniek.
Ik ging gewoon verder en laat me dat doet een beetje langzamer.
In hetzelfde scherm, bericht het zegt Relatie overzicht hier.
Ik deze klik en nu merk ik krijgen om een ​​paar beperkingen doen.
Dus, een van de positieve kanten ook
van niet alleen met behulp van conceptueel buitenlandse sleutels en andere tafels
alsof we gewoon op is dat door het definiëren van een index
op hen kunt u de databank helpt u nog meer
zorgen voor de integriteit van dat veld.
In het bijzonder, kan ik nu opgeven via deze daling
bepaald dat de cursus-ID-veld
in deze tabel eigenlijk kaarten op te courses.id.
Evenzo, instructeur underscore ID toegewezen aan instructors.id.
Nu, waarom is dit nuttig?
Nou, let op, aan de rechterkant kant wat nu verschijnt.
Ik kan nu leren de database als Henry
bijvoorbeeld ooit met pensioen en zijn rij verdwijnt
van de tafel van de instructeur helemaal zo het gebruik te
verwijderd, kan ik via deze trapsgewijze aanpak te garanderen
dat eventuele cursussen leert hij zijn niet meer met hem verbonden.
Ik kan de database leren om de rijen te verwijderen
in deze zogenaamde join table automatisch als Henry of indien een
van zijn cursussen verdwijnt.
Nu, waarom is dit interessant?
Yeah?
[Onhoorbaar Opmerking]
Je hoeft alleen maar een keer te doen en langere termijn, toch?
Het is heel makkelijk als een soort van mensen komen en gaan, cursussen komen
en gaan, de database kan just get bezaaid met cursussen
en met de faculteit die niet zijn langer relevant zijn voor de dataset.
En uw gegevens begint te krijgen erg rommelig en vies en muf,
en dus hier kunnen we sorteren
van een aantal van af te dwingen deze beperkingen.
Yeah?
[Onhoorbaar Opmerking]
Het kent door middel van deze.
Dit is het scherm waar we zijn het opgeven van een koppeling
tussen foreign key en primaire sleutel.
Dus al de naamgeving conventies Ik zinspeelde
eerder zijn slechts conventies.
Er is geen inherente betekenis.
Dit is het scherm dat is alleen nuttig
nadat u opgegeven indexen op elk van deze gebieden als wij deden.
En voor deze dropdown hebben we een paar dingen bijvoorbeeld
Als een cursus wordt verwijderd kunt u eigenlijk voorkomen dat de schrapping
gebeurt als er is een rij in deze tabel
door gewoon te zeggen, beperken.
Met andere woorden Henry kan niet met pensioen
totdat we hem los te koppelen van CS51 en CS1.
Dus dat is een goede zaak.
Maar het zou kunnen leiden tot fouten in je code
als je niet verwachten dat, of we kunnen een cascade hebben,
een cascade vergelijkbaar zijn cascading style sheets
en de trapsgewijze waterval betekent dat als een -
Als Henry met pensioen zo - door zich verwijderd
zo zal zijn rij hier krijgen geschrapt.
Geen actie betekent niets of null is een soort van handig als je soort
van wil wat historisch record van Henry te hebben geleerd CS51,
maar je wil gewoon dat veld null zijn, zodat de rijen er
maar het is niet langer met hem verbonden.
Dus deze zijn zeer krachtig technieken die u kunt
en dienen te gebruiken wel eens in het belang van met name
van het opslaan van je uit jezelf.
Dus laat me maken melding van een paar laatste details hier,
ingrediënten waarmee dat nuttig kan zijn
als we plannen voor database-ontwerp.
Je hebt ook de keuze over de database-engine
die u gebruikt in uw code.
Als u bekend bent van CS161 je misschien -
of zelfs 61, zou u over het algemeen bekend te zijn met bestandssystemen.
En er zijn dingen zoals, NTFS en HFS +
en X2FS4 [fonetisch] en 3 enzovoort.
Er zijn verschillende manieren van het opslaan van gegevens op het bureau.
Evenzo zijn er verschillende manieren gegevensopslag
in een database standaard althans in het apparaat
met de nieuwste versie van MySQL.
We gebruiken de database-engine genaamd, NoDB,
die ondersteunt een paar leuke features.
Maar een andere voorkomende is ook riep MyISAM en nog een andere
die kunnen worden gebruikt is Memory, wat betekent dat niet alles te stoppen
op schijf, gewoon blijven dingen in het geheugen.
Voor het grootste deel je waarschijnlijk zal niet fout gaan net beginnen
met NoDB, maar voor alle projecten die de neiging hebben om hoge tarieven te betrekken
invoerrichting bijvoorbeeld als een hoop van snelle logging,
honderden dingen per seconde of duizenden dingen.
Anytime u een veel dingen gaande
de in de database dan is deze soorten
van lager niveau beslissingen beginnen om mee te doen.
De volledige tekst functie voor Zo werkt alleen in MyISAM
zodat een implicatie.
Maar u kunt deze herinneren, laten we tenminste motiveren waarom we de zorg
over NoDB in het bijzonder.
Een race conditions algemeen verwijst naar wat?
Oke, dit is een toespeling op een voorbeeld wat
van zou u hebben gehoord de afgelopen jaren al 161 of 50
waar u een kamergenoot, jullie beiden echt graag melk,
een van jullie thuis komt eerst opent de koelkast is er geen melk,
sluit de koelkast lopen over straten om CVS en krijgen
in de rij om wat melk te kopen.
Ondertussen, je kamergenoot komt hier terug.
Ze houdt ook van melk.
Open de koelkast en realiseert geen melk.
Hier dan gaat ze naar de slaan, misschien de andere CVS.
Fast forward een paar minuten later kom je terug en nu beide
van jullie hebben melk gekocht.
Een van hen gaat nu te verwennen omdat je niet
zoals melk die veel en Dit is een probleem, toch?
Omdat jullie beiden geïnspecteerd de toestand van een aantal variabele
en maakte een besluit op basis ertegen hoewel de toestand
van die variabele in wezen in het proces veranderd,
al zij het langzaam over de tijd die het kost
naar en van CVS te krijgen.
Dus wat is een soort van domme echte wereld oplossing voor dat probleem?
Een briefje, toch?
Het is er de laatste keer.
Laat altijd een noot of hangslot het ding letterlijk.
En ik zeg hangslot, omdat als je te nemen of namen CS161,
vergrendeling is een fundamenteel idee in dat soort wereld.
Dus race conditions kunnen ontstaan Ook in de database wereld
en je zou misschien herinnert uit CS50 financieren als je nam 50,
deze code dat we eigenlijk gaf jullie in de specificatie
op het moment, zodat uw operatie wordt zo genoemd atoom.
Als je wilde, in dit geval is, koopt een deel van de voorraad
en dat bestand heeft sommige bepaald symbool.
We vertelden u code gebruiken zoals Dit omdat via deze
op dubbele sleutel-update syntax, gebouwd
in MySQL u effectief bent doen hetzij in insert
of update uitvoeren na het doen van een select om te zien
als een aandeel is er al in.
Met andere woorden, de analoge in de wereld van het kopen van een aandeel
van melk en de koelkast zou kunnen zijn, ten eerste,
voor het kopen van een aandeel van Google je zou willen selecteren
uit de database alle aandelen van Google dat David bezit
om te zien of hij eigenaar is nul of meer.
Zodra u zien of hij bezit nul of meer je hebt
om vervolgens het volgende doen.
Of je moet een insert doen
als hij bezit nul omdat er is geen rij voor David nog,
of je moet een update doen indien ten minste in theorie je wilt
met een rij per gebruiker.
Het probleem is het selecteren dat aantal aandelen
en dan bijwerken of invoegen kan worden onderbroken
door iemand anders op een andere computer terminal proberen om te kopen
of verkopen van enkele van Davids aandelen van de voorraden of
voor goede doeleinden of soort van kwaadaardige doeleinden.
Het is alsof je naar de winkel als je kamergenoot terug krijgt
en controleert de staat van de variabele.
Dus dit syntaxis op het moment dat was een soort van geschikte
voor CS50 vermijdt dat probleem helemaal.
En het gewoon doet dat allemaal magie van de vergrendeling voor u,
maar nu met dit soort van projecten voor deze cursus
die waarschijnlijk betrekken complexere datasets
kun je niet bereiken altijd aan deze werkwijze.
Alles gebeurt in een keer of helemaal
zonder onderbreking zo elegant.
En zo MySQL, een andere database-engine,
ondersteuning dingen genoemd sloten,
waarbij je slot kan zeggen tabel zodat slechts een traktatie
en over het algemeen slechts een gebruiker kan Raak het in elk punt in de tijd
lezen of schrijven en dan kun je deze openen.
Dit is een voorbeeld ve van MySQL's eigen referenties,
waar als je als een bank account die u probeert
om geld af te trekken van en geld voeg vervolgens aan.
Je zou willen zorg ervoor dat beide
van die dingen gebeuren samen
zodat er geen wiskundige fouten
en niemand verliezen geld, een of andere manier.
Het probleem met sloten maar in een database
dat betekent meestal de hele tabel is vergrendeld,
wat betekent dat als je honderd mensen proberen
om zaken te doen met uw bank online op hetzelfde bedrag
van de tijd slechts een van ze kunnen gaan op een moment.
Dat is dom, vooral op servers tegenwoordig
dat acht gangen, 16 hebben Natuurlijk, hebben een enorme hoeveelheid
van het geheugen, is er geen reden om alle series
van uw transacties als die klanten zijn alleen maar
te communiceren met hun eigen rijen.
Dus NoDB kunt u doen dingen intelligenter
en dit zal in het algemeen de aanpak die je neemt in de code,
als je iets gebruiken riep de transactie.
En je dit doet in het algemeen in PHP-code,
Ruby code, Python, wat dan ook.
Maar de SQL-code die uiteindelijk gebruikt is dit,
typisch.
Start transactie dan je specificeren twee of meer query's
dat u wilt voeren helemaal
zonder onderbreking of helemaal niet.
Er kan zelfs sommigen selecteren verklaringen in
of sommige verwijderingen of updates.
Maar het leuke is dat de databank zal slim genoeg zijn
om ervoor te zorgen dat het zal alleen sluit de rijen ze eigenlijk
betrokken bij deze updates of selecteren of verwijdert.
Dus als je echt duizenden rijen en je kunt slechts aanraakt met drie
daarvan, alleen dat deelverzameling van de tabel wordt vergrendeld
waardoor deze andere 99 klanten kunnen hun rijen te raken
zonder te worden in series en vertraagd door jou.
Ondertussen, dit is de mooiste aspect aan transacties.
Ze zijn transacties in een voelen als 161 op een bestandssysteem,
ze zijn transactionele
wat betekent dat je kan rollen ze terug, kunt u deze ongedaan maken.
Dit is als het commando of controleren F van databases.
Als u een deel ontdekken een weg door alle
van uw gegevens verschillende operatie, schieten, gaat er iets mis.
Je letterlijk uitvoeren van een verschillende SQL-query roll back
en al deze trend - allemaal van de verklaringen u geëxecuteerd
na het zeggen van start transactie verdwijnen
alsof ze nooit gebeurd,
die een verbazingwekkend krachtig ding.
En dit zijn de soorten dingen zeker in 50 we sort
van onder het tapijt vegen en je gewoon een soort van aannemen
dat komt alles goed.
Maar als je eenmaal begint denken over echte projecten
en echte gebruikers en integriteit van de database,
Dit zijn de soorten van ontwerpbeslissingen
die zullen belangrijk.