>> Alles klar.
Also, ohne weitere Umschweife, SQL, Structured Query Language.
Also, haben Sie wahrscheinlich diese bei dest in CS50, vielleicht in CS165,
vielleicht in Ihrem eigenen persönliche Projekte.
Und was können Sie tun, SQL, in einer SQL Server generell?
Ja?
[Inaudible Bemerkung]
OK, das war sehr gesicherten Weg, es zu sagen.
Ja. So ist es erlaubt Daten gespeichert werden
und vor allem ermöglicht Sie für die Daten abzufragen.
Und das ist ein Schritt nach vorn
mit so etwas aus einfacher wie eine CSV-, rechts.
Comma Separated Variables.
Ähnliche Werte.
Ebenso können Sie sparen Informationen einer Zeile
in eine Textdatei.
Aber was ist die Kehrseite der Medaille ein CSV-Datei für die Speicherung Ihrer Daten,
auch wenn Sie effektiv bekommen Zeilen und Spalten von ihm?
Ja.
>> Sie nicht 'haben die gleiche Organisation
Effizienz [unverständlich].
>> Sie nicht den gleichen haben Organisation Effizienz.
Was meinen Sie?
>> Nun, wie [unverständlich] haben wie Primär [unverständlich].
>> OK. Ja.
>> Es ist eine relationale Datenbank Sie können mehrere Datenbanken haben
miteinander verbunden auf sehr spezifische Weise.
>> OK. Gut.
>> Es ist [unverständlich] um eine CSV gesetzt.
>> Und lassen Sie mich zwicken ein wenig Terminologie.
Also mehrere Tabellen innerhalb einer Datenbank, sicher,
und das hinaus, was geht Sie mit nur einer CSV tun können.
Aber wirklich die Begrenzung mit CSV Ich würde behaupten, ist
dass die Ineffizienz von allem.
Es ist sehr einfach zu Layout.
Aber wenn Sie eine machen wollen Abfrage, was ist die Laufzeit
jeder Auswahlabfrage auf einer CSV-Datei?
Ich meine, es ist große alte [unverständlich], Recht, denn im schlimmsten Fall,
sie standen ganz unten.
Selbst wenn Sie die ganze sortiert hatte CSV-Datei, wenn Sie nicht wissen,
Voraus, dass, na ja, Sie sind immer noch zu haben
um die ganze Sache zu suchen.
Also, unter den Dingen wir werden bekommen
von der Verwendung einer tatsächlichen Datenbank mit einer Sprache
SQL ist wie wir abfragen können und wir können im Voraus
als Datenbank-Designer angeben, was sind die Felder
, die wahrscheinlich die waren, haben Fragen zu, so dass Menschen
bei MySQL oder Microsoft oder Oracle,
Wer hat die Datenbank vorgenommen Sie verwenden alle tun können
von der harten Arbeit der herauszufinden, OK,
bei einer Million dieser IDS.
Wie können wir das Layout - sie in Erinnerung?
Irgendeine Art von Baum strukturieren, vielleicht,
so dass, wenn Sie tun Wählen Sie tatsächlich auszuführen,
es ist etwas, das ist logarithmische oder logarithmisch
in logarithmischer Zeit eher als tatsächlich zufall
in etwas linear.
So viel haben wir Leistung so.
Und wir können auch viel mehr speichern Daten leichter "führen Sie die SQL-
Server wird in der Regel gespeichert im RAM, auch wenn Teile
es kann auf der Festplatte gespeichert werden, und Sie wahrscheinlich wissen jetzt
RAM ist in der Regel, dass schneller als Platten,
so, das ist eine gute Sache.
Und wir können auch hand Parallelität viel besser.
Wenn Sie 165 oder 161, genommen haben Sie wissen, dass, wenn zwei Menschen versuchen
um die gleiche Sache zu tun auf einmal auf einem System,
schlechte Dinge können in der Regel passieren.
Also unter den anderen Funktionen, die wir bekommen können, wenn wir gestalten unsere Tabellen
in der richtige Weg ist bessere Unterstützung und Sicherheit
wenn es um die Parallelität kommt.
Also, zwei Menschen in zwei Teile
der Welt unter Verwendung der gleichen Website, wenn sie beide versuchen
etwas gleichzeitig kaufen Zeit wird, dass Ordnung nicht
gleichzeitig gehen.
Irgendwie haben sie serialisiert werden würde von jemand anderem als unsere eigenen -
jemand anderen als uns.
Die Datenbank wird zu tun, dass für uns.
Also, wenn der einfachsten Form,
SQL Abfrage lässt uns ein relationalen Datenbank.
Eine relationale Datenbank ist eine, die man
oder mehrere Tabellen in es in der Regel.
Und wenn dies eine wenig vertraut,
Sie wirklich nur denken kann dies als Excel oder Zahlen
oder Google Spreadsheets.
Es hat nur Zeilen und Spalten und in der Regel die Spitze jedes
dieser Zeilen hat ein Name für sie.
So könnte dies die ID sein Spalte, der Name Spalte
die Spaltenadresse und so weiter.
Und dann können Sie mehrere haben wie Tabellen, wenn Sie wollen,
zu starten Auslegen verschiedene Arten von Daten.
Aber Sie erinnern sich vielleicht zumindest von CS50, die wir versucht
Ihnen eine GUI-basierte geben Werkzeug [unverständlich]
zu Ihrer Datenbank zu verwalten.
Es wurde phpMyAdmin aufgerufen.
So ist es nur ein Zufall, dass es wurde in PHP geschrieben, wirklich,
aber es ist nur eine Web-basierte war vorderen Ende in einer Datenbank.
Und über die verschiedenen Registerkarten und Links könnten Sie beginnen
um eine Datenbank zu konfigurieren für sich.
Aber ein gutes Werkzeug, um zu starten bekommen ein wenig mehr Komfort
mit ist auch die Kommandozeilen-Client.
Also, wenn mit dem Gerät CS50 oder wirklich mit jedem PC-Makro
das hat eine MySQL-Kommandozeile Client können Sie auch tun, es ist eine Art
der alten Schule, wie diese.
Nebenbei der MySQL-Projekt zumindest die Open-Source-Version
es ist nun MariaDB forderte Aus verschiedenen Gründen kann man lesen
auf Wikipedia, aber es ist die gleiche Software,
es ist die gleiche Syntax und so weiter,
ziemlich das gleiche Code-Basis.
Und so, wenn ich bei dieser Ich kann jetzt aufgefordert zu interagieren
mit meiner Datenbank viel mehr manuell.
So Beispiel dafür, lassen Sie mich gehen Sie vor
und öffnen gerade ein Terminal-Fenster.
Ich geschah, werden mit dem CS50 Appliance, aber Sie können dies tun,
auf fast jedem System in die Sie das Recht haben
Software installiert ist.
Und ich werde auf MySQL-u tun Benutzernamen für John Harvard
zu diesem bestimmten System-p nach einem Passwort, das ich geben
in etwas mehr sicher durch Enter drücken.
Jetzt bin ich aufgefordert werden.
Ich werde hochroten geben in der CS50 Appliance
und jetzt sehe ich im Wesentlichen dass das gleiche Bild.
Aber es gibt nun Befehle dass wir mit der Eingabe beginnen
zeigen, wie Datenbanken und das wird mir alles zeigen
der Datenbanken, die ich habe bereits im System angelegt,
ziemlich das gleiche Liste Sie in phpMyAdmin sehen würde.
Es gibt ein paar andere wie Informationsschema und Test,
die, wenn Sie rund um die stecken CS50 Appliance, verstecken wir einige
dieser unteren Ebene Tabellen
aber sie waren es die ganze Zeit.
MySQL hat eigentlich niedrigem Niveau Eigenschaften wie Benutzernamen
und Passwörter für die Datenbank selbst, nicht für Ihre Anwendung
dass Sie vielleicht auf ihm läuft.
Also vorab, heute, ich erstellt ein paar Datenbanken,
von denen genannt wird courses50.
Quoten sind einige von euch verwendet haben CS50 natürlich Shopping-Tool
die eine große Schnittstelle für ist das Standeskurskatalog.
Und das ist eigentlich eine schöne Datensatzes über "Ursache zu sprechen,
ein, wir sind irgendwie alle offensichtlich vertraut mit Kursen
und Dozenten und Tagungs Standorte und alle Sortier
der gewöhnlichen Dinge der Universität,
aber es ist auch etwas bekommen interessante Möglichkeiten
für Design.
Also dachten wir, wir würden die Vorstellung von einem Kurskatalog
und eine Shopping-Tool als Beispiel während heute zu sortieren
der Rahmen etwas von dem Entwurf Entscheidungen, die wir treffen müssen.
Lassen Sie uns also dort beginnen.
Angenommen, ich wollte eigentlich um die Super einfachsten darstellen
natürlich Shopping-Tools.
Und die einfachste Welt Ich kann mir vorstellen, und man ist
in denen es Plätze und es gibt Lehrern.
Und lassen Sie uns annehmen, um die um der Diskussion willen
dass jeder Kurs mindestens einen Namen.
Lassen Sie uns also beginnen skizzieren dies.
Ich werde phpMyAdmin nur als weiterführende Informationen,
so haben wir nicht zu tippen alle Anfragen manuell.
Aber hier bin ich in meinem courses50 Datenbank.
Wenn dies nicht mit, wird es sehr einfach, wenn Sie tauchen
in Ihrem eigenen Projekt wenn Sie möchten, es zu benutzen.
Ich werde erstellen Tabelle namens Kurse
und ich kann nur denken, einer Feld
für jetzt, der Name eines Kurses.
Ich werde weitermachen und sagen geben Sie mir eine Spalte.
Nun, wie Sie sich erinnern Sie eine Schnittstelle, die ist ein bisschen
wie diese.
Und der andere den Kopf offen phpMyAdmin ist, dass es irgendwie
Selbstinstruktions und Über die Dropdown-Listen, Sie sortieren können
sehen, was Ihr von möglichen Design-Entscheidungen sind.
So werde ich zu geben jeder Kurs einen Namen.
Das ist der Name dieser Spalte.
Und wie über den Datentyp?
Die meisten von euch wissen sollten Mindestens einige dieser Datentypen
aus früheren Erfahrungen.
Was ist angemessen für Kurs Name?
Sharon?
Varchar >>.
>> OK, varchar die Char Variable ist.
Und was bedeutet, dass bedeuten mehr technisch?
[Inaudible Bemerkung]
OK. So ist es ein String.
Und der Aspekt var von impliziert es was?
Variable. Aber was bedeutet das?
Ja?
[Inaudible Bemerkung]
Genau. Also ist es eine variable Anzahl der Zeichen
in der Zeichenfolge bis bis zu einem gewissen Maximum.
Also hier ist unsere erste Design-Entscheidung.
Wir haben wirklich zu entscheiden, wie viele Bytes maximal
zu jedem solchen String zuweisen.
Generell wollen Sie Art nicht machen es zu klein ist,
es nicht zu groß 'Verursachen offensichtlich
wenn Sie gerade zu klein sind anfangen zu kürzen Daten
und Sie erhalten Informationen zu verlieren.
Und wenn es zu groß ist, nur du bist Art erzählt die Datenbank
zu erwarten und zu Weitere Daten zu optimieren
als es tatsächlich jemals zu bekommen.
Also, was ist eine angemessene Gefühl Nummer für den Namen eines Kurses?
60? OK, also 60.
Das scheint ziemlich vernünftig
so lange ist es kein Ausnahmen zu.
Es gibt wirklich keinen harte, schnelle Regel.
Um ehrlich zu sein, für sein historischen Gründen viel
Menschen werden 255 wählen "Ursache für die Jahre, die Art war
der maximale Standard mit 8 Byte - 8 Bits als Zähler.
Ich würde mehr [unverständlich] könnte Potenzen von 2 zu verwenden
aber es ist irgendwie irrelevant.
So können wir mit 60 zu gehen.
Das scheint vernünftig, so lange
als wir schließlich bereue es nicht 'Verursachen, dass eine obere Schranke.
Angenommen nun, das Gegenteil Entscheidung gefallen war,
nicht variabel, sondern Zeichen nur die char-Feld.
Also im Gegensatz zu C und C + +, char bedeutet nicht, dass ein char
und Datenbanken, die bedeutet in der Regel eine feste Anzahl
von Zeichen in einem String.
Was wäre der Kopf-und / oder sein Nachteil meines Wahl 60
für eine char-Feld, anstelle von varchar?
Das ist genau die erste Art der Entscheidung, die Sie machen müssen,
bei der Inspektion [phonetische] aus Projekt mit Ihren Partnern.
Ja, Sharon wieder.
[Inaudible Bemerkung]
Gut. Also, wenn der Name weniger
als 60, dann verschwenden Sie was auch immer das Delta
zwischen 60 und tatsächliche Länge.
Damit fühlt sich einfach verschwenderisch, mehr Bytes als Sie benötigen.
Aber warum gibt es sie?
Sicherlich gibt es einige auf den Kopf.
Ja?
[Inaudible Bemerkung]
Sicher. Also manchmal könnte die feste Anzahl wissen
von Zeichen wie 10 Stellen für eine Telefonnummer zum Beispiel.
Aber wen interessiert, wie, warum nicht einfach sagen, 11 sowieso
oder warum nicht sagen 60 ohnehin mit dem varchar?
Welchen Vorteil bekommen wir durch die Kenntnis und Gestaltung
eine feste Anzahl von Zeichen?
[Inaudible Bemerkung]
Du bist auf dem richtigen Weg.
So ist es aber Optimierung es ist wirklich von - ja?
[Inaudible Bemerkung]
OK. Gut. Lassen Fokus an diesem letzten Teil.
So Indizierung.
So stellt sich heraus, wenn Sie im Voraus wissen, dass alle
Ihre Felder gehen zu 60 Zeichen lang sein,
kann man wirklich davon halten Spalte in der Excel-Datenbank
wie mit sehr gerade, linksbündig
und rechtsbündig Kanten
weil jeder Spalte ist 60 Zeichen breit.
Das bedeutet, dass diese String ist 60 Zeichen weg
aus dieser Zeichenfolge, 60 Zeichen von diesem ein
und diese und diese.
So einfach gerne zurück, wenn Sie C gelernt, Random Access mussten Sie
in der Welt des Arrays, gleiche Idee hier.
Wenn Ihre Spalte dargestellt nur mit fester Länge Zeichen,
Sie können effektiv Index zufällig auf 60 oder 120 oder 180
und Sie bekommen können individuell Saiten viel schneller.
Dann, wenn stattdessen hatte Ihre Spalte eine gerade Kante links sozusagen
aber eine sehr robuste Recht Rand an der Säule
weil Sie vielleicht 10 Zeichen haben,
15 Zeichen, 5 Zeichen.
Also auch das ist ein Kompromiss.
Und manchmal nur durch Versuch und Irrtum
und Experimentieren können Sie heraus
herauszufinden, was wirklich die richtige Entscheidung ist aber diese sind die Arten
von Fragen, die sollte gehen
über Ihren Köpfen und / oder Tabellen, wenn es Zeit
zur Planung Ihrer Datenbank.
Also, nicht unbedingt das Richtige beantworten, aber Sie sollten
zumindest einige oder zwei Sätze im Kopf
was auch immer, um Backup Entscheidung, die Sie machen.
Gut.
Lassen Sie uns also halten Scrollen in den Eingabeaufforderungen hier
phpMyAdmin UI sind.
Also, der Standardwert für ein Name, soll ich angeben
dass es sein sollte haben ein Standardwert von null?
Was denken Sie?
Kann ein natürlich eine Null-Name?
Nur fühlt sich komisch an, oder?
Ich kann nicht jeder denken namenlose Kurse in Harvard.
Und vielleicht gibt es einige Bei dunklen Ecke
wo ein Kurs erhält eine Nummer
und der Professor hat nicht gewählt, einen Namen dafür, aber -
Ich meine, zum Mist mit, dass
wie wir nicht einmal Mühe, dass die Unterstützung.
Ich würde sagen, im Interesse von einem schönen, sauberen Datenbank
angeben lassen, dass man nicht haben einen Standardwert von null.
Alternativ wir tun könnten so etwas wie untitled Kurs
das ist nicht anders als mit Mac OS und Windows zu tun
beim Erstellen einer Ordner zum Beispiel,
aber das macht ein wenig mehr Sinn
so dass der menschliche etwas sehen.
Wir freuen uns über ein Gespräch Back-End-Datenbank vermutlich
für Kurskatalog.
Also ich weiß nicht wirklich, auch wie die Idee, die ihm
in untitled Kursnamen
denn das ist nicht wirklich gehen, um jemand zu helfen.
Also lassen wir dies als keine, was bedeutet, dass beim Einlegen
in diese Datenbank, haben Sie Natürlich, jedem einen Namen geben
was ein wenig fühlt Reiniger für mich.
Gut.
So scrollen weiter, Sortierung.
Das hat nur damit zu tun, Zeichensätze und so weiter
wenn Sie je gesehen haben Erwähnungen der schwedischen
in phpMyAdmin, das ist 'Bewirken, dass die Menschen
die phpMyAdmin schrieb waren Schwedisch.
Ist das PHP oder MySQL ist es?
Einer der beiden, I ohne weiteres vergessen.
Aber es ist aus historischen Gründen
Sie können jedoch jedes Schnell Charakter in Englisch
dass man mit dem schwedischen so ist es weitgehend ein Nicht-Thema.
Der CS50 Appliance ist aber, verwendet - konfiguriert auf UTF-8 zu verwenden,
so dass in der Regel sollte nicht Pop-up für Sie.
Attribute.
So dass keiner von ihnen sind wirklich relevant hier.
Ich sehe, Binär, ohne Vorzeichen, Unsigned zerofill,
und auf Update aktuellen Zeitstempel.
Das Feld gilt nur für einige numerisches Feld
oder einige Zeit Felder.
Also werden wir über überspringen dass ganz.
Null. Kann dieses Feld null sein?
Also keine. Wir haben bereits diese Art von Gesprächen.
So wollen wir nicht ein Standardwert.
Wir wollen nicht, es zu null sein.
Was ist mit Index?
Es gibt vier Möglichkeiten hier.
Was bedeutet es, wenn wir angeben
dass diese Zeile wird ein Primärschlüssel sein?
Denken wir zurück an CS50 oder CS165, wenn Sie es aufgenommen haben.
[Inaudible Bemerkung]
Genau. So ein Primärschlüssel per Definition die Feld
eindeutig identifiziert Jede Zeile in dieser Tabelle.
Und Sie können sich darauf verlassen, zu tun die eindeutige Identifizierung.
Also, was bedeutet es, dann nur einmalig sein?
Na ja, irgendwie hat diese beiden Sortier
Auswirkungen der unter unter der Haube.
Aber im Allgemeinen ist Primärschlüssel eine Art Vertrag, den Sie machen
mit der Datenbank Sache.
Wenn ich Fragen auf der Suche nach einem Kurs,
Ich werde diese nutzen speziellen Bereich.
Und wir werden zurückkommen Deshalb haben wir vielleicht zwei
solche Entscheidungen hier primären oder einzigartig.
Einzigartige sagt nur, diese Feld wird eindeutig sein
aber ich bin nicht wirklich machen jede Art der verbalen Engagement hier
verwenden, um das Feld zu meiner Suche zu tun
Gründen wir werden sehen in nur einem Augenblick.
Wenn wir festlegen, statt Index was bedeutet es, um anzugeben,
dass ein Feld hat einen Index auf sie?
Ja?
[Inaudible Bemerkung]
Genau. Es ist schon optimiert für die Abfrage.
So können Sie - Datenbankserver, Oracle, MySQL, was auch immer,
wird in der Regel auf sich wirken hinter den Kulissen nach dem Klicken auf
diese Option und klicken Sie dann auf Sparen und es wird bauen
bis typischerweise eine Baumstruktur, B-Bäume, wenn Sie gesehen haben
oder das ist, gehört ab sehr kurze aussehende Baum
das gibt Ihnen sehr schön logarithmischen Eigenschaften
bei der Suche auf die Daten.
Wenn Sie einen Index angeben auf einem Feld, was ist los
um die Lauf sein Zeit des Suchens
für eine beliebige [Phonetische] Natürlich Name?
Was ist das?
[Inaudible Bemerkung]
Oh, [unverständlich], linear, nicht wahr?
Wenn es keine Optimierungen auf die Datenbank gewährt
und Sie nicht gedacht, die Datenbank, welche Art
von Daten zu erwarten.
Das Beste, was Sie tun können, ist zu überprüfen alles, wenn Sie schauen,
für einen Wert, vor allem wenn es könnte
in der Tat Duplikate.
Volltext mittlerweile, wir winken uns die Hände für jetzt.
Aber im allgemeinen ist dies ein Indextyp, das Ihnen erlaubt
Keyword-Optimierung für sucht auf einem Feld.
So könnte dies sein ein guter Kandidat
für wie eine Kursbeschreibung wo Sie vielleicht ein paar haben
der Absätze und man könnte wollen String Spielen zu tun.
Volltext wird in der Regel lassen Ihnen, dass ziemlich effizient.
AI, das ist eine schreckliche Art der Erklärung aber wenn wir schweben
über ihn werden Sie sehen, Auto Increment.
Sowohl hier nicht anwendbar aber für automatische Erhöhung ist sinnvoll,
für wie Feld eines int, weil die Datenbank wird darauf achten,
des Verfahrens sowie plusing es jedes Mal, wenn Sie einen Einsatz machen.
So daß, selbst wenn zwei Leute buchstäblich klicken Sie auf Absenden
in der gleichen Zeit und versuchen , eine Zeile irgendwie schaffen
in der Datenbank, eines sie wird die Zahl ich werde,
die andere erhalten die Anzahl I plus ein.
Sie müssen sich keine Sorgen machen
zu beiden Ziffern identisch zugewiesen, wenn Sie waren
dies im Code selbst zu tun.
Gut.
Also habe ich gerne, wo wir haben einen Namen zu sein, bekam.
Lassen Sie uns also auf Speichern.
Ist das ein gutes Design für eine Datenbanktabelle?
Und nebenbei, wenn rostig auf SQL oder Sie sortieren
der einfach immer wegschauen Auge auf das, was vor sich ging,
Ich könnte eingegeben haben genau das -
diese drei Linien an, dass Schwarz-Weiß-Eingabeaufforderung
in der Kommandozeile Client oder ich hätte tun können
dass im Code programmgesteuert.
Also alles tut für phpMyAdmin mir ist gerade spart mir die Mühe
der Erinnerung manchmal die Syntax und die Eingabe für
wie langweilig Befehle.
Gut.
Also das fühlt sich nicht wie die beste Design, eine Tabelle ein Feld.
Jetzt müssen wir konnten Dinge wie Professoren
und Standorte und Beschreibungen.
Aber auch dann nur mit Namen
Kurse identifizieren fühlt sich nicht ideal.
Was haben in der Regel wir in der Vergangenheit getan
wenn Sie Datenbanken verwendet haben eindeutig Reihen?
Nicht mit VARCHARs Regel.
Ja?
[Inaudible Bemerkung]
Ja. Also in der Regel ein Kurs-ID.
So ist die häufigste nähern, hier vor allem
, wenn ein Rahmen ist eigentlich nur
, eine Zahl wie eine ganze Zahl zu verwenden.
Also lassen Sie mich gehen Sie vor und tun dies.
Und wir können dies in einer nur wenige tun Weise, aber merken, wenn ich vergrößern
in auf dem Boden hier.
Ich werde sagen, fügen Sie ein Spalten am Ende der Tabelle,
in der Regel nur für die visuelle Bequemlichkeit, die Sie IDs setzen
am Anfang der Tabelle auch wenn dies keine wirkliche
funktionelle Auswirkungen.
Also werde ich sagen, fügen Sie eine Spalten
am Anfang der Tabelle.
Ich werde auf Go, dass gibt mir wieder dieses UI hier.
Nennen wir diese ID.
Wenn wir denken, wir gehen zu müssen nicht mehr getan 4.000.000 Kurse
Feld eines int ist in Ordnung.
Wir könnten sogar schrumpfen es nach unten
aber der Platz ist billig so, wer kümmert sich wirklich.
Aber, wir versuchen zu Facebook jetzt schreiben,
vielleicht nicht schlecht sein große Ganzzahlen rechnen
was uns 64-Bit-Ganzzahlen geben würde
aber dann sind Sie buchstäblich Verdoppeln der Anzahl von Bits,
dass Sie verwenden, so gering Kompromiss
aber etwas zu prüfen.
Nun, dies ist eine verwirrende Vermächtnis Sache.
Sie erinnern sich vielleicht aus der Verwendung von MySQL
dass, wenn Sie einen int deklarieren Feld sehen Sie häufig eine Reihe
daneben wie die Zahl 10.
Es hat nichts damit zu tun, die Größe der Zahl
oder die Anzahl von Bits.
Das hat mit der Anzahl zu tun Zeichen, die verwendet werden,
, um die Anzeige visuell dass int Feld
bei Verwendung eines Terminal-Fenster.
So können wir in einem Moment zu sehen.
Also, nicht in die Irre geführt werden, durch Eingabe von Zahlen
dort, obwohl es effektiv zu fragen uns
für hier.
Hier drüben, ich bin zu gehen gehen Sie vor und sagen, unsigniert.
Es gibt keinen Grund für Abfälle alle unsere negativen Zahlen
da die Datenbank wird in der Regel gehen
positiv anzunehmen, Werte oder null.
Die ID definitiv sollte nicht Null sein.
Und was denken Sie über der Index für diese ID-Feld?
Machen wir es primär.
Also, was wäre, wenn, obwohl, wie ich kann, nur von einem CS164 natürlich denken
in Harvard und nur eine CS50 Platz in Harvard
und das ist ziemlich viel wahr Gesamt
dass es vielleicht Ausnahmen [Unverständlich] beide Semester
oder etwas seltsam ähnlich.
Aber mehr grundlegend, Deshalb ist es besser,
eine numerische ID zu verwenden ist integraler Kurse eindeutig zu identifizieren und nicht
als nur eine eindeutige Zeichenfolge?
Ja?
[Inaudible Bemerkung]
OK, interessant.
Wenn wir also eine Art hatte Quer aufgeführten Kurse.
Also das ist ein gutes Beispiel.
Ich bin mir nicht sicher, ich würde zu lösen, dass, obwohl
indem sie ihnen die gleichen ID-Nummer, wenn das ist
wo Sie wurden mit, dass geht.
Nein? OK. Aber auf jeden Fall ein Ecke Fall zu prüfen.
Wenn es irgendwie - wir brauchen eine Art
Aliasing potenziell.
[Inaudible Bemerkung]
Sicher.
[Inaudible Bemerkung]
Das ist ein gutes Beispiel.
Der Name könnte auf ändern Zeit, völlig vernünftig.
Was sonst?
[Inaudible Bemerkung]
Sorry, noch einmal sagen.
[Inaudible Bemerkung]
Ja, genau.
Also wirklich, das ist der eigentliche Clou ist
dass die Verwendung eines 32-Bit-int wahrscheinlich schneller sein
als einer Variablen Länge char-Feld.
Im ersten Fall wird die Dose buchstäblich passen in ein Register,
nicht viel erwähnen geringerer Speicherbedarf.
Im letzteren Fall, Sie gehen Resort zu tun zu haben [phonetische]
String-Vergleiche, die an sich mit dem linearen
in der Größe der String potenziell.
Also, es ist nur eine nette Optimierung,
insbesondere, es wird
um uns zu tun, was genannt werden Effizienter Joins
in nur einem Augenblick.
Also lassen Sie uns das tun.
Wir werden festlegen, dass Dies ist primär
weil ich nicht besonders wollen oder denken, egal,
über das, was die Anzahl ist eines Kurses.
Lassen Sie sie übernehmen Werte, was auch immer sie wollen.
Ich werde sagen, dass Auto-Inkrement so kann ich dieses Detail auszulagern.
Wie Sie vielleicht in beiseite wissen, dass Harvard
zumindest nicht eindeutige Zahlen für die Kurse.
Ich habe keine Erinnerung was dieser Kurse ist.
Ich weiß, dass der CS50 Katalog-Nummer ist 4949,
völlig willkürlich.
Aber es ist komisch Ecke Fällen, dass auch in
in der registrarial Dump natürlich Katalogdaten,
manchmal Kurse, alte Kurse haben eine Zahl wie 4.
Aber technisch, dass Feld ist ein char-Feld
das beginnt einfach mit 0004.
Also auch hier muss man sein vorsichtig über die Unterscheidung
zwischen Dinge wie ein Natürlich Katalognummer
was einige Menschen haben könnte Vorstellung von fester Länge, 0004,
und Sie nicht speichern sollte daß beispielsweise in einer Ganzzahlen.
Diese Art von Feld sollte ausgelagert werden.
So in Harvard, wenn wir tatsächlich einen Kurs
Shopping-Tool, es ist wahrscheinlich nicht ausreichend,
Nummer Kurse mit nur 1, 2, 3, 4.
Wir sind wahrscheinlich zu haben
um ein weiteres Feld haben genannt Katalognummer,
dass soll auch einzigartige Based sein
auf die menschliche Konventionen hier aber es ist nicht die beste Wahl
eine eindeutige Kennung, weil es könnte variabler Länge sein.
Es ist vielleicht nicht vier sein Zeichen, könnte es fünf sein.
In der Tat, ich glaube, ein paar Vor Jahren haben sie bewegen
Ursache zu fünf Zeichen "es waren mehr als 999 Kurse
insgesamt oder so ähnlich das, oder 9.999 Kurse.
So könnte beispielsweise sein, dass eine wobei das Feld nicht primären
aber es sollte eindeutig sein.
Und E-Mail-Adresse ist eine andere.
Vielleicht möchten Sie es einzigartig zu sein
aber nicht notwendigerweise Ihr Primärschlüssel.
Gut.
Also lassen Sie mich schlagen eine andere Tabelle viel schneller als diese.
Also ich werde das nennen ein Lehrer und ich werde
dies insgesamt geben Anzahl der Spalten der beiden.
Ich werde lernen, mein Lektion vom letzten Mal.
Ich werde rufen die erste Spalte ID.
Ich werde anrufen zweiten Spalte Name.
Ich bin auch zu Varchar zu tun.
Ich nehme mal an, nicht Professor hat einen Namen mehr
als 60 Zeichen, wenn auch Jetzt dieses zu drängen
mit einigen langen Namen, Sonder Menschen mit Mittelnamen.
Das ist gut für heute.
Also lassen Sie blättern hier.
Lassen Sie uns auch in diesem unsigniert.
Lassen Sie uns diese primär.
Und wir werden doppelte Namen erlauben
falls es zwei John Smith oder so ähnlich.
Und jetzt haben wir zwei Tabellen.
So, jetzt stellt sich die Frage, wie kann ich verbinden
in Lehrer mit dem Kurs?
Ich fühle mich wie Art habe vor mir selbst
denn wenn ein Lehrer einen Kurs,
mein erster Instinkt würde eigentlich sein, um zurück zu gehen
Kurse zu realisieren, dies war keine gute Idee.
Lassen Sie mich hinzufügen, eigentlich eine Spalte am Ende der Tabelle,
klicken Sie auf Start, und ich werde nennen diese Instructor.
Und ich werde dieses varchar machen und ich werde diese 60 zu machen.
Und vielleicht werde ich es jetzt null verlassen
im Falle der Kurs nicht Lehrer in unsigned worden
was manchmal passiert, bevor Frist beginnt, und klicken Sie auf Speichern.
Welche dieser Designs bevorzugen Sie?
Zuerst eine, wo wir eine separaten Lehrertisch
oder die zweite, wo wir nur fügen Sie ein Feld auf den Kurs?
Also ist es eine enge Verknüpfung Lehrer mit Kurs.
[Inaudible Bemerkung]
OK. Gut. Aber lassen Sie mich zurück zu schieben.
Es ist nur so einfach, wie ich kann, nur in den Namen der Person eingeben
in dieser Tabelle, wie sicher dass einen Wert hat oder -?
[Inaudible Bemerkung]
Gut.
Nun, lassen Sie mich hier schwierig sein.
Also lassen Sie mich sagen, dass dieser Kurs CS51
und ich weiß, dass es gelehrt in diesem Jahr von zwei Personen.
Also, Henry Leitner und Jesse Tov aber -
so dass ich nur ein Komma setzen zwischen den beiden rechts.
Ich bin wirklich gut im CSV vom vergangenen Jahr.
[Inaudible Bemerkung]
Genau, richtig.
Sobald Sie greifen um so etwas zu,
was vielleicht das Gefühl, angemessen und könnte man glauben,
wie dies Art von smart.
Ich bin Art von Kreditaufnahme ein Idee, die gut funktionieren, ist,
leihen, eine neue Idee und Art kombinieren.
Sie sind Art von völlig besiegen der Punkt, der mit Hilfe der Datenbank
In erster Linie, weil Wenn einer der Werte
der Verwendung ist es eine schnellere Suche aufgrund der verschiedenen Indizes
und Tabellen, können werden für Sie gebaut
von der Datenbank-Engine selbst.
Nun, wenn Sie suchen möchten für alle Kurse
dass Jesse lehrt, haben Sie jetzt zu tun, auf allen passenden Teilstring
der Lehrer Felder,
die effektiv bedeutet lineare erneut zu suchen, weil Sie
um diese beliebige Menge zu finden drei Zeichen überall
in dem Lehrer Feld voran
innerhalb von vielleicht gefolgt durch ein Komma.
Also definitiv Das verheißt nichts Gutes.
Also lassen Sie mich wieder an den Tisch zu gehen.
Lassen Sie mich gehen Sie vor, um Kurse, rückgängig zu machen, dass.
Ich werde einfach gehen vor und legen Sie dieses Feld.
Und wenn Sie wollen, tun dies manuell,
die Syntax ALTER TABLE Kurse DROP Lehrer.
Also lassen Sie uns weitermachen und ja dazu sagen.
Und gehen Sie zurück zu diesem früheren Idee
wo ich einen separaten Tisch für Ausbilder.
Aber jetzt fühlt sich ein wenig wie kann ich einen Kurs setzen
in der Gang- und Ausbilder
in der Lehrertisch, aber ich irgendwie muss die beiden zu verbinden.
Und wie würden Sie schlagen wir das tun?
[Inaudible Bemerkung]
Gut. Also lassen Sie uns das tun.
Und man konnte diese nennen Tabelle in der Theorie nichts.
Ich werde bewusst Nennen Sie es wie viele
von Frameworks würde nennen, unter ihnen,
Laravel wie Sie in etwas zu sehen.
Ich werde es natürlich nennen streichen Lehrer.
Mit einzigartig in dieser Fall für jedes der Worte
und alle Klein wieder, und auch mit dem -
dann alphabetisch sortiert von links nach rechts.
Das ist völlig willkürlich, sondern es neigt dazu, eine Konvention sein
in einer Menge von diesen Rahmenbedingungen in PHP in anderen Sprachen.
Wie viele Spalten brauche ich, das, was wir als eine Join-Tabelle,
zu zwei anderen kommen Tische zusammen?
Drei Säulen?
Welches - welche wären das?
[Inaudible Bemerkung]
OK. Gut. Das funktioniert.
Und wir konnten technisch schnitt eine Ecke hier, aber eine Menge
von Frameworks insbesondere noch geben würde, selbst diese Zeilen
eindeutige IDs, obwohl semantisch die Zeile
dass wir wirklich über-oder die Spalten, die wir uns wirklich
über die beiden letzteren sind von was Sie gesagt haben, der Kurs-ID
und der Lehrer-ID.
Also lassen Sie uns dies tun.
Ich werde diese Reihe nur ID nennen, so wie wir vorher.
Aber diese werde ich Kursnummer anrufen.
Dieses, das ich bin zu gehen Lehrer nennen ID.
Und ich bin zu gehen festlegen, dass alle
von ihnen sind ohne Vorzeichen Denn ich will
meine 4 zu maximieren int Milliarden-Bereich.
Keiner von ihnen sollte null sein.
Ich werde festlegen, dass ID sollte immer noch primär sein.
Und wieder ist dies nur eine Konvention,
eine Vielzahl von Rahmen auch wenn Sie nicht zu sortieren Sie
grundlegend benötigen ein eindeutige Kennung für die Zeile,
es stellt sich heraus, es ist bequem für der Code, der SQL, die gehen
um automatisch für uns erzeugt.
Also werde ich verlassen, dass als primäre.
Aber jetzt, ich Art eine Design-Entscheidung,
Kurs-ID und ID Lehrer.
Welche Indizes, wenn eine sollten sie bekommen?
Wenn ich keine Indizes zu verlassen, was ist die Bedeutung?
Was ist eine Implikation?
Leistung wie vorher, oder?
Wenn es keinen Index, besten Sie tun können, ist eine Art
von [unverständlich] durch die Ganze nach Zahlen.
Damit fühlt sich nicht smart.
Sollte es primär sein?
Also warum nicht?
Warum nicht primär?
[Inaudible Bemerkung]
Perfect. So rollen wir out [phonetische] primär.
Wir haben bereits entschieden, dass.
So sollte es eindeutig sein?
[Inaudible Bemerkung]
Gut. Also, wenn Sie davon ausgehen, ein Lehrer pro Kurs,
völlig in Ordnung.
Und das ist auf jeden Fall der häufigste Fall
aber wir haben bereits ein abschrecken vielleicht bekanntes Beispiel.
CS51 bekam zwei Instruktoren so sind wir Art
der jetzt in diesem Fall eingeschraubt.
Wenn wir das erlauben nur ein Lehrer,
wir könnten tatsächlich einen Weg mit der Join-Tabelle zusammen,
gehen Sie zurück zu den früheren Ansatz
und legte nicht den Namen der Person vielleicht aber der Trainer ID.
Wenn Sie jeden wissen natürlich, wie gerade ein Lehrer Sie können einfach
eine Spalte.
Aber die Variabilität was uns in Schwierigkeiten.
Gut.
So sollte es eindeutig sein?
Nr. Volltext nicht fühlen anwendbar.
Wie wir schon gesagt, das ist
für wie String passenden Beschreibungen.
Und was ist mit Index?
Nun, das ist wohl Index unsere besten Kandidaten
die MySQL optimieren erzählt für die Suche auf diese
oder lassen Sie mich zu erarbeiten, Optimierung für die Suche oder Verknüpfungen
wie wir in nur einem Augenblick zu sehen
so dass sie ein wenig effizienter
als alles, was rein linear.
Will ich Auto erhöht dieses Feld?
Also nein, weil die wahre Eltern-Element existiert
in den Kurstabelle.
Das ist, wo es ist gehen und zu bekommen,
Plus, wenn es tatsächlich eingesetzt.
Hier wird diese alle gehen manuell eingefügt werden
von uns vermutlich im Code.
Lassen Sie uns also einfach angeben dass sowohl die Kurs-ID
Lehrer und ID haben Indizes.
Jetzt werden wir weitermachen und sparen.
Und nun, nur um zu zeigen Sie die Korrespondenz
zwischen dem, was ist ein schönes GUI freundliche Schnittstelle
und die Befehlszeilenschnittstelle.
Lassen Sie mich gehen Sie vor und machen die Folgendes an dieser MySQL-Eingabeaufforderung.
Ich werde sagen, Verwendung courses50
welche die willkürliche Name ist Ich gab zu dieser Datenbank.
Und jetzt habe ich noch nicht einmal daran erinnern, was wir getan haben.
Also lassen Sie mich zeigen Tabellen geben
und in der Regel ein Semikolon Ihr Freund hier
um die Abfrage zu beenden.
Und da ist es.
Also hier sind die Zeilen oder eher die Tabellen, die wir hier haben.
Nun, ich vergessen, was ein Kurs aussieht,
so lassen Sie mich nicht beschreiben Kurse und jetzt sehe ich eine ASCII-Art
oder eine Version von phpMyAdmin tat
und ich sehe, dass ID ist ein int.
Es ist, dass 10.
Was bedeutet das?
Das bedeutet nur, dass, wenn es angezeigt, es wird dauern
bis 10 Zeichen auf das Terminal-Fenster.
Ist es NULL-Werte?
Nein, das ist der Primärschlüssel.
Kann es einen Standardwert?
Nein, und Extra, das besondere ist, Flags wie Auto-Inkrement.
Also lassen Sie uns einfach eine paar Schnellinsertionen hier.
Ich werde gehen zu - sagen wir einfach.
Wir ändern Zustand zu einer Folie
wo ich vor, eine Art von Vorbereitung Diese.
Dies ist eine Zusammenfassung der dann Alle drei dieser Tabellen.
Ich habe schon nur manuell den ersten Befehl eingegeben.
Und hier ging ich weiter und geben Sie die andere für Sie.
Dies ist nur die stilistische Sache.
Im Allgemeinen viele Leute Geben Sie SQL-Anweisungen in allen Caps
und dann Tabellennamen und Feldnamen in Kleinbuchstaben,
wenn auch nur, weil es Art der Stände
heraus, was Ihre Terminologie und was ist der Datenbank-Syntax.
So, hier haben wir drei Tabellen, Kurse, Lehrer,
Kurse und Ausbilder.
In der Folie habe ich im Voraus, Ich habe nicht das ID-Feld haben
aber das ist nicht wirklich eine schlechte Sache überhaupt.
Wir sehen nur eine dritte Spalte gibt.
Hätte ich das getan hier?
So, jetzt lassen Sie mich schlagen vor, wir machen eine Reihe von Einfügungen.
Also hier einige Daten, Ich werde zoomen
Also werde ich vorschlagen dass in den Kursen,
wir nur mit drei Kursen umzugehen.
Und ich wählte diese drei Weil sie repräsentativ sind
einige schöne - sie haben einige nette Eigenschaften.
CS1, CS50, CS51, sie haben steigende IDs
aber was ist das, was ID ist völlig irrelevant.
Das ist nur die Reihenfolge, in der sie automatisch von mir eingefügt.
Wie über Lehrer?
So, jetzt, da Henry Leitner lehrt sowohl CS1 und CS51,
das ist eine Art von einem günstigen Auswirkungen für unser Design.
Und Jesse lehrt CS51 Malan und lehrt CS50.
So, jetzt - oder besser: das sind nur eindeutige IDs dieser Menschen.
Und Kurse und Ausbilder, - Kursleiter, beachten Sie hier.
Platz ID1, die wurde CS1 wird gelehrt
durch Lehrer, die ID1 ist Henry.
Platz ID2, die ich denken gelehrt wurde CS50
durch Lehrer ID2, welche Malan ist.
Und dann schließlich, CS51 und merken wir zwei Reihen zu haben.
Und jetzt das ist, warum die Verbindung Tabelle ist mächtig gelehrt
sowohl von Henry und Jesse.
Also das ist alles schön und gut,
aber ich kann es kaum erinnern von der Spitze
von meinem Kopf, wer wer ist hier.
Wie kann man sich nur befassen sich mit, dass im Code
ohne Festcode Dinge?
Nun, das ist, wo sich SQL beginnt, unser Freund zu werden.
Und ich werde vorschlagen, dass Wir können die folgenden eingeben.
Ich werde dies tun, um in tatsächlichen Aufforderung.
Lassen Sie mich gehen Sie vor und Setzen Sie diese Dinge.
Also, in die Kurse Tisch machen wir genau das, was wir hatten einen
Moment vor.
Ich werde vor und sagen, wir legen CS1 und CS50.
Lassen Sie uns stecken ein paar mehr Zeilen auf einmal, CS51.
Jetzt lassen Sie mich gehen Sie vor und speichern.
Alles klar, so bin ich nur so schnell Neuer
wie ich kann, die Beziehungen wir gerade gesehen, auf dem Bildschirm.
Und so haben wir hier Leitner, hier haben wir Malan.
Machen wir uns geben eine andere Reihe, und Tov.
Jetzt lassen Sie mich dies zu speichern.
Und ich bin ganz bewusst tun sie in der gleichen Reihenfolge.
Nein, ich habe vergessen zu geben Diese Auto-Inkrement.
Lassen Sie mich dies schnell zu beheben.
Ich werde dies in beheben die Online-Code.
Das scheiterte als eine Seite.
Die Tatsache, dass ich nicht konnte einfügen Leitner und Malan
und Tov gescheitert, weil ich nicht angeben, eine ID-Nummer, auch wenn
es erwartet, und ich vergessen, Autoschritt zu überprüfen,
was bedeutet, sie waren alle standardmäßig immer Null.
Aber das widerspricht dann die Eigenschaft, die wir festgelegt haben.
Der Primärschlüssel verletzt wurde so dass es nicht einmal lassen Sie mich es tun.
Also lassen Sie mich dies zu beheben.
Jetzt lassen Sie mich zurück in die Registerkarte Einfügen hier und geben Sie
Ich möchte, dass Leitner, Malan und eine weitere Reihe, Tov.
Und nun schließlich die einzige eine, die ein wenig schwer ist
zu erinnern ist natürlich Lehrer.
Lassen Sie uns nun einfügen, dass Natürlich ID1 Lehrer ID1
das ist also CS1 und Henry.
Platz ID2 ist Lehrer ID2 die CS50 und Malan ist.
Und dann die letzten, die wir haben zu befürchten ist natürlich ID3
die CS51 ist, wird gelehrt,
durch Kursleiter 1, der Henry ist.
Und drei, wie auch gelehrt, von 3, die Tov ist.
Also hoffentlich jetzt wir diese neu erstellt habe -
verdammt noch mal, ich habe die gleiche Sache.
Kursleiter Auto-Inkrement muss.
Gut.
Ich werde dies tun, dieses Mal schneller, Kurs 1, Kurs 1, 2, 2.
Und jetzt endlich, wir CS51 Natürlich hat die ID3 und Henry.
Und natürlich ID3 und Jesse.
Das sieht gut aus.
OK. So, jetzt gehen wir zurück an das Terminal-Fenster.
Also, wenn ich beschreiben Kurse werden wir das sehen.
Wenn ich will, ich kann, um Kurse zu sehen Wählen Sie jetzt tun Sterne von Kursen,
Semikolon, und jetzt wir sehen diese Werte.
Und nun, was sonst will ich tun?
Wählen Star aus Lehrer, das ist, wie ich erwartet hatte,
Sterne und wählen Sie aus Kurse - Natürlich Strich Lehrer.
So wie ich jetzt beitreten diese Tabellen?
So ist die Schönheit der mit gewählt die ID-Werte in dieser Weise ist
dass, wenn Sie denken den Kurs Tisch
und der Lehrer Tisch und dann Einsetzen
zwischen diesen beiden in Ihrem Köpfen der Kursleiter
Tabelle können Sie Art von Linie bis alle diese ID-Spalten
so dass Sie sie in zusammen eine massive Säule, die alle hat
der Informations wir kümmern uns.
Die SQL-Syntax für diese ist nicht unbedingt auf der Hand,
aber mal sehen, ob wir es schaffen können.
So wählen Sie Sterne von Kursen,
und es gibt ein paar Wege wie wir dies tun können.
Ich werde einfach nur Enter drücken Art von Format Dinge schön,
aber das ist nur ein Pfeil Symptom der Client-Seite-Tool
es hat nichts tun mit SQL selber.
So wählen Sie Sterne von Kursen.
Ich werde jetzt beitreten die Kurse Tisch
auf der Kursleiter Tisch.
Wie? Auf dem Feld mit dem Namen courses.id gleich natürlich
streichen Lehrer dot, was der Name
des entsprechenden Feldes hier, dass ich ein paar.
Es ist nicht ID.
Es ist - was, sorry?
>> Kurs-ID.
OK, lassen Sie mich zu verkleinern.
Aber ich möchte zu nehmen noch einen Schritt weiter.
Ich habe jetzt das getan Tisch und diese.
Jetzt möchte ich ziehen dieser Kerl in als gut.
Also, lassen Sie mir weitere kommen diese ganze Sache
auf der Instruktor Tabelle auf was?
Kursunterstrich instructor.instructor ID
gleich instructors.id.
Also haben wir geschrieben haben könnte diese Abfrage in ein paar Möglichkeiten.
Die Reihenfolge, in der ich das tat ist gar nicht so wichtig.
Ich nur irgendwie tat es in meinem Kopf von links nach rechts.
Wir könnten dies getan haben in den paar verschiedene Möglichkeiten
aber wenn ich jetzt die Semikolon und drücken Sie Enter,
bemerken ich wieder eine neue temporäre Tabelle, eine Ergebnismenge
so zu in der Datenbank speak.
Und was muss ich in dieser Sache?
Ich habe auf ID, einen Namen, ein anderes ID, die Art ist verwirrend
für mich im Moment, ein Kurs-ID,
ein Lehrer-ID, ID und Name.
So steht am Ende des Tages wir die richtigen Daten haben jetzt.
Ich kann sehen, dass CS1 wird gelehrt von Leitner, CS51 wird gelehrt
von Leitner und Tov und CS50 wird von Malan gelehrt.
Aber ich bin ein wenig nervös diese Mehrdeutigkeit ich erstellt habe.
Was ist die Mehrdeutigkeit Ich bin in Anspielung auf?
Ja?
[Inaudible Bemerkung]
Es gibt drei ID-Spalten.
So können wir tatsächlich dieses Problem beheben und wir werden eigentlich los
zu unserem Rahmen verschieben letztlich uns dabei zu helfen,
aber es stellt sich heraus, dass es ein Schlüsselwort in SQL genannt S,
in dem Sie angeben können eine Alias, ein neuer Name für ein Feld
so dass wir dies zu vermeiden Mehrdeutigkeit insgesamt.
Aber klar, dass, wenn wir nicht Adresse es irgendwie wie mit
dass Keyword oder ein Rahmen,
es gibt möglicherweise diese Mehrdeutigkeit, wenn Sie versuchen
um die ID-Feld zu gelangen weil klar gibt es diejenigen,
mit doppelten Namen gibt.
Das ist also eine Verknüpfung und ich denke, in Ihrem geistigen Auge der beste Weg,
darüber wirklich denken ist es, die zwei Tabellen zu nehmen,
legen Sie sie in die Weise, die Sie wollen.
Und dies ist ein sogenanntes innere Verknüpfung in dem Sinne,
dass wir die Kombination die Tische hier.
Es gibt andere Arten von Joins, die wir stoßen könnten
im Laufe der Zeit wie äußere Verknüpfungen,
aber zum größten Teil dieser ist wahrscheinlich die häufigste
zum Rekonstruieren von Daten.
Was wir jetzt tun ist in der Regel, was heißt
Normalisierung der Daten, so dass es gibt keine Überschneidungen überall
in Ihren Tabellen.
Und durch Vervielfältigung, würde ich haben, dass erste Ansatz gemeint.
Wenn wir Leitner erwähnt hatte Tov und an mehreren Stellen
in der Datenbank, das ist nicht in der Regel die beste Entscheidung
vor allem, wenn ihr Name Macht Überstunden ändern oder im Falle
der Ehe, Geburtsname Macht ändern sich Sie wollen einfach nur ein
kanonischen Platz für einige Datenwert wie ein Name.
Gut.
Also, zur Erinnerung, wir hatten eine paar Design-Entscheidungen zu treffen
und die wichtigsten wahrscheinlich einige reduziert
dieser Entscheidungen von Indizes.
Aber lassen Sie mich darauf hinweisen, eine andere Sache als gut.
Wenn ich wieder zu phpMyAdmin,
einer Funktion, die Sie vielleicht nicht haben, bevor festgestellt wird
der folgende.
Wenn ich nach Kursleiter, Ich habe bereits festlegen, dass einige
der diese Dinge haben Indizes.
Aber lassen Sie mich auf die Struktur gehen Registerkarte Kursleiter.
Lassen Sie mich nun auf Indizes und beachten Sie die folgenden.
Ich habe hier festgelegt, dass Es ist ein Primärschlüssel
auf der Spalte namens ID.
Dies ist eine etwas komplizierte Art der Angabe Mächtigkeit
und dergleichen als Bezugnahme auf die Größe des Feldes in Byte an.
Aber jetzt habe ich auch eine andere Feld, Kurs-ID, die -
Kurs-ID, die gemacht wird im Voraus und einzigartig, OK.
Ich habe diese in einem voran für uns.
Also, warum ist das - lassen Sie mich fallen dies zum Zwecke der Diskussion.
Ach, wissen Sie, was ich getan habe?
OK. So erwähnt, eine der Gefahren der Verwendung eines GUI-Tool
wie diese, als wir Die Erstellung dieser Join-Tabelle,
die Kursleiterin Tisch, daran erinnern, dass ich angegeben
dass ich einen Index auf diesem Gebiet
und ein Index für diese andere Feld.
Der Nebeneffekt Überprüfung sowohl von diesen Boxen
auf einem Bildschirm ist, dass phpMyAdmin abgeleitet davon,
Ich möchte nicht, dass zwei getrennte Indizes
Ich möchte, dass eine Join-Index, ist in der Regel nur hilfreich
oder sehr hilfreich, wenn Sie Suche auf einem Feld nicht
aber diese beiden Felder.
Und das ist, warum wir sie dort verbinden
so ließ ich es denn, dass war nicht, was ich wollte.
Vielmehr werde ich , dies hier zu wiederholen.
Ich werde den Kurs ID gehen
und unter mehr ich bin nur sagen hinzuzufügen Index.
Und ich werde untergehen Lehrer-ID und sagen hinzuzufügen Index.
Und jetzt, wenn wir hier klicken, Hinweise, die wir haben drei Indizes
eine primäre und wie ich bestimmt einen für jeden
dieser Fremdschlüssel.
Und ich nenne es, weil ausländische Kurs-ID in dieser Tabelle Karten
in welches Feld, nur um zu löschen, in einer anderen Tabelle.
Der Primärschlüssel namens ID, in der Tabelle, die als Kurse,
und die gleiche Sache für die andere.
Aber jetzt, ist eine interessante Trick und Technik wirklich.
Ich ging einfach weiter und lassen Sie mich zu tun, dass ein wenig langsamer.
In dem gleichen Bildschirm, Kündigung es sagt Relation Ansicht hier.
Ich dies klicken und jetzt merke ich, bekommen, ein paar Einschränkungen zu tun.
Also, einer der upsides auch
der nicht nur mit konzeptionell Fremdschlüssel und andere Tabellen
wie wir gerade auf ist dass durch die Festlegung einer Index
auf sie haben kann die Datenbank hilft Ihnen noch mehr
die Integrität des Feldes.
Genauer gesagt, kann ich jetzt angeben, über diese Tropfen
nach unten, dass der Kurs-ID-Feld
in dieser Tabelle tatsächlich Karten auf den courses.id.
Ebenso Lehrer Strich ID zugeordnet instructors.id.
Nun, warum ist das sinnvoll?
Nun, bemerken, die auf der rechten Seite, was jetzt erscheint.
Jetzt kann ich lehren, die Datenbank, wenn Henry
zum Beispiel immer in den Ruhestand und seine Reihe verschwindet
aus dem Lehrertisch insgesamt dadurch in der
gelöscht, kann ich über diese Kaskadierung Ansatz zu gewährleisten
dass alle Kurse, die er lehrt, sind nicht mehr mit ihm verbunden.
Ich kann die Datenbank lehren um die Zeilen löschen
in diesem sogenannten Join-Tabelle automatisch, wenn Henry oder wenn ein
seiner Kurse verschwindet.
Nun, warum ist das überzeugende?
Ja?
[Inaudible Bemerkung]
Sie müssen es nur einmal tun und längerfristige, nicht wahr?
Es ist sehr einfach, wenn Art Menschen kommen und gehen, kommen Kurse
und gehen, Ihre Datenbank konnte nur mit Kursen übersät bekommen
und mit Dozenten, die keine sind mehr relevant für den Datensatz.
Und Ihre Daten beginnt um sehr chaotisch und schmutzig und abgestanden,
und so können wir hier sortieren
Durchsetzung von einigen diese Einschränkungen.
Ja?
[Inaudible Bemerkung]
Es weiß über diese.
Dies ist der Bildschirm, auf dem Wir Angabe eines Verbindungs
zwischen Fremdschlüssel und Primärschlüssel.
Also alle von der Namensgebung Konventionen ich angespielt
früher sind nur Konventionen.
Es gibt keine inhärente Bedeutung.
Dies ist der Bildschirm was nur nützlich ist,
nach der von Ihnen angegebenen Indizes auf jedes dieser Felder wie wir.
Und aus diesem Dropdown wir ein paar Dinge, zum Beispiel
wenn ein Kurs gelöscht du kannst tatsächlich verhindern, dass die Deletion
passiert, wenn es ist eine Zeile in dieser Tabelle
durch nur sagen, beschränken.
Mit anderen Worten Henry kann nicht in Rente gehen
bis wir ihn zu entkoppeln von CS51 und CS1.
Also das ist eine gute Sache.
Aber es auslösen könnte Fehler im Code
wenn Sie nicht davon aus, dass oder wir können eine Kaskade haben,
eine Kaskade ähnlich wie Cascading Style Sheets
und die Kaskadierung Wasserfall bedeutet, dass, wenn ein -
wenn Henry zieht sich so - durch immer gelöscht
so wird seine Reihe hier gelöscht.
Keine Aktion bedeutet nichts oder null ist eine Art nützlich, wenn Sie Art
wollen einige der historischen Rekord von Henry gelehrt hat CS51,
aber Sie wollen einfach nur das Feld, um null, so dass die Reihen gibt
aber es ist nicht mehr mit ihm verbunden.
Das sind also sehr mächtig Techniken, die Sie
und sollte, obwohl verwenden im Interesse besonders
sparen Sie sich.
Also lassen Sie mich erwähnen ein paar letzte Details hier
Zutaten, mit denen das könnte hilfreich sein
wie wir planen für Datenbank-Design.
Sie haben auch Wahl über die Datenbank-Engine
, dass Sie in Ihrem Code.
Wenn Sie vertraut sind von CS161 Sie vielleicht -
oder sogar 61, könnte man in der Regel sein mit Dateisystemen vertraut.
Und es gibt Dinge, wie, NTFS und HFS +
und X2FS4 [phonetische] und 3 und so weiter.
Es gibt verschiedene Möglichkeiten, der Speicherung von Daten auf dem Schreibtisch.
Ebenso sind dort unterschiedliche Arten von Daten speichert
in einer Datenbank standardmäßig zumindest in der Appliance
mit der neuesten Version von MySQL.
Wir haben mit der Datenbank-Engine genannt, NODB,
das unterstützt ein einige nette Features.
Aber ein anderer häufigste ist auch genannt MyISAM und noch ein
dass sein Einsatz ist Erinnerung, was bedeutet, dass Sie keine Gegenstände
auf der Festplatte, nur halten Dinge in Erinnerung.
In den meisten Fällen werden Sie wahrscheinlich wird nicht schief gehen gerade erst
mit NODB, aber für alle Projekte , die hohen Preise beinhalten neigen
Einschub zum Beispiel wie viele schnelle Protokollierung,
Hunderte von Dingen pro Sekunde oder Tausende von Dingen.
Jederzeit haben Sie ein viele Sachen passiert
auf in der Datenbank dann dieser Arten
der unteren Ebene Entscheidungen beginnen sich zu engagieren.
Der Volltext-Funktion für Beispiel nur in MyISAM funktioniert
so dass eine Implikation hat.
Aber Sie können diese erinnern, lassen Sie uns zumindest motivieren, warum wir kümmern
über NODB im Besonderen.
Ein Rennbedingungen Regel bezieht sich auf was?
Alles klar, das ist eine Anspielung auf ein Beispiel, einige
von Ihnen vielleicht gehört haben, in vergangenen Jahren, ob 161 oder 50
wo man einen Mitbewohner, Sie beide wirklich gerne Milch,
einer von euch nach Hause kommt, öffnet zuerst der Kühlschrank gibt es keine Milch,
schließen Sie den Kühlschrank Spaziergang über Straßen, um CVS und erhalten
im Einklang, um Milch zu kaufen.
Inzwischen Ihre Mitbewohner hier kommt wieder.
Sie mag auch Milch.
Öffnen Sie den Kühlschrank und erkennt keine Milch.
Hier geht sie dann auf die speichern, vielleicht das andere CVS.
Schneller Vor wenigen Minuten später kommen Sie zurück und jetzt sowohl
von euch Milch gekauft haben.
Einer von ihnen wird jetzt zu verderben, weil Sie nicht tun
wie Milch, die viel und dies ist ein Problem, oder?
Da beide von Ihnen geprüft der Zustand einer Variablen
und machte eine Entscheidung auf der Grundlage auf sie, auch wenn der Staat
dieser Variablen im wesentlichen in dem Verfahren verändert,
alle werden es langsam über die Menge an Zeit, die
zu und von CVS zu bekommen.
Also, was ist eine Art dumm Echt Welt Lösung für dieses Problem?
Lassen Sie eine Notiz, oder?
Es ist letzten Mal passiert ist.
Lassen Sie immer eine Note oder Vorhängeschloss, die Sache wörtlich.
Und ich sage, Vorhängeschloss, weil nehmen, wenn Sie zu tun oder hat CS161,
Verriegelungs ein Grund Idee, in dieser Art von Welt.
So Rennbedingungen entstehen können, auch in der Datenbank Welt
und man könnte vielleicht von erinnern CS50 finanzieren, wenn Sie dauerte 50,
dieser Code, die wir tatsächlich gab euch in der Spezifikation
zu der Zeit, so dass Ihre Betrieb wird so genannt, atomar.
Wenn Sie in diese wollte Fall kaufen eine Aktie
und das Lager hat einige bestimmtes Symbol.
Wir haben euch gesagt, Code wie verwenden das, weil durch diese
auf doppelte Schlüssel Update Syntax, die gebaut wird
in MySQL Sie effektiv sind dabei entweder im Einsatz
oder Update nach dabei eine Option, um zu sehen
wenn eine Aktie ist bereits drin.
In anderen Worten, die analogen die Welt der Kauf einer Aktie
Milch und den Kühlschrank könnte den ersten,,
vor dem Kauf einen Anteil von Google möchten Sie vielleicht wählen
aus der Datenbank alle der Aktien von Google, die David besitzt
zu sehen, ob er besitzt null oder mehr.
Sobald Sie sehen, wenn er besitzt null oder mehr haben
dann folgendes tun.
Sie müssen entweder einen Einsatz machen
wenn er Null "Ursache besitzen es gibt keine Zeile für David noch,
oder Sie ein Update zu tun haben wenn zumindest theoretisch gewünschten
einer Zeile pro Benutzer haben.
Das Problem ist die Auswahl dass Anzahl der Aktien
und dann die Aktualisierung oder Einfügen unterbrochen werden
von einer anderen an eine andere Computer-Terminal versuchen zu kaufen
oder einige von Davids verkaufen Aktien von Aktien, ob
für gute Zwecke oder Art von bösartigen Zwecken.
Es ist wie in den Laden wenn Ihr Mitbewohner bekommt wieder
und prüft den Zustand der Variablen.
Also diese Syntax zu der Zeit welche Art von angemessen war
für CS50, verhindert, dass Problem insgesamt.
Und es funktioniert einfach all das Magie der Sperr für Sie,
aber jetzt mit solchen Projekte für diesen Kurs
was sehr wahrscheinlich beinhalten mehr komplexe Datensätze,
Sie nicht erreichen können immer diese Unteilbarkeit.
Alles geschieht auf einmal oder überhaupt nicht
ohne Unterbrechung so elegant.
Und so MySQL, ein weiterer Datenbank-Engine,
Unterstützung Dinge genannt Schlösser,
wobei Sie sagen, das Schloss Tisch, so dass nur eine Behandlung
und in der Regel nur ein Benutzer kann berühren, in jedem Zeitpunkt
zu lesen oder zu schreiben und dann können Sie es entsperren.
Dies ist ein Beispiel von einem MySQL-eigenen Referenzen,
wo, wenn Sie wie eine Bank haben Konto, das Sie versuchen,
Geld von abziehen und dann Geld in den.
Sie könnten zu wollen stellen Sie sicher, dass sowohl
diese Dinge zusammen kommen
so dass es keinen Rechenfehler
und niemand Verluste Geld, irgendwie.
Das Problem mit Schlössern wenn in einer Datenbank
dass es in der Regel bedeutet, die ganze Tabelle gesperrt,
was bedeutet, wenn Sie hundert Menschen, die versuchen
das Geschäft mit Ihrer Bank zu tun online unter der gleichen Menge
Zeit nur eine der sie können in einer Zeit, zu gehen.
Welche ist dumm, vor allem auf Servern heute
Natürlich, der acht, 16 haben Natürlich haben eine riesige Menge
der Erinnerung, es gibt keine Grund, um alle serialisiert
Ihre Transaktionen, wenn diejenigen, Kunden sind nur gehen
mit ihren eigenen Reihen zu interagieren.
So NODB können Sie tun Dinge intelligenter
und dies in der Regel werden der Ansatz, den Sie im Code zu nehmen,
wie Sie etwas verwenden rief die Transaktion.
Und Sie tun dies in der Regel in PHP-Code,
Ruby-Code, Python, was auch immer.
Aber der SQL-Code, ist letztendlich verwendet wird, ist dies,
Regel.
Starten Sie die Transaktion dann angeben, zwei oder mehr Abfragen
Sie wollen insgesamt führen
ohne Unterbrechung oder nicht.
Es kann sogar sein, einige SELECT-Anweisungen in
oder einige Löschungen oder Updates.
Aber das Schöne daran ist, dass die Datenbank wird klug genug sein
, um sicherzustellen, dass es nur sperren die Zeilen sie tatsächlich
Aktuelles in diesem beteiligt oder wählt oder löscht.
Also, wenn du Tausende von Zeilen und du bist nur zu berühren drei
von denen nur die Teilmenge der Tabelle wird gesperrt
was bedeutet, dass die anderen 99 Kunden können ihre Reihen berühren
ohne serialisiert und unten von Ihnen verlangsamt.
Unterdessen ist dies der schönsten Aspekt, um Transaktionen.
Sie sind Transaktionen in ein spüren, wie 161 in einem Dateisystem,
sie sind Transaktions
was bedeutet, Sie rollen kann sie zurück, können Sie sie rückgängig zu machen.
Das ist wie der Befehl oder-F von Datenbanken.
Wenn Sie einen Teil entdecken Weg durch alle
Ihrer verschiedenen Datenbetrieb, schießen, ist etwas schief.
Sie buchstäblich ausführen ein verschiedene SQL-Abfrage Rollback
und alle diese Trend - alles der Anweisungen, die Sie ausgeführt
nachdem er Anfang Transaktion verschwinden
als ob sie noch nie passiert,
welche ein erstaunlich ist mächtige Sache.
Und das sind die Arten von Dinge sicherlich in 50 sortieren wir
der unter den Teppich zu kehren und Sie nur irgendwie davon ausgehen,
dass alles gut sein wird.
Aber sobald Sie anfangen Nachdenken über reale Projekte
und echten Benutzern und die Integrität der Datenbank,
Dies sind die Arten von Design-Entscheidungen
, die gehen, wichtig zu sein.