>> Okej.
Så, utan vidare, SQL, Structured Query Language.
Så använde du förmodligen detta på stone i CS50, kanske i CS165,
kanske i din egen personliga projekt.
Och vad betyder SQL låter dig göra, i en SQL Server mer allmänt?
Yeah?
[Ohörbart Anmärkning]
OK, det var mycket säkrade sätt att säga det.
Ja. Så det tillåter dig att lagra data
och ännu viktigare tillåter dig att söka efter data.
Och detta är ett steg framåt
från att använda något enklare som en CSV, höger.
Comma Separated Variabler.
Liknande värden.
På samma sätt kan du spara informationen en rad
i en textfil.
Men vad är nackdelen med en CSV-fil för att lagra data,
även om du effektivt få rader och kolumner från den?
Yeah.
>> Du behöver inte "har samma organisation
effektivitet [ohörbart].
>> Du har inte samma organisation effektivitet.
Vad menar du?
>> Tja, som [ohörbart] har som primär [ohörbart].
>> OK. Yeah.
>> Det är en relationsdatabas du kan ha flera databaser
kopplade till varandra i mycket speciella sätt.
>> OK. Bra.
>> Det är [ohörbart] att ställa in en CSV.
>> Och låt mig tweak lite terminologi.
Så flera tabeller i en databas, säker,
och som går utöver vad du kan göra med bara en CSV.
Men egentligen begränsningen med CSV Jag skulle vilja hävda är
att ineffektiviteten i det hela.
Det är väldigt lätt att layout.
Men om du vill göra en fråga, vad är det gångtid
varje urvalsfråga på en CSV-fil?
Jag menar det är stora gamla [ohörbart], rätt, för i värsta fall,
steg de längst ner.
Även om du hade sorterat hela CSV-fil, om du inte vet
som förskott, ja, du fortfarande kommer att ha
att söka det hela.
Så, bland de saker Vi kommer att få
från användning av ett faktiskt databas med ett språk
som SQL är att vi kan fråga det och vi kan i förväg
databasdesigners precisera stöd fält
som sannolikt skulle ha frågor om så att människor
på MySQL eller Microsoft eller Oracle,
den som har gjort databasen du använder kan göra allt
av det hårda arbetet med räkna ut, OK,
gett en miljon av dessa IDS.
Hur kan vi layout - dem i minnet?
Något slags träd strukturera kanske,
så att när du gör faktiskt köra Select,
det är något som är logaritmisk eller logaritmisk
av logaritmisk i tid snarare än att faktiskt decentralisera
till något linjärt.
Så vi fick en hel del resultat på det sättet.
Och vi kan också lagra mycket mer uppgifter lättare "orsaka SQL
Server är normalt lagras i RAM, även om delar
om det skulle kunna lagras på disken och du vet förmodligen vid det här laget
att RAM är i allmänhet snabbare än diskar
så det är en bra sak.
Och vi kan också hantera samtidighet mycket bättre.
Om du har tagit 165 eller 161, du vet att om två personer försöker
att göra samma sak samtidigt på ett system,
dåliga saker kan generellt hända.
Så bland de andra funktioner som vi kan få om vi utformar våra bord
på rätt sätt är bättre stöd och trygghet
när det gäller att samtidighet.
Så, två personer i två delar
av världen med hjälp av samma hemsida, om de båda försöker
att köpa något på samma tid, är det för att inte gå
att gå in samtidigt.
På något sätt skulle de serialiseras av någon annan än vår egen -
någon annan än oss själva.
Databasen kommer göra det för oss.
Så när det är enklaste form,
SQL låter oss fråga en relationsdatabas.
En relationsdatabas är en som har en
eller flera tabeller i det typiskt.
Och om detta är ett lite främmande,
du kan egentligen bara tänka av detta som Excel eller siffror
eller Google kalkylark.
Det har bara rader och kolumner och typiskt upp på varje
av dessa rader har ett namn för det.
Så detta kan vara ID- kolumnen, namnet kolumnen
adresskolumnen och så vidare.
Och då kan du ha flera sådana tabeller om du vill
att börja lägga ut olika typer av data.
Men du kanske minns åtminstone från CS50 som vi försökt
för att ge dig en GUI-baserad verktyget [ohörbart]
för att hantera databasen.
Det kallades phpMyAdmin.
Så det är bara en slump att det var skrivet i PHP, egentligen,
men det var bara en webbaserad främre ände till en databas.
Och via de olika flikarna och länkar, kan du börja
att konfigurera en databas för dig själv.
Men ett bra verktyg för att börja få lite mer bekväm
med är också den kommandoraden klient.
Så, om du använder CS50 Appliance eller egentligen använder någon makro PC
som har en kommandorad MySQL klient, kan du också göra det slags
av gamla skolan, som den här.
Inom parentes MySQL-projektet, åtminstone öppen källkod version
av det som nu kallas MariaDB för olika anledningar som du kan läsa
upp på Wikipedia, men det är samma programvara,
det är samma syntax och så vidare,
ungefär samma kodbas.
Och så när jag är på detta frågar jag nu kan interagera
med min databas mycket mer manuellt.
Så typexempel, Låt mig gå vidare
och bara öppna upp ett terminalfönster.
Jag råkade använda CS50 Appliance men du kan göra detta
på de flesta alla system i som du fick rätt
programvara installerad.
Och jag ska göra MySQL-u för användarnamn John Harvard
på detta särskilda system,-p ett lösenord som jag ska skriva
i lite mer säkert genom att trycka Enter.
Nu är jag ombedd.
Jag kommer att skriva crimson i CS50 Appliance
och nu ser jag i huvudsak att samma skärm.
Men det finns kommandon nu att vi kan börja skriva
som visar databaser, och det kommer att visa mig alla
av de databaser som jag har redan skapats i systemet,
ungefär samma lista du skulle se i phpMyAdmin.
Det finns ett par andra som informations schema och tester,
som om du peta runt CS50 Appliance, gömmer vi några
av dessa lägre nivå tabeller
men de har varit där hela tiden.
MySQL har faktiskt låg nivå egenskaper som användarnamn
och lösenord för databasen sig själv, inte för din ansökan
att du kan vara körs på toppen av det.
Så i förväg, i dag, jag skapade ett par databaser,
en av vilka kallas courses50.
Oddsen är några av er har använt CS50 naturligtvis shopping verktyg,
vilket är ett stort gränssnitt för registratorn s kurskatalog.
Och detta är faktiskt en trevlig dataset för att tala om "orsak,
en, vi är typ av alla uppenbarligen bekant med kurser
och instruktörer och möte platser och alla slags
av vanliga saker av universitetet,
men det har också fått lite intressanta möjligheter
för design.
Så vi tänkte att vi skulle använda föreställningen om en kurskatalog
och en shoppingverktyg som exempel hela dag för att sortera
av rama del av designen beslut som vi måste göra.
Så låt oss börja där.
Antag att jag verkligen ville att representera den super enklaste
naturligtvis handla verktyg.
Och det enklaste världen Jag kan föreställa sig och man är
där det finns kurser och det finns lärare.
Och låt oss anta att skull diskussionen
att varje kurs har minst ett namn.
Så låt oss börja skissera detta.
Jag kommer att använda phpMyAdmin precis som en bekvämlighet,
så att vi inte behöver skriva ut alla frågor manuellt.
Men här är jag i mitt courses50 databas.
Om obekant med detta, kommer det vara väldigt lätt när du dyker
in på ditt eget projekt Om du vill använda den.
Jag kommer att skapa en tabell som kallas Banor
och jag kan bara tänka av ett fält
för nu, namnet på en kurs.
Jag kommer att gå vidare och säga ge mig en kolumn.
Nu, när du minns att du får ett gränssnitt som är lite
så här.
Och den andra uppåt uppriktigt av phpMyAdmin är att den sort som
av självinstruerande och att via menyerna, kan du sortera
för se vad din möjliga designbeslut är.
Så jag ska ge varje kurs ett namn.
Det är namnet på denna kolumn.
Och vad sägs om dess datatyp?
De flesta av er bör känna till stone några av dessa datatyper
från tidigare erfarenheter.
Vad är lämpligt för kursnamn?
Sharon?
>> Varchar.
>> OK, varchar som är variabel Char.
Och vad betyder det betyda mer tekniskt?
[Ohörbart Anmärkning]
OK. Så det är en sträng.
Och det var aspekten för det innebär vad?
Variabel. Men vad innebär det?
Yeah?
[Ohörbart Anmärkning]
Exakt. Så det är en variabel antal tecken
i strängen upp till viss maximum.
Så här är vår första konstruktion beslut.
Vi måste faktiskt bestämma hur många byte maximalt
att tilldela varje sådan sträng.
Generellt sett, du vill slags inte göra det för litet,
inte göra det för stort 'Orsaka uppenbar
Om för liten du är bara kommer att börja trunke uppgifter
och du kommer att förlora information.
Och om det är för stor, du är bara slags berättar databasen
att räkna med och att optimera för mer information
än det kan faktiskt någonsin får.
Så vad är en rimlig känsla numret för namnet på en kurs?
60? OK, så 60.
Det verkar ganska rimligt
så länge är det inte finns någon undantag från denna.
Det finns egentligen ingen hård, snabb regel.
För att vara ärlig, för historiska skäl mycket
människor kommer att välja 255 "Anledning till år som var sorterar
för standard maximal hjälp av 8 bytes - 8 bitar som din disk.
Jag skulle mer [ohörbart] kan använda befogenheter 2
men det är typ av irrelevant.
Så vi kan gå med 60.
Det verkar rimligt så länge
som vi så småningom inte ångra det "Orsaka det är en övre gräns.
Antag nu att det motsatta beslut hade gjorts,
inte variabla tecken men bara det förkolnade området.
Så till skillnad från C och C + +, röding innebär inte en röding
och databaser som innebär i allmänhet ett fast antal
tecken i en sträng.
Vad skulle vara upp och / eller Nackdelen med mitt val 60
för en röding fält, istället för Varchar?
Detta är precis den första typen av beslut du måste göra
vid inspektion [fonetisk] ut av projekt med din partner.
Ja, Sharon igen.
[Ohörbart Anmärkning]
Bra. Så om namnet är färre
än 60 då du slösar bort vad det delta är
mellan 60 och verkliga längden.
Så det känns bara slöseri, fler bytes än du behöver.
Men varför finns den?
Visst finns det viss uppåt.
Yeah?
[Ohörbart Anmärkning]
Visst. Så ibland kanske vet det fasta numret
tecken som 10 siffror efter ett telefonnummer till exempel.
Men vem bryr sig, liksom varför inte bara säga 11 i alla fall
eller varför inte säga 60 ändå med varchar?
Vilken fördel får vi genom att veta och utforma
för ett fast antal tecken?
[Ohörbart Anmärkning]
Du är på rätt spår.
Så det är optimering, men det är verkligen av - ja?
[Ohörbart Anmärkning]
OK. Bra. Låt oss fokusera på den sista delen.
Så indexering.
Så det visar sig om du vet på förhand att alla
av dina fält går att vara 60 tecken,
du kan verkligen tänka på detta kolumn i Excel-databasen
ha mycket rak, vänsterjusterade
och höger motiverade kanter
eftersom varje kolumn är 60 tecken bred.
Det innebär att denna strängen är 60 tecken bort
från denna sträng, 60 tecken borta från detta
och här och här.
Så precis som tillbaka när du lärt C, hade du random access
i en värld av matriser, Samma idé här.
Om din kolumn representeras med hjälp av tecken endast fasta längd,
du kan effektivt index slumpmässigt till 60 eller 120 eller 180
och du kan få på sig strängar mycket snabbare.
Sen om istället, hade din spalt en rak vänsterkant så att säga
men en mycket robust rätt kanten på kolonnen
eftersom du kanske har 10 tecken,
15 tecken, 5 tecken.
Så även detta är en avvägning.
Och ibland bara genom försök och misstag
och experiment kan du räkna
reda på vad som egentligen rätt samtalet är men det är dessa typer
av frågor som ska gå
genom dina sinnen och / eller tabeller när det gäller tid
att designa din databas.
Så, inte nödvändigtvis rätt svara på men du bör
åtminstone har en del mening eller två i åtanke
att säkerhetskopiera allt beslut du fattar.
Okej.
Så låt oss hålla rullning i anvisningarna här
som är phpMyAdmin UI.
Så, standardvärde för ett namn, ska jag ange
att det bör vara ha ett standardvärde på noll?
Vad tycker du?
Kan en kurs har ett noll namn?
Bara känns konstigt, eller hur?
Jag kan inte komma på något namngivna kurser vid Harvard.
Och kanske finns det några dunkla hörn fall
när en kurs ges ett antal
och professorn har inte valt ett namn för det, men -
Jag menar, för fan med det,
som låt oss inte ens bry stödja det.
Jag skulle säga i intresse av en fin ren databas,
Låt oss ange att du inte kan har ett standardvärde på null.
Alternativt skulle vi kunna göra något som untitled kurs
vilket inte är till skillnad från med Mac OS och Windows gör
när du skapar en mapp exempelvis
men det som gör lite vettigare
så att människan ser något.
Vi pratar om en backend-databas förmodligen
för kurskatalog.
Så jag vet inte riktigt ens gillar tanken på att ge den
i namnlösa Bannamn
eftersom det inte är riktigt kommer att hjälpa någon.
Så låt oss lämna detta som ingen, vilket innebär att när du sätter
in i denna databas, måste du att ge varje kurs ett namn
vilket känns lite renare för mig.
Okej.
Så bläddra vidare, sortering.
Detta har bara att göra med teckenuppsättningar och whatnot
Om du någonsin sett omnämnanden av svenska
i phpMyAdmin som är "Leda folket
som skrev phpMyAdmin var svenska.
Är det PHP eller är det MySQL?
En av de två, jag glömde märkligt.
Men det är av historiska skäl
men du kan uttrycka varje tecken på engelska
att du kunde med svenska så det är till stor del en icke-fråga.
Den CS50 Appliance är dock används - konfigurerad för att använda UTF-8,
så att i allmänhet bör inte dyka upp för dig.
Egenskaper.
Så ingen av dessa är verkligen relevant här.
Jag ser Binary, osignerad, Osignerad zerofill,
och om uppdatering aktuell tidsstämpel.
Detta fält gäller endast för vissa numeriskt fält
eller vissa tidsfält.
Så vi ska hoppa över som helt och hållet.
Null. Kan detta fält vara null?
Så nej. Vi har redan den sortens samtal.
Så vill vi inte ett standardvärde.
Vi vill inte att det ska vara noll.
Hur är index?
Det finns fyra val här.
Vad betyder det om vi anger
att denna rad kommer att vara en primärnyckel?
Tänker tillbaka till CS50 eller CS165 om du har tagit det.
[Ohörbart Anmärkning]
Exakt. Så en primärnyckel per definition är det fält
som unikt identifierar varje rad i denna tabell.
Och du kan lita på den för att göra som unik identifiering.
Så, vad betyder det då att bara vara unik?
Tja, typ av dessa två har sorterings
i enlighet med konsekvenser under huven.
Men generellt är primärnyckel slags avtal du gör
med databasen sak.
När jag gör frågor letar efter en kurs,
Jag kommer att använda detta område.
Och vi ska återkomma till varför vi kan ha två
sådana val här, primära eller unika.
Unik bara säga, detta fält kommer att vara unik
men jag är inte riktigt göra något slags muntlig förpliktelse här
att använda detta fält att göra mina sökningar
av skäl som vi kommer se på bara ett ögonblick.
Om vi ​​anger istället index, vad betyder det att ange
att ett fält har ett index på det?
Yeah?
[Ohörbart Anmärkning]
Exakt. Det har varit optimerad för frågan.
Så du - databasserver, Oracle, MySQL, vad som helst,
kommer i allmänhet att arbeta sin magi bakom kulisserna när du klickar
det alternativet och klicka sedan på Spara och den kommer att bygga
upp typiskt en trädstruktur, B-träd om du har sett
eller hört utanför vilket är en mycket kort ser träd
som ger dig mycket trevligt logaritmiska egenskaper
när du söker på datan.
Om du inte anger ett index på ett fält, vad som händer
vara den rinnande tiden för att söka
för en godtycklig [Fonetisk] kursnamn?
Vad är det?
[Ohörbart Anmärkning]
Åh, [ohörbart], linjärt, eller hur?
Om det finns några optimeringar ges till databasen
och du har inte tänkt databasen vilken typ
av uppgifter som väntar.
Det bästa du kan göra är att kontrollera allt när du är ute
för ett visst värde, i synnerhet om det kunde
i själva verket vara dubbletter.
Fulltext under tiden, vi ska våg våra händer för nu.
Men i allmänhet är detta ett typ av index som gör att du
optimera för sökord söker på ett fält.
Så detta kan vara en bra kandidat
för som en kursbeskrivning där du kan ha ett par
av punkterna och du kanske vill göra delsträngsmatchningar.
Fulltext kommer generellt låta du gör det ganska effektivt.
AI, är detta en hemsk sorts förklaring men om vi sväva
över det du ser Auto Increment.
Ej tillämplig både här men automatisk ökning är användbart
för som en int s område eftersom databasen kommer att ta hand
av förfarandet enligt plus plusing det varje gång du gör en insats.
Så att även om två personer bokstavligen på Skicka
på samma gång och försök för att skapa en rad på något sätt
i databasen, en av dem kommer att få nummer I,
den andra kommer att få numret jag plus 1.
Du behöver inte oroa dig
cirka två nummer som delas identiskt om du var
att göra det själv i koden.
Okej.
Så jag ungefär som när Vi har fått ett namn för att vara.
Så låt oss klicka på Spara.
Är detta en bra design för en databastabell?
Och som en sidoreplik om rostiga på SQL eller du sorterar
på bara alltid vända en blind öga på vad som pågick,
Jag kunde ha skrivit just det -
dessa tre linjer vid det svartvit prompt
på kommandoraden klient eller jag kunde ha gjort
att i koden programmässigt.
Så alla phpMyAdmin gör för mig, är bara rädda mig ansträngningen
av att komma ihåg ibland syntax och skriva ut för
som tråkiga kommandon.
Okej.
Så det känns inte som att det bästa design, en fält tabell ett.
Nu kunde vi ha saker som professorer
och platser och beskrivningar.
Men även då, endast med hjälp av namn
att identifiera banor känns inte perfekt.
Det har i allmänhet vi gjort tidigare
om du har använt databaser att unikt rader?
Att inte använda varchars normalt.
Yeah?
[Ohörbart Anmärkning]
Yeah. Så typiskt en kurs-ID.
Så, den vanligaste närma sig här särskilt
vid användning av en ram är egentligen bara
att använda ett antal som ett heltal.
Så låt mig gå vidare och göra det.
Och vi kan göra detta på ett fåtal sätt, men varsel om jag zooma
i på botten här.
Jag kommer att säga lägga en kolumner i slutet av tabellen,
allmänhet bara för visuell bekvämlighet du sätter ID
vid början av tabellen även om detta inte har någon riktig
funktionell effekt.
Så jag ska säga lägga ett kolumner
i början av tabellen.
Jag kommer att klicka på Go, som ger mig tillbaka denna UI här.
Låt oss kalla detta ID.
Om vi ​​tror att vi kommer att ha inte mer gjort 4 miljoner kurser
en int fält är bra.
Vi kunde även krympa ned det
men utrymmet är billigt så vem bryr sig egentligen.
Men, vi försöker skriver Facebook nu,
kanske inte är en dålig sak att förutse stora ints
vilket skulle ge oss 64-bitars Ints
men då är du bokstavligen en fördubbling av antalet bitar
som du använder, så liten avvägning
men något att överväga.
Nu är detta en förvirrande arv sak.
Du kanske kommer ihåg från att använda MySQL
som när du deklarerar en int fält du ofta se ett antal
bredvid det som nummer 10.
Det har ingenting att göra med storleken på det antal
eller antalet bitar.
Det har att göra med det antal av tecken som används
att visuellt display att int fält
när du använder ett terminalfönster.
Så vi kan se att i ett ögonblick.
Så, inte vilseledas genom att skriva siffror
i det även om det är effektivt ber oss
för en här.
Här borta, kommer jag att gå vidare och säga osignerade.
Det finns ingen anledning att avfall alla våra negativa tal
eftersom databasen generellt går
att anta positiva värden eller null.
ID definitivt bör inte vara null.
Och vad tycker du om index för denna ID-fältet?
Låt oss göra det primära.
Så, tänk om, men som jag kan bara tänka på en CS164 kurs
vid Harvard och bara en CS50 kurs på Harvard
och det är ganska mycket sann övergripande
att det finns kanske undantag [Ohörbart] båda terminer
eller något konstigt så.
Men mer fundamentalt, varför är det bättre
att använda en numerisk integral-ID till unikt identifiera kurser snarare
än bara en unik sträng?
Yeah?
[Ohörbart Anmärkning]
OK, intressant.
Så om vi hade sorts cross-noterade kurser.
Så det är ett bra exempel.
Jag är inte säker på att jag skulle lösa att fastän
genom att ge dem samma ID-nummer om det är
där ni kommer med det.
Nej? OK. Men definitivt en hörn fall att överväga.
Om det är en slags - vi behöver någon form
av aliasing potentiellt.
[Ohörbart Anmärkning]
Visst.
[Ohörbart Anmärkning]
Det är ett bra exempel.
Namnet kan ändras över tid, helt rimligt.
Vad mer?
[Ohörbart Anmärkning]
Tyvärr säger det igen.
[Ohörbart Anmärkning]
Ja, exakt.
Så egentligen, det är den verkliga clincher är
att med hjälp av en 32-bitars int är förmodligen kommer att bli snabbare
än vissa variabel längd röding fält.
I det första fallet, burken bokstavligen passa i ett register,
för att inte tala mycket mindre minnesanvändning.
I det senare fallet, du kommer att behöva göra resort [fonetisk]
för strängjämförelser som i sig med den linjära
i storleken av den sträng potentiellt.
Så det är bara en trevlig optimering,
och i synnerhet att det kommer
att låta oss göra det som kallas Fogar mer effektivt
på bara ett ögonblick.
Så låt oss göra det.
Vi kommer att ange att detta är primärt
eftersom jag inte särskilt vill bry sig eller tänka
om vad antalet är av en kurs.
Låt dem ta på vad värden de vill.
Jag kommer att säga automatisk ökning så jag kan lägga ut det i detalj.
Som i undan du kanske vet att Harvard
åtminstone inte har unika nummer för kurser.
Jag har inget minne vad dessa kurser är.
Jag vet att CS50 s katalognummer är 4949,
helt godtycklig.
Men det är konstigt hörn fall i att även
i registrarial dumpa naturligtvis katalogdata,
ibland kurser, gamla kurser har ett antal liknande 4.
Men tekniskt som fält är en char fält
som helt enkelt börjar med 0004.
Så även här, måste du vara försiktig med att skilja
mellan saker som en kurskatalog nummer
vilket kan ha en viss mänsklig begreppet fast längd, 0004,
och du bör inte förvaras som till exempel i ett ints.
Denna typ av fält bör förvaras någon annanstans.
Så i Harvard, om vi faktiskt göra en kurs
shopping-verktyg, det är förmodligen inte tillräcklig
till sifferbanor med bara en, två, tre, fyra.
Vi kommer förmodligen att ha
att ha ett annat fält kallade katalognummer,
det är också tänkt vara unik Based
om mänskliga konventioner här men det är inte det bästa valet
för en unik identifierare eftersom det kan vara av variabel längd.
Det kanske inte är fyra tecken, kan det vara fem.
I själva verket tror jag några år sedan de flyttar
till fem tecken "orsak det var mer än 999 kurser
totalt eller något liknande att, eller 9.999 kurser.
Så kan det vara ett exempel där fältet är inte primärt
men det bör vara unik.
Och e-postadress är en annan.
Du kanske vill att det ska vara unik
men inte nödvändigtvis din primärnyckel.
Okej.
Så låt mig bang ut en annan bord mycket snabbare än denna.
Så jag kommer att kalla detta en Instruktörer och jag ska
för att ge detta en total antalet kolumner av två.
Jag kommer att lära mig lärdom från förra gången.
Jag ska ringa den första kolumnen ID.
Jag ska ringa andra kolumnen Namn.
Jag kommer också att göra Varchar.
Jag kommer att ta något professor har ett namn längre
än 60 tecken, även om nu detta kan vara att trycka den
med några långa namn, speciellt människor med mitt namn.
Det är bra för idag.
Så låt oss rulla över här.
Låt oss göra detta osignerade igen.
Låt oss göra detta primära.
Och vi kommer att tillåta dubbla namn
om det finns två John Smiths eller något liknande.
Och nu har vi två tabeller.
Så nu, väcker detta den fråga hur gör jag associerar
i instruktör med kursen?
Jag känner att jag typ av kom framför mig
för om en instruktör beskriver en kurs,
min första instinkt skulle faktiskt vara att gå tillbaka
till kurser inser, detta var inte en bra idé.
Låt mig faktiskt lägga en kolumn vid slutet av bordet,
Klicka på Kör, och jag ska kallar denna instruktör.
Och jag ska göra det här varchar och jag ska göra det här 60.
Och kanske jag lämnar det null nu
ifall kursen har inte valts unsigned i instruktör
vilket ibland händer före term startar och klicka på Spara.
Vilken av dessa mönster föredrar du?
Först en där vi har en separat instruktör bord
eller den andra där vi bara lägga till ett fält till kursen?
Så det är en nära koppling instruktör med kursen.
[Ohörbart Anmärkning]
OK. Bra. Men låt mig skjuta tillbaka.
Det är precis så enkelt som jag kan bara in personens namn
i denna tabell, som säkert som har något värde eller -?
[Ohörbart Anmärkning]
Okej.
Nåväl, låt mig vara svårt här.
Så låt mig säga att denna kurs är CS51
och jag vet att det har undervisat i år av två personer.
Så, Henry Leitner och Jesse Tov men -
så jag ska bara sätta ett kommatecken mellan de två, höger.
Jag är riktigt bra på CSV från förr.
[Ohörbart Anmärkning]
Exakt, höger.
Så fort du tillgripa till något som detta,
som kan kännas rimliga och du kanske känner
som den här är ganska smart.
Jag sorts låna en Tanken är att fungera bra,
låna en ny idé och slags kombinera dem.
Du är typ av totalt besegra Poängen med att använda databasen
i första hand "orsak Om ett av de värden som
att använda den är snabbare sökningar på grund av de olika index
och tabeller som kan byggas upp för dig
av databasmotorn.
Nu, om du vill söka för alla kurser
att Jesse lär, nu har du att göra träng matchande på alla
av instruktören fält,
vilket i praktiken innebär linjär söka igen för du har
att hitta denna godtyckliga set av tre tecken som helst
på instruktörsområdet föregås
inom kanske följt med ett kommatecken.
Så detta definitivt bådar inte gott.
Så låt mig gå tillbaka till bordet.
Låt mig gå vidare till kurser, ångra det.
Jag ska bara gå vidare och släppa det fältet.
Och om du vill göra det manuellt,
syntaxen är ALTER TABLE kurser DROP instruktör.
Så låt oss gå vidare och säga ja till det.
Och gå tillbaka till tidigare idé
där jag har en separat bord för instruktörer.
Men nu det känns lite som jag kan sätta en kurs
under bord och instruktör
i lärarens bord men jag på något sätt måste koppla ihop.
Och hur skulle du föreslår gör vi det?
[Ohörbart Anmärkning]
Bra. Så låt oss göra det.
Och man kan kalla detta Tabellen i teorin något.
Jag ska medvetet kalla det vad många
av ramverk skulle kallar det, bland dem,
Laravel som du ser i lite.
Jag kommer att kalla det naturligtvis streck instruktör.
Med hjälp av singular i detta fallet för vart och ett av orden
och alla gemener igen, och även med det -
sedan alfabetiskt sorterade från vänster till höger.
Detta är helt godtyckligt, men det brukar vara en konvention
i en hel del av dessa ramar i PHP på andra språk.
Hur många kolumner behöver jag i detta vad vi kallar en koppling bord,
att gå med två andra tabeller tillsammans?
Tre kolumner?
Vilken - vad skulle de vara?
[Ohörbart Anmärkning]
OK. Bra. Det fungerar.
Och vi kunde tekniskt skär ett hörn här men mycket
av ramar i synnerhet skulle fortfarande ge även dessa rader
unika ID: n även om semantiskt raden
att vi verkligen bryr oss om eller kolumnerna som vi verkligen bryr
om är de två sistnämnda det du sa, kurs ID
och instruktören ID.
Så låt oss göra detta.
Jag ringer den här raden precis ID, precis som vi gjorde innan.
Men den här kommer jag att ringa kurs ID.
Den här ska jag ringa instruktör ID.
Och jag ska ange att alla
av dem är osignerade För jag vill ha
för att maximera min 4 miljarder int område.
Ingen av dem bör vara noll.
Jag kommer att ange att ID bör ändå vara primär.
Och återigen, detta bara en konvention,
en massa ramar även om du inte sorterar
i grunden behöver en unik identifierare för raden,
det visar sig att det är bekvämt för koden, SQL som händer
att automatiskt genereras för oss.
Så jag lämnar det som primär.
Men nu, jag liksom har ett beslut om utformning,
kurs-ID och instruktör-ID.
Detta index om någon bör de få?
Om jag lämnar inga index, vad är innebörden?
Vad är en implikation?
Föreställning som förut, eller hur?
Om det inte finns något index, bästa du kan göra är snäll
av [ohörbart] genom hela saken efter siffror.
Så det känns inte smart.
Ska det vara primär?
Så varför inte?
Varför inte primärt?
[Ohörbart Anmärkning]
Perfect. Så vi rullar ut [fonetisk] primära.
Vi har redan valt det.
Så bör det vara unikt?
[Ohörbart Anmärkning]
Bra. Så, om du antar en instruktör per kurs,
helt bra.
Och det är definitivt det vanliga fallet
men vi har redan lagt upp en kanske välkänt exempel.
CS51 fick två instruktörer så vi är snäll
för nu skruvas i det fallet.
Om vi ​​tillåter endast en instruktör,
vi faktiskt kan göra ett sätt med skarven tabellen helt och hållet,
gå tillbaka till den tidigare strategin
och satte inte personens namn kanske men instruktörens ID.
Om du känner varje kurs som bara en instruktör som du kan ha bara
en kolonn.
Men variationen är vad fick oss i trubbel.
Okej.
Så bör det vara unikt?
Nej Fullständig text inte känna tillämpligt.
Som vi sagt tidigare att det är
för liknande träng matchning för beskrivningar.
Så hur är index?
Tja, är index troligen vårt bästa kandidaten
som berättar MySQL optimera för sökningar på det här
eller låt mig utveckla, optimera för sökningar eller går
som vi ser på bara ett ögonblick
så att de är en lite mer effektiv
än något rent linjär.
Vill jag auto steg om detta område?
Så nej, eftersom den sanna ordnade elementet existerar
i tabellen kurserna ".
Det är där det är kommer att få plus,
plus när det är faktiskt infogas.
Här, här är alla kommer manuellt insatt
av oss förmodligen i koden.
Så låt oss helt enkelt ange att både kurs ID
och instruktör-ID har index.
Nu ska vi gå vidare och spara.
Och nu, bara för att visa du korrespondensen
mellan vad som är en fin GUI gränssnitt
och kommandoraden.
Låt mig gå vidare och göra det följer på denna MySQL-prompten.
Jag kommer att säga använda courses50
vilket är det godtyckligt namn Jag gav till denna databas.
Och nu gör jag inte ens ihåg vad vi gjorde.
Så låt mig skriva showbord
och generellt semikolon kommer att vara din vän här
att avsluta frågan.
Och det är det.
Så här är de rader eller snarare de tabeller som vi har här.
Nu, jag har glömt vad en kurs ser ut,
så låt mig inte beskriva kurser och nu ser jag typ av en ASCII
eller en version av vad phpMyAdmin gjorde
och jag ser att ID är en int.
Det är att 10.
Vad innebär det?
Det betyder bara att när det är visade att det kommer att ta
upp 10 tecken på terminalfönstret.
Är det null?
Nej, det är primärnyckel.
Kan det ha ett standardvärde?
Nej Och extra som är speciellt flaggor som automatisk ökning.
Så låt oss bara göra ett par snabba infogningar här.
Jag kommer att gå upp till - låt oss bara säga.
Låt oss ändra tillstånd till ett bildspel
där jag slags pre-förbereda detta.
Detta är en sammanfattning då av alla tre av dessa tabeller.
Jag redan bara manuellt skrev det första kommandot.
Och här, gick jag vidare och skriver de andra för dig.
Detta är bara stilistiska sak.
Generellt många människor skriva SQL-satser i versaler
och sedan tabellnamn och fältnamn i små bokstäver,
om så bara för att det typ av montrar
vad är din terminologi och vad är det databas syntax.
Så här har vi tre tabeller, kurser, instruktörer,
och kurser instruktörer.
På bilden gjorde jag i förväg, Jag hade inte ID-fältet
men det är faktiskt inte en dålig sak alls.
Vi skulle bara se en tredje kolumnen där.
Hade jag gjort det här?
Så nu vill jag föreslå att Vi gör en massa insättningar.
Så här är några uppgifter, Jag ska zooma in
Så jag kommer att föreslå som i kurser,
vi bara ta itu med tre kurser.
Och jag valde dessa tre För de är representativa
av några trevliga - de har några trevliga egenskaper.
CS1, CS50, CS51, de har ökande ID
men vad ID är vad är helt irrelevant.
Det är bara i vilken ordning de var auto införd av mig.
Vad sägs om instruktörer?
Så nu, eftersom Henry Leitner visar både CS1 och CS51,
Detta är typ av ett lämpligt konsekvenser för vår design.
Och Jesse utlär CS51 och Malan utlär CS50.
Så nu - eller snarare dessa är bara dessa människors unika ID.
Och kurser och instruktörer, - kursledare, märker här.
Kurs ID1, vilket var CS1 lärs
med instruktör ID1 som är Henry.
Kurs ID2, som jag tror var CS50 lärs
genom instruktör ID2, vilket är Malan.
Och så slutligen, CS51, och märker att vi har två rader.
Och nu det är därför kopplingen Tabellen är kraftfull lärs
av både Henry och Jesse.
Så det här är allt fint och bra,
men jag kan knappt minnas av toppen
i mitt huvud som är vem här.
Hur kan du eventuellt ta itu med det i kod,
utan att behöva hårda kod saker?
Tja, det är här SQL själv börjar bli vår vän.
Och jag kommer att föreslå att Vi kan skriva följande.
Jag gör detta på i faktiska prompt.
Låt mig gå vidare och sätta dessa saker.
Så, i tabellen banor låt oss göra precis vad vi hade en
stund sedan.
Jag ska vidare och säga, låt oss sätta CS1 och CS50.
Låt oss sätta in några mer rader på en gång, CS51.
Nu, låt mig gå vidare och spara.
Okej, så jag är bara skapa så snabbt
jag kan relationerna Vi såg bara på skärmen.
Och så här har vi Leitner, här har vi Malan.
Låt oss ge oss själva en annan rad, och Tov.
Låt mig spara den här.
Och jag gör dem medvetet i samma ordning.
Nej, jag glömde att ge denna auto inkrement.
Låt mig snabbt åtgärda detta.
Jag ska fixa det här i online-kod.
Det misslyckades som en parentes.
Det faktum att jag inte kunde infoga Leitner och Malan
och Tov misslyckades, eftersom jag inte anger ett ID-nummer, även om
det väntar en och jag glömde att kontrollera automatisk ökning,
vilket betyder att de var alla som standard att få noll.
Men som sedan motsäger vilka egendom som vi har angett.
Primärnyckeln kränktes så det inte ens låta mig göra det.
Så låt mig fixa det här.
Nu, låt mig gå tillbaka till För in fliken här och ange
att jag vill Leitner, Malan och ytterligare en rad, Tov.
Och nu till sist, den enda en som är lite svårt
att komma ihåg är förstås instruktör.
Vi sätter nu att Naturligtvis ID1 är instruktör ID1
så det är CS1 och Henry.
Kurs ID2 är instruktör ID2 som är CS50 och Malan.
Och sedan de sista som vi har att oroa sig för är naturligtvis ID3
vilket är CS51, lärs
av kursledaren 1, som är Henry.
Och tre som också undervisat av 3, vilket är Tov.
Så förhoppningsvis nu Vi har återskapat detta -
fan, jag gjorde samma sak.
Kurs instruktör behöver automatisk ökning.
Okej.
Jag gör det snabbare den här gången, kurs 1, kurs 1, 2, 2.
Och nu slutligen, gör vi CS51 vilket har naturligtvis ID3 och Henry.
Och naturligtvis ID3 och Jesse.
Det ser bra ut.
OK. Så nu, låt oss gå tillbaka till terminalfönstret.
Så om jag beskriva kurser vi får se här.
Om jag vill se kurser jag kan nu gör väljer stjärnan från kurser,
semikolon, och nu Vi ser dessa värden.
Och nu, vad mer vill jag göra?
Välj stjärnan från instruktörer, det är som jag förväntade mig,
och välj stjärna från kurser - kursstreck instruktör.
Så hur gör jag nu gå dessa tabeller?
Så skönheten i att ha valt ID-värden på detta sätt är
att om du tänker på ta kursen bordet
och instruktören bord och sedan sätta in
i mellan dessa två i ditt sinnen kursledaren
tabell kan du typ av linje upp alla dessa ID-kolumner
så att du kopplar dem till en massiv kolumn som har allt
av den information som vi bryr oss om.
SQL-syntaxen för inte nödvändigtvis är självklart,
men låt oss se om vi kan göra det.
Så väljer stjärnan från kurser,
och det finns några sätt som vi kan göra det här.
Jag ska slå in bara för att typ av format saker fint,
men att pilen är bara en symptom på klientsidan verktyg,
det har inget att göra med SQL självt.
Så väljer stjärnan från kurser.
Jag ska nu gå tabellen kurser
på kursledaren bordet.
Hur? På det område som kallas courses.id equal kurs
streck instruktör dot vad namnet
av motsvarande fält här att jag vill ha ett par.
Det är inte ID.
Det är - vad, förlåt?
>> Kurs-ID.
OK, låt mig zooma ut.
Men jag vill ta detta ett steg längre.
Jag har nu gjort detta bord och här.
Nu vill jag dra den här killen i också.
Så, låt mig vidare gå med det hela
på instruktörens tabell på vad?
Kursstreck instructor.instructor id
equal instructors.id.
Så vi kunde ha skrivit denna fråga i ett par olika sätt.
Den ordning i vilken jag gjorde detta är inte så viktigt.
Jag bara typ av gjorde det i mitt sinne från vänster till höger.
Vi kunde ha gjort det här på några olika sätt
men om jag har nu semikolon och tryck Enter,
märker jag får tillbaka en ny temporär tabell, ett sökresultat
så att säga i databasen tala.
Och vad jag har i denna sak?
Jag har på ID, ett namn, en annan ID, som är typ av förvirrande
för mig just nu, en kurs-ID,
en instruktör-ID, ID, och namn.
Så, i slutet av dagen vi har rätt data nu.
Jag kan se att CS1 lärs by Leitner, är CS51 visas
av Leitner och Tov, och CS50 visas av Malan.
Men jag är lite nervös om denna tvetydighet jag har skapat.
Vad är den tvetydighet Jag anspelar på?
Yeah?
[Ohörbart Anmärkning]
Det finns tre ID-kolumner.
Så vi kan faktiskt fixa det här och vi ska faktiskt går
att skjuta till vårt ramverk i slutändan för att hjälpa oss med detta,
men det visar sig att det finns ett nyckelord i SQL som kallas S,
där du kan ange ett alias, ett nytt namn på ett fält
så att vi kan undvika detta tvetydighet helt och hållet.
Men insåg att om vi inte gör det itu med det på något sätt som med
det sökordet eller en ram,
det finns potentiellt här tvetydighet om du försöker
för att komma till ID-fält eftersom klart det finns sådana
med samma namn där.
Så det här är en gå med och jag tror i ditt inre öga på bästa sätt
att tänka på det egentligen är att ta de två tabellerna,
rada upp dem i sätt som du vill.
Och detta är en så kallad inre koppling i den meningen
att vi kombinerar tabellerna här.
Det finns andra typer av kopplingar som vi kan stöta på
över tiden som yttre kopplingar,
men för det mesta här är förmodligen den vanligaste
för rekonstruktion av data.
Vad vi har gjort nu är generellt vad som kallas
normalisera dina data, så att det finns ingen dubblering helst
i dina tabeller.
Och genom duplicering, skulle jag har inneburit att första strategi.
Om vi ​​hade nämnt Leitner och Tov på flera ställen
i databasen, det är inte i allmänhet det bästa beslutet
särskilt om deras namn kanske ändra övertid eller i fallet
av äktenskap, flicknamn kanske ändrar sig du bara vill ha en
kanonisk plats för vissa datavärde som ett namn.
Okej.
Så, för att sammanfatta, vi har haft en några designbeslut för att göra
och de viktigaste förmodligen reduceras till några
av dessa val av index.
Men låt mig påpeka en annan sak också.
Om jag går tillbaka till phpMyAdmin,
en funktion som du kanske inte har stött på innan är
följande.
Om jag går till kursledaren, Jag redan angav att en del
av dessa saker har index.
Men låt mig gå till strukturen flik av kursledaren.
Låt mig klicka nu på Index och märker följande.
Jag har angett här att det finns en primärnyckel
på kolumnen som heter ID.
Detta är en något komplicerad sätt att ange kardinalitet
och så vidare som en hänvisning till storleken på det fält i byte.
Men nu har jag också en annan fält, kurs-ID, som är -
Naturligtvis ID vilket görs i förväg och unikt, OK.
Jag gjorde detta i framåt för oss.
Så, varför är det - låt mig falla detta av hänsyn till diskussionen.
Åh, vet du vad jag gjorde?
OK. Så tidigare, en av farorna med att använda ett grafiskt verktyg
så här, när vi var skapa denna ansluta tabellen,
kursledaren bordet, minns att jag specificerade
att jag vill ha ett index på detta område
och ett index för den här andra fält.
Den bieffekt av kontroll båda dessa boxar
på samma skärm är att phpMyAdmin härledas från detta,
att jag vill inte två separata index,
att jag vill ha en gå med index som är i allmänhet bara bra
eller mest användbara när du är söka om inte ett fält
men båda dessa områden.
Och det är därför vi hade dem FÖRBINDA där
så jag tappade den "orsak som var inte vad jag tänkt.
Snarare kommer jag att göra om detta här.
Jag ska gå till kursen ID
och under mer jag är bara kommer att säga lägga till index.
Och jag kommer att gå under instruktör-ID och säga lägga index.
Och nu om vi klickar här, märker har vi tre index,
en primär och som jag avsett en för varje
av dessa främmande nycklar.
Och jag kallar det främmande eftersom kurs-ID i tabellen kartor
till vilket fält, bara för att vara rensa, i en annan tabell.
Primärnyckeln kallas ID, i tabellen kallas kurser,
och samma affär för den andra.
Men nu, är ett intressant lura och verkligen teknik.
Jag gick vidare och låt mig göra det lite långsammare.
På samma skärm, meddelande det står Visa relationer här.
Jag klickar på detta och nu märker jag får göra några begränsningar.
Så, en av de upsides också
inte bara genom att använda konceptuellt främmande nycklar och andra tabeller
som vi har bara på är att genom att definiera ett index
på dem kan du få databas hjälpa dig ännu mer
säkerställa integriteten av det fältet.
Specifikt, kan jag nu specificera via denna nedgång
ner att kurs ID-fältet
i denna tabell faktiskt kartor för att courses.id.
Likaså instruktör streck ID avbildas till instructors.id.
Nu, varför är detta bra?
Tja, märker, till höger sida vad som visas nu.
Jag kan nu lära databas som om Henry
till exempel någonsin går i pension och hans rad försvinner
från instruktörens tabellen helt och hållet därigenom vara
bort, jag kan via detta cascading tillvägagångssätt säkerställa
att alla kurser han undervisar är inte längre förknippas med honom.
Jag kan lära databasen ta bort raderna
i denna så kallade delta bord automatiskt om Henry eller om man
av hans kurser försvinner.
Nu, varför är det övertygande?
Yeah?
[Ohörbart Anmärkning]
Du behöver bara göra det en gång och lång sikt, eller hur?
Det är väldigt lätt om sorts folk kommer och går, kurser kommer
och gå, din databas kunde bara få full av kurser
och med lärare som inte längre relevant för datamängden.
Och dina data börjar bli mycket rörigt och smutsigt och inaktuella,
och så här kan vi sortera
av driva en del av dessa begränsningar.
Yeah?
[Ohörbart Anmärkning]
Den vet genom detta.
Detta är den skärm där vi ange en koppling
mellan främmande nyckel och primärnyckel.
Så alla namngivning konventioner jag alluded
till tidigare är bara konventioner.
Det finns ingen inneboende mening.
Detta är skärmen som endast är användbar
efter att du angett index på vart och ett av de områden som vi gjorde.
Och för denna rullgardins vi har några saker till exempel
Om en kurs raderas kan du faktiskt förhindra att strykningen
från att hända om det är en rad i denna tabell
genom att bara säga: Begränsa.
Med andra ord Henry kan inte retire
tills vi frikoppla honom från CS51 och CS1.
Så det är en bra sak.
Men det skulle kunna utlösa fel i koden
om du inte räknar med att, eller så kan vi ha en kaskad,
en kaskad liknar vilja Cascading Style Sheets
och forsande vattenfall innebär att om en -
Om Henry pension så - genom att få bort
så kommer hans rad här få bort.
Ingen åtgärd betyder ingenting eller null är ganska användbart om du snäll
av vill ha lite historiskt rekord Henry har lärt CS51,
men du vill bara det fältet till vara noll, så att raderna där
men det är inte längre förknippas med honom.
Så dessa är mycket starka tekniker som du kan
och bör använda även om i intresse särskilt
att rädda dig från dig själv.
Så låt mig nämna ett några sista detaljerna här,
ingredienser med vilka som kan vara till hjälp
som vi planerar för databasdesign.
Du har också valet över databasmotorn
som du använder i din kod.
Om du är bekant av CS161 du kanske -
eller till och med 61, kanske du i allmänhet vara förtrogen med filsystem.
Och det finns saker gillar, NTFS och HFS +
och X2FS4 [fonetisk] och 3 och så vidare.
Det finns olika sätt att lagra data på skrivbord.
På liknande sätt är det olika sätt att lagra data
i en databas som standard åtminstone i den apparat
med den senaste versionen av MySQL.
Vi har använt databasmotor som kallas, NoDB,
som uppbär en Några trevliga funktioner.
Men en annan vanligaste är också kallas MyISAM och ännu en
som kan användas är Minne, vilket innebär att inte lägga något
på disken, bara hålla saker i minnet.
För det mesta du förmodligen kommer inte gå fel just börjat
med NoDB, men för några projekt som tenderar att involvera höga hastigheter
insättnings exempelvis som mycket snabb avverkning,
hundratals saker per sekund eller tusentals saker.
När som helst du har en massa saker som går
på i databasen då detta slag
beslut av lägre nivå börja engagera sig.
Den fullständiga funktionen för Exempelvis fungerar bara i MyISAM
så det får följder.
Men ni kanske minns detta, låt oss åtminstone motivera varför vi bryr
om NoDB i synnerhet.
En ras villkor allmänhet hänvisar till vad?
Okej, det här är en anspelning till exempel vissa
av er kanske har hört i år tidigare om 161 eller 50
där du har en rumskompis, ni båda verkligen gillar mjölk,
en av er kommer hem först öppnar kylskåpet finns det ingen mjölk,
stänga kylskåpet promenad över gator till CVS och få
i kö för att köpa lite mjölk.
Under tiden, din rumskamrat kommer tillbaka hit.
Hon gillar också mjölk.
Öppna kylskåpet och inser ingen mjölk.
Här hon sedan går till lagra, kanske den andra CVS.
Snabbspolning framåt några minuter senare du kommer tillbaka och nu både
om du har köpt mjölk.
En av dem kommer nu att skämma bort eftersom du inte
som mjölk så mycket och detta är ett problem, eller hur?
Eftersom båda inspekterade tillståndet i viss variabel
och gjorde ett beslut baserat om det trots att tillståndet
av denna variabel var i huvudsak i processen för att ändras,
alla vara det långsamt under Hur lång tid det tar
att komma till och från CVS.
Så vad är en slags dum real världs lösning på det problemet?
Lämna en anteckning, eller hur?
Det hände förra gången.
Lämna alltid en anteckning eller hänglås saken bokstavligen.
Och jag säger hänglås, eftersom om du tar eller tog CS161,
låsning är en grundläggande Tanken på en sådan värld.
Så raceförhållanden kan uppstå också i databasen världen
och ni kanske minns kanske från CS50 finansiering om du tog 50,
denna kod som vi faktiskt gav ni i specifikationen
på tiden så att din operation är så kallad atom.
Om du ville, i detta fall, köpa en andel i lager
och det beståndet har någon särskild symbol.
Vi sa ju att använda kod som detta, eftersom med hjälp av denna
den dubbla nyckel uppdatering syntax, som är byggd
i MySQL är du effektivt göra antingen i insats
eller uppdatering efter gör en utvald att se
om en aktie är redan där.
Med andra ord är den analoga i världen för att köpa en aktie
mjölk och kylskåpet skulle kunna vara det första
innan du köper en andel av Google kanske du vill välja
från databasen för alla av aktier i Google som David äger
för att se om han äger noll eller mer.
När du väl se om han äger noll eller mer har du
att sedan göra följande.
Du måste antingen göra en insats
om han äger noll 'orsak det finns ingen rad för David ännu,
eller om du behöver göra en uppdatering om åtminstone i teorin du vill
att ha en rad per användare.
Problemet är att välja det antal aktier
och sedan uppdatera eller ings kunde avbrytas
av någon annan på en annan datorterminal försöker köpa
eller sälja en del av Davids aktier av aktier oavsett om
för goda ändamål eller sortera av skadliga syften.
Det är som att gå till affären när din rumskamrat kommer tillbaka
och kontrollerar tillståndet på variabeln.
Så här syntaxen på tiden vilket slags lämplig
för CS50, undviker att problemet helt och hållet.
Och det bara gör allt detta magi låsning för dig,
men nu med dessa typer av projekt för denna kurs
vilket sannolikt kommer att involverar mer komplexa datamängder,
du kan inte uppnå alltid denna Atomicitet.
Allt som händer på en gång eller inte alls
utan avbrott så elegant.
Och så MySQL, en annan databasmotor,
support saker som kallas lås,
där du kan säga låsa detta bord, så att endast en behandling
och i allmänhet endast en användare kan trycka på det i varje tidpunkt
att läsa eller skriva och då kan du låsa upp den.
Detta är ett exempel från en MySQL: s egna referenser,
där om du har som en bank konto som du försöker
att dra av pengar från och sedan lägga pengar på.
Du kanske vill se till att både
av dessa saker händer ihop
så att det finns ingen räknefel
Och ingen förluster pengar, på något sätt.
Problemet med lås men i en databas är
att det i allmänhet innebär hela tabellen är låst
vilket innebär att om du har hundra personer som försöker
att göra affärer med din bank online på samma belopp
tid endast en av dem kan gå åt gången.
Vilket är dumt, speciellt på servrar nuförtiden
som har åtta naturligtvis 16 Naturligtvis har en stor mängd
minne, det finns ingen anledning att som följetong alla
av dina transaktioner, om de kunderna bara ska
att interagera med sina egna rader.
Så NoDB kan du göra saker smartare
och detta i allmänhet kommer att vara den metod du tar i koden,
som du använder något kallas transaktionen.
Och du gör det i allmänhet i PHP-kod,
Ruby-kod, Python, oavsett.
Men den SQL-kod som är slutligen används är detta,
typiskt.
Starta transaktion då du ange två eller flera frågor
som du vill exekvera altogether
utan avbrott eller inte alls.
Det kan även vara en del Välj uttalanden i
eller vissa raderar eller uppdateringar.
Men det fina är att den Databasen kommer att vara smart nog
att se till att det kommer bara låsa raderna de är faktiskt
involverade i denna uppdatering eller väljer eller borttagningar.
Så om du fick tusentals rader och du är bara röra tre
av dem, bara den uppsättningen av bordet kommer att vara låst
vilket innebär att de övriga 99 kunderna kan röra sina rader
utan att vara serialiserade och bromsas av dig.
Samtidigt är detta den finaste aspekt till transaktioner.
De är transaktioner i en känna som 161 på ett filsystem,
de är affärsbeslut
vilket innebär att du kan rulla dem tillbaka, kan du ångra dem.
Detta är som kommandot eller kontrollera F av databaser.
Om du upptäcker en del igenom alla
av dina olika uppgifter operation, skjuta, är något som går fel.
Du bokstavligen köra en olika SQL-fråga rulla tillbaka
och alla dessa trend - alla av de uttalanden du avrättade
efter att ha sagt start transaktionen försvinner
som om de aldrig hänt,
vilket är en otroligt kraftfull sak.
Och det är dessa typer av saker förvisso i 50 vi sorterar
av sopa under mattan och du bara typ av anta
att allt kommer att bli bra.
Men när du börjar tänker på verkliga projekt
och användarna och integriteten av din databas,
det är dessa typer av designbeslut
som kommer att vara viktigt.