>> Tous droite.
Alors, sans plus tarder, SQL, Structured Query Language.
Donc, vous avez probablement utilisé ce à moins CS50, peut-être dans CS165,
peut-être dans votre propre projets personnels.
Et qu'est-ce que SQL vous permettent de faire, dans un serveur SQL Server plus généralement?
Ouais?
[Inaudible Remarque]
OK, c'était très de manière sécurisée de le dire.
Oui. Ainsi, il permet de stocker des données
et permet surtout d'interroger des données.
Et c'est un pas en avant
d'utiliser quelque chose simple comme un CSV, à droite.
Comma Separated Variables.
Valeurs similaires.
Laissez même vous enregistrez informations d'une rangée
dans un fichier texte.
Mais ce qui est l'inconvénient d'un Fichier CSV pour stocker vos données,
même si vous efficacement obtenir des lignes et des colonnes de lui?
Ouais.
>> Vous n'avez pas 'avez la même organisation
efficacité [inaudible].
>> Vous n'avez pas la même efficacité de l'organisation.
Que voulez-vous dire?
>> Eh bien, comme [inaudible] avoir comme principal [inaudible].
>> OK. Ouais.
>> C'est une base de données relationnelle vous pouvez avoir plusieurs bases de données
liés les uns aux autres de façon très spécifique.
>> OK. Bon.
>> C'est [inaudible] pour définir un fichier CSV.
>> Et permettez-moi de bidouiller un peu de terminologie.
Donc, plusieurs tables dans une base de données, bien sûr,
et qui va au-delà de ce que vous pouvez faire avec un seul CSV.
Mais vraiment la limitation avec CSV je dirais est
que l'inefficacité de tout cela.
Il est très facile de mise en page.
Mais si vous voulez faire un requête, ce qui est le temps d'exécution
de toute requête de sélection sur un fichier CSV?
Je veux dire que c'est grand vieux [inaudible], droite, parce que dans le pire des cas,
ils ont augmenté tout au fond.
Même si vous aviez trié l'ensemble Fichier CSV, si vous ne savez pas
que dès le départ, bien, vous allez encore avoir
à chercher le tout.
Ainsi, parmi les choses nous allons obtenir
à partir de l'utilisation d'un véritable base de données en utilisant un langage
comme SQL est que nous pouvons interroger et nous pouvons à l'avance
en tant que concepteurs de bases de données préciser quels sont les domaines
qui ont été probablement devoir questions concernant sorte que les gens
à MySQL ou Microsoft ou Oracle,
celui qui a fait la base de données vous utilisez peut faire tout
du travail de déterminer, OK,
donné un million de ces IDS.
Comment pouvons-nous la mise en page - -les dans la mémoire?
Certains type d'arbre structurer peut-être,
de sorte que lorsque vous faites fait exécuter Select,
c'est quelque chose qui est logarithmique ou logarithmique
de logarithmique dans le temps plutôt que réellement déléguer
en quelque chose de linéaire.
Donc, nous avons eu beaucoup de la performance de cette façon.
Et nous pouvons également stocker beaucoup plus données plus facilement «provoquer le SQL
Server est généralement stocké dans la RAM, même si les parties
de celui-ci peut être stockée sur le disque et vous le savez probablement déjà
que la RAM est généralement plus rapide que les disques,
de sorte que c'est une bonne chose.
Et nous pouvons également traiter concurrence beaucoup mieux.
Si vous avez pris 165 ou 161, vous savez que si deux personnes essaient
à faire la même chose à la fois sur un système,
mauvaises choses peuvent généralement se produire.
Donc, parmi les autres fonctionnalités que nous peut obtenir si nous concevons nos tables
dans le droit chemin est meilleure prise en charge et de la sécurité
quand il s'agit de simultanéité.
Ainsi, deux personnes en deux parties
du monde en utilisant le même site Web, si elles essaient tous deux
acheter quelque chose à la même temps, cet ordre ne va pas
d'aller en même temps.
Quelque part, ils seraient sérialisés par quelqu'un d'autre que notre propre -
quelqu'un d'autre que nous-mêmes.
La volonté de base de données le faire pour nous.
Alors, quand il forme la plus simple,
SQL nous permet requête une base de données relationnelle.
Une base de données relationnelle est un qui a une
ou plusieurs tables, il généralement.
Et s'il s'agit d'un peu familier,
vous pouvez vraiment il suffit de penser de ce que Excel ou numéros
ou des feuilles de calcul Google.
Il vient lignes et de colonnes et généralement au sommet de chaque
de ces lignes a un nom.
Donc, cela pourrait être l'ID colonne, la colonne de nom,
la colonne d'adresse et ainsi de suite.
Et puis vous pouvez avoir plusieurs ces tables si vous voulez
de commencer à jeter sur différents types de données.
Mais vous souvenez peut-être au moins de CS50 que nous avons essayé
pour vous donner une interface graphique d'un outil [inaudible]
pour gérer votre base de données.
Il a été appelé phpMyAdmin.
Donc, c'est juste une coïncidence que il a été écrit en PHP, vraiment,
mais il était basé sur le Web seulement avant fin à une base de données.
Et via les différents onglets et des liens, pourriez-vous commencer
configurer une base de données pour vous-même.
Mais un bon outil pour commencer à obtenir un peu plus à l'aise
est également à l' client de ligne de commande.
Donc, si vous utilisez l'appareil de CS50 ou bien en utilisant n'importe quel macro PC
qui a un MySQL en ligne de commande client, vous pouvez également faire de tri
de la vieille école, comme ça.
En passant le projet MySQL, au moins la version open source
de celui-ci est maintenant appelé MariaDB pour diverses raisons, vous pouvez lire
sur Wikipedia mais c'est le même logiciel,
c'est la même syntaxe et ainsi de suite,
à peu près la même base de code.
Et quand je suis à ce soufflerai je peux maintenant interagir
avec ma base de données beaucoup plus manuellement.
Donc cas au point, laissez-moi aller de l'avant
et il suffit d'ouvrir une fenêtre de terminal.
Je me trouvais à l'aide de la CS50 Appareil mais vous pouvez le faire
sur la plupart des systèmes en que vous avez le droit
logiciel installé.
Et je vais faire mysql-u pour nom John Harvard
sur ce système particulier,-p pour un mot de passe que je vais taper
à un peu plus en toute sécurité en appuyant sur Entrée.
Maintenant, je suis invité.
Je vais taper cramoisi dans l'appareil de CS50
et maintenant je vois essentiellement que le même écran.
Mais il ya maintenant des commandes que nous pouvons commencer à taper
comme montrer les bases de données, et qui va me montrer tout
des bases de données que j'ai déjà créé dans le système,
à peu près la même liste vous verriez dans phpMyAdmin.
Il ya quelques autres comme schéma d'information et d'essai,
qui, si vous fouillez le CS50 Appliance, nous cacher quelque
de ces tables de niveau inférieur
mais ils ont été il tout ce temps.
MySQL a effectivement faible niveau propriétés comme les noms d'utilisateurs
et les mots de passe pour la base de données lui-même, pas pour votre application
que vous seriez peut-être fonctionnant au-dessus de celui-ci.
Donc, à l'avance, aujourd'hui, je créé quelques bases de données,
dont l'une est appelée courses50.
Les chances sont certains d'entre vous ont utilisé cours de CS50 outil de shopping,
qui est une grande interface pour le catalogue de cours de l'enregistrement.
Et c'est en fait une belle données à parler parce que,
un, nous sommes en quelque sorte tous évidemment familiarisés avec les cours
et les instructeurs et réunion lieux et tous le genre
des choses ordinaires de l'université,
mais il a également obtenu un certain opportunités intéressantes
pour la conception.
Donc nous avons pensé utiliser la notion d'un catalogue de cours
et un outil commercial comme un exemple tout au long aujourd'hui pour trier
de cadrer une partie de la conception décisions que nous avons à faire.
Commençons donc là.
Supposons que je voulais réellement pour représenter le super simple
bien sûr des outils achats.
Et le monde simple Je peux imaginer et celui-ci est
dans lequel il existe des cours et il ya des instructeurs.
Et supposons à l'intérêt de la discussion
que tous les cours a au moins un nom.
Commençons donc à esquisser cela.
Je vais utiliser phpMyAdmin comme une commodité,
donc nous n'avons pas à taper toutes les requêtes manuellement.
Mais ici, je suis dans mon courses50 base de données.
Si vous ne connaissez cela, ça va être très facile une fois que vous plongez
à votre propre projet si vous souhaitez l'utiliser.
Je vais créer un table appelée Cours
et je ne peux que penser d'un champ
pour l'instant, le nom d'un cours.
Je vais aller de l'avant et dire me donner une colonne.
Maintenant, si vous vous souvenez que vous obtenez une interface qui est un peu
comme ceci.
Et l'autre à l'envers franchement de phpMyAdmin est qu'il sorte
d'auto-instruction et que via les listes déroulantes, vous pouvez trier
de voir ce que votre possible les décisions de conception sont.
Donc, je vais donner chaque cours un nom.
C'est le nom de cette colonne.
Et que diriez-vous de son type de données?
La plupart d'entre vous doivent connaître à moins certains de ces types de données
de l'expérience avant.
Ce qui est approprié pour le nom du cours?
Sharon?
>> Varchar.
>> OK, varchar qui est variable Char.
Et qu'est-ce que dire plus techniquement?
[Inaudible Remarque]
OK. Donc, c'est une chaîne.
Et l'aspect le var de celui-ci implique quoi?
Variable. Mais ce qui ce que cela signifie?
Ouais?
[Inaudible Remarque]
Exactement. Il s'agit donc d'une variable nombre de caractères
dans la chaîne vers le haut dans une certaine maximum.
Alors, voici notre première décision de conception.
Nous avons fait de décider le nombre d'octets au maximum
à allouer à chaque chaîne.
D'une manière générale, vous voulez sorte de ne pas rendre trop petit,
pas rendre trop grand 'Cause évidente
si elle est trop petite, vous êtes juste va commencer à tronquer des données
et vous allez perdre des informations.
Et si elle est trop grande, vous êtes juste sorte de dire la base de données
d'attendre et de optimiser pour plus de données
qu'il pourrait en fait jamais obtenir.
Alors, quel est le sentiment raisonnable numéro du nom d'un cours?
60? OK, donc 60.
Cela semble assez raisonnable
tant est qu'il n'y a pas exceptions à cela.
Il n'ya vraiment pas dur, règle rapidement.
Pour être honnête, pour raisons historiques beaucoup
des gens vont choisir 255 'Entraîner pour les années qui était de tri
de la valeur maximale par défaut en utilisant 8 octets - 8 bits que votre compteur.
Je ferais plus [inaudible] pourrait utiliser des puissances de 2
mais c'est un peu hors de propos.
Donc, nous pouvons aller avec 60.
Cela semble raisonnable si longtemps
comme nous l'avons finalement ne le regrettons pas Parce que c'est une limite supérieure.
Maintenant, supposons le contraire décision avait été prise,
caractères variables, mais pas juste le champ char.
Donc, contrairement à C et C + +, char ne signifie pas un omble
et bases de données signifie généralement un nombre fixe
de caractères dans une chaîne.
Quelle serait la hausse et / ou inconvénient de mon choix 60
pour un champ de char, au lieu de varchar?
C'est exactement le premier type de la décision que vous aurez à faire
lors de l'inspection [transcription phonétique] sur de projeter avec vos partenaires.
Ouais, Sharon à nouveau.
[Inaudible Remarque]
Bon. Donc, si le nom est moins
de 60, alors vous perdez tout ce que le delta est
entre 60 et l' longueur réelle.
Alors qui se sent juste un gaspillage, plus d'octets que vous avez besoin.
Mais pourquoi est-il exister?
Il ya sûrement un peu à l'envers.
Ouais?
[Inaudible Remarque]
Bien sûr. Donc, parfois, vous pourrait connaître le nombre fixe
des personnages comme 10 chiffres pour un numéro de téléphone, par exemple.
Mais qui s'en soucie, comme pourquoi pas simplement dire 11 de toute façon
ou pourquoi ne pas dire 60 de toute façon avec le varchar?
Quel avantage pouvons-nous en connaissant et en conception
pour un nombre fixe de caractères?
[Inaudible Remarque]
Vous êtes sur la bonne voie.
C'est donc l'optimisation mais c'est vraiment de - ouais?
[Inaudible Remarque]
OK. Bon. Faisons attention sur cette dernière partie.
Donc indexation.
Ainsi, il s'avère si vous savoir à l'avance que tout
de vos domaines vont être de 60 caractères,
vous pouvez vraiment penser à ce colonne dans la base de données Excel
comme ayant très simple, justifié à gauche
et bords justifiés droite
parce que chaque colonne est de 60 caractères larges.
Cela signifie que ce chaîne est de 60 caractères à l'extérieur
de cette chaîne, 60 caractères à l'extérieur de celui-ci
et celui-ci et à celui-ci.
Ainsi, tout comme en arrière quand vous appris C, vous aviez accès aléatoire
dans le monde des réseaux, même idée ici.
Si votre colonne est représentée en utilisant les caractères de longueur fixe uniquement,
vous pouvez effectivement index de manière aléatoire à 60 ou 120 ou 180
et vous pouvez obtenir à individuellement cordes beaucoup plus rapidement.
Ensuite, si la place, la colonne avait un bord gauche droite pour ainsi dire
mais un droit très robuste bord de la colonne
car vous pourriez avoir 10 caractères,
15 caractères, 5 caractères.
Donc, cela aussi est un compromis.
Et parfois seulement par essai et erreur
et l'expérimentation pouvez-vous comprendre
ce qui est vraiment le bon choix est, mais ce sont les types
de questions qui devrait aller
dans vos esprits et / ou tables lorsque vient le temps
de concevoir votre base de données.
Donc, pas nécessairement droit répondre, mais vous devriez
au moins avoir une certaine phrase ou deux à l'esprit
sauvegarder tout ce qui décision que vous prenez.
Très bien.
Donc, nous allons continuer à faire défiler dans les instructions ici
qui sont l'interface utilisateur de phpMyAdmin.
Ainsi, la valeur par défaut de un nom, dois-je préciser
qu'il devrait être encore la valeur null par défaut?
Que pensez-vous?
Un cours peut avoir un nom null?
Juste se sent bizarre, non?
Je ne peux pas penser à tout cours sans nom à Harvard.
Et peut-être il ya une certaine obscure affaire d'angle
où un cours est donné un certain nombre
et le professeur n'a pas choisi un nom pour elle, mais -
Je veux dire, au diable que,
comme il ne faut pas même peine soutenir que.
Je dirais dans l'intérêt d'une belle base de données propre,
Précisons que vous ne pouvez pas avoir une valeur par défaut null.
Sinon, nous pourrions faire quelque chose comme sûr sans titre
ce qui n'est pas contrairement à Mac OS et Windows faire
lorsque vous créez un dossier, par exemple,
mais il fait que un peu plus de sens
de sorte que l'humain voir quelque chose.
Nous parlons d'un base de données back-end sans doute
pour le catalogue de cours.
Donc, je n'ai pas vraiment même comme l'idée de lui donner
dans les noms de cours sans titre
car ce n'est pas vraiment va aider personne.
Laissons donc ce que rien, ce qui signifie que lorsque vous insérez
dans cette base de données, vous avez de donner à chaque cours un nom
qui se sent un peu propre à moi.
Très bien.
Donc défilement outre, la collation.
Cela a juste à voir avec jeux de caractères et autres joyeusetés
si vous avez jamais vu mentions de suédois
phpMyAdmin c'est «Provoquer les gens
qui a écrit phpMyAdmin étaient suédois.
Est-ce que PHP ou MySQL est-il?
L'un des deux, je oublié désinvolte.
Mais c'est pour des raisons historiques
mais vous pouvez exprimer toutes les caractère en anglais
que vous pouvez faire avec la Suède il est donc en grande partie un non-problème.
Le CS50 Appliance est bien utilisé - configuré pour utiliser UTF-8,
de sorte que en général le cas pas apparaître pour vous.
Attributs.
Donc, aucun de ces vraiment pertinent ici.
Je vois binaire, non signé, Zerofill non signé,
et sur la mise à jour timestamp courant.
Ce champ s'applique uniquement pour un champ numérique
ou certains champs de temps.
Donc, nous allons sauter que entièrement.
Null. Ce domaine peut être nul?
Donc pas. Nous avons déjà ce genre de conversations.
Donc, nous ne voulons pas une valeur par défaut.
Nous ne voulons pas qu'il soit nul.
Qu'en est-il l'indice?
Il ya quatre choix ici.
Qu'est-ce que cela signifie si nous spécifions
que cette ligne va être une clé primaire?
En repensant à CS50 ou CS165 si vous l'avez pris.
[Inaudible Remarque]
Exactement. Ainsi, une clé primaire par définition, est le champ
qui identifie chaque ligne de ce tableau.
Et vous pouvez compter sur lui pour faire que l'identification unique.
Alors, qu'est-ce que cela signifie alors simplement d'être unique?
Eh bien, en quelque sorte ces deux a en quelque sorte
de sous implications sous la hotte.
Mais en général, la clé primaire est une sorte de contrat que vous faites
avec la chose de base de données.
Quand je fais des requêtes à la recherche d'un cours,
Je vais utiliser cette domaine particulier.
Et nous y reviendrons pourquoi nous pourrions avoir deux
ces choix ici, primaire ou unique.
Unique dit juste, ce domaine va être unique
mais je ne suis pas vraiment faire tout type d'engagement verbal ici
d'utiliser ce domaine à faire mes recherches
pour des raisons que nous allons voir dans un instant.
Si nous précisons la place index, qu'est-ce que cela signifie pour spécifier
qu'un champ a un indice sur elle?
Ouais?
[Inaudible Remarque]
Exactement. Il a été optimisé pour la requête.
Ainsi, vous - serveur de base de données, Oracle, MySQL, que ce soit,
sera généralement travailler sa magie dans les coulisses une fois que vous cliquez sur
cette option puis cliquez sur Sauvegarder et il va construire
jusqu'à typiquement une structure arborescente, B-trees si vous avez vu
ou entendu hors ce qui est un très court arbre de regard
qui vous donne très agréable propriétés logarithmiques
lors de la recherche sur les données.
Si vous ne spécifiez pas d'index sur un terrain, ce qui se passe
d'être le fonctionnement temps de recherche
pour un arbitraire [Transcription phonétique] Nom du cours?
Qu'est-ce que c'est?
[Inaudible Remarque]
Oh, [inaudible], linéaire, non?
Si il n'existe aucune optimisation accordée à la base de données
et vous n'avez pas pensé la base de données ce genre
de données à attendre.
Le mieux que vous pouvez faire est de vérifier tout quand vous êtes à la recherche
pour une certaine valeur, en particulier si il pouvait
en fait être des doublons.
Texte intégral en attendant, nous allons agiter les mains pour le moment.
Mais en général, il s'agit d'une type d'index qui vous permet
pour optimiser les mots clés Recherches sur un champ.
Donc, ce serait peut-être un bon candidat
pour comme une description de cours où vous pourriez avoir un couple
des paragraphes et vous pourriez envie de faire des correspondances de sous.
Texte intégral sera généralement laisser vous faites cela assez efficace.
AI, c'est une sorte horribles d'explication, mais si nous planons
dessus, vous verrez Auto-incrément.
Non applicable à la fois ici mais incrémentation automatique est utile
car, comme le champ d'un int car la base de données prendra soin
du processus de plus les plusing chaque fois que vous faites un insert.
De sorte que même si deux personnes littéralement cliquez sur Envoyer
en même temps, et essayer de créer une ligne d'une certaine manière
dans la base de données, l'un des les obtiendront le numéro I,
l'autre obtiendra Je le nombre plus 1.
Vous n'avez pas à vous soucier
environ deux nombres étant attribué à l'identique si vous étiez
faire vous-même dans le code.
Très bien.
J'ai donc un peu comme lorsque nous avons un nom à être.
Donc, nous allons cliquez sur Enregistrer.
Est-ce une bonne conception pour une table de base de données?
Et en passant, si rouillé sur SQL ou vous triez
de toujours se tourner juste un aveugle oeil à ce qui se passait,
J'aurais pu taper exactement cela -
ces trois lignes à ce que invite en noir et blanc
dans la ligne de commande client ou j'aurais pu faire
que dans le code programme.
Donc tout phpMyAdmin est fait pour moi, c'est juste moi sauve l'effort
de se souvenir de la parfois syntaxe et taper pour
comme les commandes fastidieuses.
Très bien.
Donc, cela ne ressemble pas à la meilleure conception, une table d'un champ.
Maintenant, nous pourrions avoir des choses comme professeurs
et les emplacements et les descriptions.
Mais même alors, en utilisant le nom que
d'identifier des pistes ne se sent pas idéal.
Qu'est ont généralement nous avons fait dans le passé
si vous avez utilisé des bases de données pour unique les lignes?
Ne pas utiliser varchars généralement.
Ouais?
[Inaudible Remarque]
Ouais. Donc, généralement un ID de cours.
Ainsi, la plus courante aborder ici en particulier
lors de l'utilisation d'un cadre est en fait juste
d'utiliser un nombre comme un nombre entier.
Alors laissez-moi aller de l'avant et le faire.
Et nous pouvons le faire dans quelques moyens, mais si je zoome avis
sur le bas ici.
Je vais dire ajouter un colonnes à la fin de la table,
généralement juste pour visuel commodité, vous mettez ID
au début de la table même si cela n'a pas de réelle
impact fonctionnel.
Donc, je vais dire ajouter une colonne
au début de la table.
Je vais cliquez sur OK, que me redonne cette interface ici.
Appelons cette ID.
Si nous pensons que nous allons avoir ne se fait plus de 4 millions de cours
le champ d'un int est très bien.
Nous pourrions même rétrécir vers le bas
mais l'espace est pas cher alors qui s'en soucie vraiment.
Mais, nous essayons de écrire Facebook maintenant,
pourrait ne pas être une mauvaise chose d'anticiper les grandes ints
ce qui nous donnerait ints 64 bits
mais alors vous êtes littéralement doublant le nombre de bits
que vous utilisez, compromis si mineur
mais quelque chose à considérer.
Maintenant, c'est une source de confusion héritage chose.
Vous pourriez rappeler de l'utilisation de MySQL
que chaque fois que vous déclarez un int champ, vous verrez souvent un certain nombre
à côté de lui comme le nombre 10.
Cela n'a rien à voir avec la taille du nombre
ou le nombre de bits.
Cela a à voir avec le nombre de caractères qui sont utilisés
pour afficher visuellement ce domaine int
lors de l'utilisation d'une fenêtre de terminal.
Ainsi nous pouvons voir que dans un moment.
Donc, ne pas être induit en erreur en tapant les numéros
là, même si c'est effectivement nous demander
un ici.
Ici, je vais aller de l'avant et dire non signé.
Il n'ya aucune raison à déchets tous nos nombres négatifs
depuis la base de données est généralement aller
à assumer positif valeurs ou nulle.
L'ID certainement ne devrait pas être nulle.
Et que pensez-vous de l'indice pour ce domaine d'identité?
Faisons primaire.
Donc, si, si, comme je peux que penser d'un cours de CS164
à Harvard et un seul cours de CS50 à Harvard
et c'est assez beaucoup véritable globale
qu'il ya peut-être des exceptions [Inaudible] les deux semestres
ou quelque chose d'équivalent.
Mais plus fondamentalement, pourquoi est-il mieux
d'utiliser un ID numérique intégrante de identifier de manière unique les cours plutôt
qu'une chaîne unique?
Ouais?
[Inaudible Remarque]
OK, intéressant.
Donc, si nous avions sorte de cours contre-indiqué.
Alors que c'est un bon exemple.
Je ne suis pas sûr que je serais résoudre que si
en leur donnant le même numéro d'identification si c'est
où que vous alliez avec cela.
Non? OK. Mais certainement un cas d'angle à considérer.
Si il est une sorte de - nous besoin d'une sorte
de repliement potentiellement.
[Inaudible Remarque]
Bien sûr.
[Inaudible Remarque]
C'est un bon exemple.
Le nom peut changer au fil du temps, tout à fait raisonnable.
Quoi d'autre?
[Inaudible Remarque]
Désolé, je le répète.
[Inaudible Remarque]
Oui, exactement.
Alors, vraiment, c'est le véritable pneu est
que l'utilisation d'un int de 32 bits est va probablement être plus rapide
que certaines variables champ char de longueur.
Dans le premier cas, la boîte adapter littéralement dans un registre,
pour ne pas mentionner beaucoup plus petite empreinte mémoire.
Dans ce dernier cas, vous allez avoir à faire recours [transcription phonétique]
pour les comparaisons de chaînes qui en eux-mêmes avec l'linéaire
de la taille de l' chaîne potentiellement.
Donc, c'est juste une belle l'optimisation,
et en particulier, il va
nous laisser faire ce qu'on appelle Rejoint plus efficacement
dans un instant.
Alors faisons-le.
Nous précisons que c'est primaire
parce que je n'aime pas particulièrement vouloir soins ou de penser
sur ce que le nombre est d'un cours.
Laissez-les prendre sur quel que soit les valeurs qu'ils veulent.
Je vais dire incrémentation automatique donc je ne peux externaliser ce détail.
Comme dans de côté que vous aimerez savoir que Harvard
au moins a des uniques numéros pour les cours.
Je n'ai aucun souvenir ce que ce cours est.
Je sais que CS50 de numéro de catalogue est 4949,
tout à fait arbitraire.
Mais il ya bizarre cas d'angle dans ce même
dans la décharge registrariat de cours données du catalogue,
parfois des cours, des vieux cours ont un nombre comme 4.
Mais techniquement que champ est un champ char
qui commence simplement avec 0004.
Donc, là aussi, il faut être attention à distinguer
entre les choses comme un Bien sûr le numéro de catalogue
qui pourrait avoir une certaine humain notion de longueur fixe, 0004,
et vous ne devez pas stocker que, par exemple, dans un ints.
Ce type de champ doit stocker ailleurs.
Donc, à Harvard, si nous étions effectivement faire un cours
outil de shopping, c'est probablement pas suffisamment
à des cours numériques avec seulement 1, 2, 3, 4.
Nous allons probablement avoir
d'avoir un autre champ appelé le numéro de catalogue,
qui est également censé être unique basé
sur les conventions relatives ici mais ce n'est pas le meilleur choix
pour un identifiant unique parce il peut être de longueur variable.
Il ne serait pas quatre caractères, il pourrait être de cinq ans.
En fait, je pense que quelques-uns il ya des années, ils se déplacent
à la cause il cinq personnages étaient plus de 999 cours
en totalité ou quelque chose comme que, ou 9,999 cours.
Donc, c'est peut-être un exemple où le champ n'est pas primaire
mais il doit être unique.
Et adresse e-mail est un autre.
Vous voudrez peut-il être unique
mais pas nécessairement votre clé primaire.
Très bien.
Alors permettez-moi cogne un autre tableau beaucoup plus vite que celui-ci.
Je vais donc appeler cette un des instructeurs et je vais
de donner à ce total nombre de colonnes de deux.
Je vais apprendre mon leçon de la dernière fois.
Je vais appeler le premier ID de colonne.
Je vais appeler le deuxième colonne Nom.
Je vais aussi faire Varchar.
Je vais assumer aucune professeur a un nom plus
de 60 caractères, si maintenant ce pourrait être le poussant
avec des noms longs, spécial les personnes ayant prénoms.
C'est très bien pour aujourd'hui.
Donc, nous allons défiler ici.
Faisons à nouveau cette non signé.
Faisons de cette primaire.
Et nous allons permettre à des noms en double
dans le cas où il est deux John Smith ou quelque chose comme ça.
Et maintenant nous avons deux tables.
Alors maintenant, cela soulève la question de savoir comment puis-je associer
dans instructeur avec le cours?
Je sens que je sorte de devancé de moi
parce que si un instructeur donne un cours,
mon premier instinct serait effectivement à revenir
à réaliser des cours, ce n'était pas une bonne idée.
Permettez-moi de réellement ajouter une colonne à la fin de la table,
cliquez sur OK, et je vais appeler ce instructeur.
Et je fais cette varchar et je ferai ce 60.
Et peut-être que je vais laisser nulle maintenant
dans le cas où le cours a pas été unsigned dans instructeur
ce qui arrive parfois avant terme commence et cliquez sur Enregistrer.
Lequel de ces modèles préférez-vous?
Première où nous avons une la table de moniteur séparé
ou la seconde où nous venons ajouter un champ à la formation?
C'est donc un lien étroit entre instructeur de golf.
[Inaudible Remarque]
OK. Bon. Mais permettez-moi de repousser.
C'est tellement simple comme je peux il suffit de taper le nom de la personne
dans ce tableau, comme sûrement qui a une certaine valeur ou -?
[Inaudible Remarque]
Très bien.
Eh bien, permettez-moi d'être difficile ici.
Alors permettez-moi de dire que ce cours est CS51
et je sais qu'il a enseigné cette année par deux personnes.
Ainsi, Henry Leitner et Jesse Tov mais -
donc je vais mettre une virgule entre les deux, à droite.
Je suis vraiment bon à CSV d'antan.
[Inaudible Remarque]
Exactement, à droite.
Dès que vous avez recours à quelque chose comme ça,
qui pourraient se sentir raisonnable et vous pourriez vous sentir
comme ceci est une sorte de puce.
Je suis une sorte d'emprunt un idée qui est à bien travailler,
emprunter une idée nouvelle et sorte de les combiner.
Vous êtes un peu de tout à fait vaincu le point de l'utilisation de la base de données
dans la cause la première place » si l'une des valeurs
de l'aide, il est des recherches plus rapides en raison des différents indices
et des tables qui peuvent être mis en place pour vous
par le moteur de base de données elle-même.
Maintenant, si vous voulez rechercher pour tous les cours
que Jesse enseigne, vous avez maintenant à ne sous-chaîne correspondant à tous
des champs d'instructeur,
ce qui signifie effectivement linéaire chercher à nouveau parce que vous avez
pour trouver cet ensemble arbitraire de trois caractères n'importe où
dans le domaine de l'instructeur précédée
peut-être dans suivie par une virgule.
Donc certainement n'augure rien de bon.
Alors permettez-moi de revenir à la table.
Permettez-moi aller de l'avant pour cours, qui défont.
Je vais juste l'avant et déposer ce domaine.
Et si vous voulez le faire manuellement,
la syntaxe est ALTER TABLE cours DROP instructeur.
Donc, nous allons aller de l'avant et dire oui à cela.
Et revenir à cette idée plus tôt
où j'ai séparé table pour les instructeurs.
Mais maintenant, cela se sent un peu comme je peux mettre un cours
dans le tableau des cours et instructeur
dans la table de l'instructeur, mais je en quelque sorte besoin de lier les deux.
Et comment voulez-vous proposons-nous fait?
[Inaudible Remarque]
Bon. Alors faisons-le.
Et vous pouvez appeler cette Table en théorie rien.
Je vais délibérément appelez ça comme un grand
des cadres serait appeler, parmi eux,
Laravel comme vous le verrez dans un peu.
Je vais l'appeler sûr souligner instructeur.
L'utilisation du singulier dans cette cas pour chacun des mots
et minuscules à nouveau, et également avec le -
puis par ordre alphabétique triés de gauche à droite.
C'est tout à fait arbitraire, mais il tend à être une convention
dans un grand nombre de ces cadres en PHP dans d'autres langues.
Combien de colonnes ai-je besoin ce que nous appelons une table de jointure,
à se joindre à deux autres tables ensemble?
Trois colonnes?
Lequel - quels seraient-ils?
[Inaudible Remarque]
OK. Bon. Cela fonctionne.
Et nous pourrions techniquement couper un coin ici, mais beaucoup
des cadres en particulier serait encore donner même ces lignes
ID unique, même si sémantiquement la ligne
que nous nous soucions vraiment ou les colonnes que nous nous soucions vraiment
environ sont les deux derniers ce que vous dites, le cours ID
et l'ID de l'instructeur.
Donc, nous allons le faire.
Je vais appeler cette ligne juste ID, comme nous l'avons fait avant.
Mais ce que je vais pour appeler sûr ID.
Ce que je vais appeler instructeur ID.
Et je vais préciser que tous
d'entre eux ne sont pas signés Parce que je veux
afin de maximiser mon 4 milliards gamme int.
Aucun d'entre eux devrait être nulle.
Je vais préciser que ID doit encore être primaire.
Et encore, ce n'est juste une convention,
un grand nombre de cadres même si vous ne triez pas
de fondamentalement besoin d'un identificateur unique de la ligne,
il s'avère que c'est pratique pour le code, le code SQL qui va
être automatiquement généré pour nous.
Donc, je vais laisser ça comme primaire.
Mais maintenant, j'ai en quelque sorte une décision de conception,
ID de cours et instructeur ID.
Quels index le cas échéant devraient-ils obtenir?
Si je laisse pas d'index, ce qui est la conséquence?
Qu'est-ce qu'une implication?
Performance en avant, non?
S'il n'y a pas d'indice, la mieux que vous pouvez faire est de nature
de [inaudible] à travers le chose tout à la recherche de numéros.
Donc, cela ne se sentent pas intelligent.
Faut-il être primaire?
Alors pourquoi pas?
Pourquoi ne pas primaire?
[Inaudible Remarque]
Parfait. Donc, nous roulons sur [transcription phonétique] primaire.
Nous avons déjà choisi cela.
Alors, doit-elle être unique?
[Inaudible Remarque]
Bon. Donc, si vous assumez un instructeur par cours,
tout à fait bien.
Et c'est certainement le cas le plus courant
mais nous avons déjà mis hors un exemple peut-être familier.
CS51 a deux instructeurs de sorte que nous sommes en quelque sorte
maintenant vissé dans ce cas.
Si nous avons fait de permettre que un instructeur,
nous pourrions faire d'une manière avec la table de jointure tout à fait,
revenir à l'approche antérieure
et mettez pas le nom de la personne peut-être, mais l'ID de l'instructeur.
Si vous connaissez tous bien sûr que tout un instructeur vous pouvez avoir juste
une colonne.
Mais la variabilité est ce qui nous a mis dans la difficulté.
Très bien.
Alors, doit-elle être unique?
N ° Texte intégral ne sentir applicable.
Comme nous l'avons dit, c'est
pour chaîne comme correspondant pour les descriptions.
Alors que sur l'indice?
Eh bien, l'indice est probablement notre meilleur candidat
qui raconte MySQL optimiser pour des recherches sur ce
ou laissez-moi d'élaborer, optimiser pour des recherches ou des jointures
comme nous le verrons dans un instant
afin qu'ils soient un peu plus efficace
que tout purement linéaire.
Ce que je veux auto incrémente ce domaine?
Donc, non, parce que le vrai élément parent existe
dans la table des cours.
C'est là que c'est allez obtenir ainsi,
plus quand il s'agit en fait inséré.
Ici, tout cela va à insérer manuellement
par nous sans doute dans le code.
Donc, nous allons simplement spécifier que les deux cours ID
et instructeur ID ont des indices.
Maintenant, nous allons aller de l'avant et économiser.
Et maintenant, juste pour montrer vous la correspondance
entre ce qui est une belle interface conviviale de l'interface graphique
et l'interface de ligne de commande.
Permettez-moi aller de l'avant et faire la suivante à cette invite MySQL.
Je vais dire une utilisation courses50
qui est le nom arbitraire J'ai donné à cette base de données.
Et maintenant, je ne sais pas encore Rappelons que nous avons fait.
Permettez-moi de taper show tables
et généralement des points-virgules sera votre ami ici
pour terminer la requête.
Et il est là.
Voici donc les lignes ou plutôt les tableaux que nous avons ici.
Maintenant, je ne sais plus ce que un cours ressemble,
alors laissez-moi ne décris cours et maintenant je vois une sorte de ASCII
ou une version de ce que phpMyAdmin a été fait
et je vois que ID est un int.
Il n'y a que 10.
Qu'est-ce que ça veut dire?
Cela signifie simplement que quand il est s'affiche, il va prendre
jusqu'à 10 caractères sur la fenêtre du terminal.
Est-il nullable?
Non, c'est la clé primaire.
Peut-il avoir une valeur par défaut?
N Et supplémentaire qui est spécial drapeaux comme incrémentation automatique.
Donc, nous allons juste faire un couple insertions de rapides ici.
Je vais aller jusqu'à à - disons simplement.
Nous allons changer l'état d'une diapositive
où je sorte de pré-préparer ce.
Ceci est un résumé, puis de ces trois tableaux.
J'ai déjà tout manuellement tapé la première commande.
Et ici, je suis allé de l'avant et entrez les autres pour vous.
Ce n'est que le chose stylistique.
En général, beaucoup de personnes taper des instructions SQL en majuscules
puis les noms de table et noms de champ en minuscules,
si seulement parce qu'il genre de stands
ce qui est votre terminologie et quelle est la syntaxe de base de données.
Nous avons donc ici trois tables, les cours, les instructeurs,
et des cours d'instructeurs.
Dans la diapositive que j'ai fait à l'avance, Je n'ai pas eu le champ ID
mais ce n'est pas fait une mauvaise chose du tout.
Nous voulons juste voir un troisième colonne là.
Avais-je fait ici?
Alors maintenant, permettez-moi de proposer que nous faisons un tas d'insertions.
Alors, voici quelques données, Je vais agrandir
Je vais donc proposer que dans les cours,
nous traitons uniquement avec trois cours.
Et j'ai choisi ces trois Parce qu'ils sont représentatifs
de certains bien - ils ont quelques belles propriétés.
CS1, CS50, CS51, ils avoir des ID croissants
mais ce qui est ce que ID est totalement hors de propos.
C'est juste l'ordre dans lequel ils ont été insérées automatiquement par moi.
Que diriez-vous des instructeurs?
Alors maintenant, car Henry Leitner enseigne à la fois CS1 et CS51,
c'est un peu un opportun implication de notre conception.
Et Jesse enseigne CS51 et Malan enseigne CS50.
Alors maintenant - ou plutôt ce sont seulement des identifiants uniques sont ces gens.
Et des cours et des instructeurs, - instructeurs, notez ici.
ID1 du cours, qui a été CS1 est enseigné
par instructeur ID1 qui est Henry.
ID2 de cours, que je pense a CS50 est enseigné
par instructeur ID2, qui est Malan.
Et puis enfin, CS51, et remarquerez que nous avons deux lignes.
Et maintenant, c'est pourquoi la jointure tableau est puissant est enseigné
par Henry et Jesse.
Donc tout cela est bel et bon,
mais je peux à peine rappelez-vous juste au-dessus
de ma tête qui est qui ici.
Comment pouvez-vous les gérer dans le code,
sans avoir à dures choses de code?
Eh bien, c'est là que SQL lui-même commence à devenir notre ami.
Et je vais proposer que nous pouvons tapez la commande suivante.
Je vais le faire à en invite réelle.
Permettez-moi aller de l'avant et insérer ces choses.
Ainsi, dans le tableau des cours nous allons faire exactement ce que nous avions un
il ya un moment.
Je vais de l'avant et dire, nous allons insérer CS1 et CS50.
Insérons un peu plus lignes à la fois, CS51.
Maintenant, laissez-moi aller de l'avant et sauve.
Très bien, alors je suis juste recréer le plus rapidement
que je peux les relations nous venons de voir à l'écran.
Et ici, nous avons Leitner, nous avons ici Malan.
Donnons-nous une autre ligne, et Tov.
Maintenant, permettez-moi à sauver ce.
Et je les faire délibérément dans le même ordre.
Non, j'ai oublié de donner cette augmentation de l'automobile.
Permettez-moi de rapidement résoudre ce problème.
Je vais résoudre ce problème en le code en ligne.
Qui a échoué en aparté.
Le fait que je ne pouvais pas insérer Leitner et Malan
et Tov a échoué, parce que je n'ai pas spécifier un numéro d'identification, même si
c'est attendant un et je oublié de vérifier incrémentation automatique,
ce qui signifie qu'ils étaient tous par défaut d'obtenir zéro.
Mais cela contredit alors que bien que nous avons spécifié.
La clé primaire a été violée il ne m'a même pas laissé faire.
Permettez-moi de résoudre ce problème.
Maintenant, permettez-moi de revenir à la Sous l'onglet Insertion ici et indiquez
que je veux Leitner, Malan et, une ligne de plus, Tov.
Et maintenant, enfin, la seule un qui est un peu difficile
à retenir est bien sûr instructeur.
Insérons maintenant que Bien sûr ID1 est instructeur ID1
donc c'est CS1 et Henry.
ID2 du cours est instructeur ID2 qui est CS50 et Malan.
Et puis les derniers que nous avons à s'inquiéter est bien sûr ID3
qui est CS51, est enseigné
par un instructeur de cours 1, qui est Henry.
Et trois, comme aussi enseigné par trois, ce qui est Tov.
Donc, j'espère maintenant nous avons recréé ce -
zut, j'ai fait la même chose.
Chargé de cours besoins incrémentation automatique.
Très bien.
Je vais le faire plus vite cette fois, cours 1, cours 1, 2, 2.
Et maintenant, enfin, nous faisons CS51 qui a bien sûr ID3 et Henry.
Et bien sûr ID3 et Jesse.
Cela semble bon.
OK. Alors maintenant, revenons à la fenêtre du terminal.
Donc, si je décris cours nous allons voir cela.
Si je veux voir les cours que je peux maintenant faire sélectionner étoiles de cours,
point-virgule, et maintenant nous voyons ces valeurs.
Et maintenant, qu'est-ce ce que je veux faire?
Sélectionnez étoiles des instructeurs, c'est comme je m'y attendais,
et sélectionnez étoiles de cours - cours de soulignement instructeur.
Alors, comment puis-je m'inscrire maintenant ces tableaux?
Donc, la beauté d'avoir choisi les valeurs d'identité de cette façon est
que si vous pensez prenant la table des cours
et l'instructeur table et puis en insérant
entre les deux dans votre esprit l'instructeur du cours
table que vous pouvez sorte de ligne jusqu'à l'ensemble de ces colonnes d'identité
de sorte que vous les fusionner en une colonne massive qui a tout
des informations nous nous soucions.
La syntaxe SQL pour cette n'est pas forcément évident,
mais nous allons voir si nous pouvons le faire.
Donc, sélectionnez étoiles de cours,
et il ya un moyen de quelques comme nous pouvons le faire.
Je vais frapper Entrez simplement genre de choses de format bien,
mais que la flèche est juste un symptôme de l'outil du côté client,
il n'a rien à faire avec SQL lui-même.
Donc, sélectionnez étoiles de cours.
Je vais rejoindre maintenant la table des cours
sur la table cours d'instructeur.
Comment? Sur le terrain appelé courses.id cours égalant
souligner instructeur dot quel est le nom
du champ correspondant ici que je veux un couple.
Il ne s'agit pas d'identité.
C'est - ce qui, désolé?
>> ID de golf.
OK, laissez-moi un zoom arrière.
Mais je veux prendre un peu plus loin.
J'ai maintenant fait ce table et celui-ci.
Maintenant, je veux tirer ce gars-là en tant que bien.
Alors, laissez-moi encore rejoindre cette chose
sur de l'instructeur tableau de quoi?
soulignement de cours instructor.instructor Identifiant
égalant instructors.id.
Donc, nous aurions pu écrire cette requête en quelques manières.
L'ordre dans lequel je l'ai fait n'est pas tout ce qui importe.
Je viens de genre de fait dans mon esprit de gauche à droite.
Nous aurions pu faire ce dans les différentes façons
mais si j'ai l' point-virgule et appuyez sur Entrée,
Remarquez que je serai de retour une nouvelle table temporaire, un jeu de résultats
pour ainsi dire en parler de base de données.
Et que dois-je dans cette affaire?
J'ai l'ID, un nom, un autre ID, qui est une sorte de confusion
pour moi en ce moment, un ID de cours,
un instructeur ID, ID, et le nom.
Donc, à la fin de la journée, nous avons les données maintenant.
Je peux voir que CS1 est enseigné par Leitner, CS51 est enseigné
par Leitner et Tov, et CS50 est enseigné par Malan.
Mais je suis un peu nerveux au sujet cette ambiguïté que j'ai créé.
Qu'est-ce que c'est l'ambiguïté Je fais allusion?
Ouais?
[Inaudible Remarque]
Il ya trois colonnes d'identité.
Nous pouvons donc résoudre ce problème et nous allons aller effectivement
de reporter à notre cadre en fin de compte à nous aider,
mais il s'avère qu'il n'y a un mot-clé dans SQL appelée S,
où vous pouvez spécifier une alias, un nouveau nom pour un champ
de sorte que nous pouvons éviter ce ambiguïté complètement.
Mais rendu compte que si nous ne faisons pas répondre en quelque sorte comme
ce mot-clé ou un cadre,
il ya potentiellement ce ambiguïté si vous essayez
pour accéder au champ ID car de toute évidence il y en a
avec des noms en double là-bas.
Donc, c'est une jointure et je pense dans l'oeil de votre esprit la meilleure façon
y penser vraiment est de prendre les deux tableaux,
les aligner dans le comme vous le souhaitez.
Et il s'agit d'un soi-disant jointure interne dans le sens
que nous combinant les tableaux ici.
Il existe d'autres types d' rejoint que nous pourrions rencontrer
au fil du temps comme les jointures externes,
mais la plupart du temps ce est probablement le plus commun
pour reconstituer les données.
Ce que nous avons fait aujourd'hui est généralement ce qu'on appelle
normaliser vos données, de sorte que il n'y a pas duplication partout
dans vos tables.
Et par duplication, je voudrais ont fait que la première approche.
Si nous avions mentionné Leitner et Tov à plusieurs endroits
dans votre base de données, ce n'est pas généralement la meilleure décision
surtout si leur nom pourrait évoluer dans le temps ou dans le cas
du mariage, nom de jeune fille puissance lui-même le changement que vous voulez juste un
lieu canonique pour certains valeur de données comme un nom.
Très bien.
Donc, pour résumer, nous avons eu une quelques décisions de conception à faire
et les plus importantes probablement réduite dans une certaine
de ces choix d'index.
Mais permettez-moi de souligner une autre chose aussi.
Si je reviens à phpMyAdmin,
une caractéristique vous ne pourriez pas ont rencontré avant est
ce qui suit.
Si je vais à un instructeur de cours, Je n'ai déjà préciser que certains
ces choses ont des indices.
Mais laissez-moi aller à la structure onglet de instructeur.
Permettez-moi maintenant cliquez sur les indices et remarquer ce qui suit.
J'ai indiqué ici que il existe une clé primaire
sur la colonne appelée ID.
C'est un peu compliqué manière de spécifier la cardinalité
et ainsi de suite comme faisant référence à la taille du champ en octets.
Mais maintenant, j'ai aussi un autre domaine, ID de cours, qui est -
ID de cours qui se fait à l'avance et unique, OK.
Je l'ai fait dans un progresser pour nous.
Alors, pourquoi est-ce - permettez-moi de tomber ce pour le bien de la discussion.
Oh, vous savez ce que j'ai fait?
OK. Ainsi, au début, l'un des périls de l'aide d'un outil graphique
comme ça, quand nous étions La création de cette table de jointure,
la table de chargé de cours, rappelle que j'ai précisé
que je veux un indice sur ce champ
et un index sur ce autre domaine.
L'effet secondaire de l' vérifier à la fois de ces boîtes
sur le même écran est que phpMyAdmin déduit que,
que je veux pas deux index séparés,
que je veux rejoindre un indice qui est généralement seulement utile
ou plus utile lorsque vous êtes recherche sur pas un champ
mais ces deux domaines.
Et c'est pourquoi nous avons dû eux, il conjoignent
donc j'ai laissé tomber parce que n'étais pas ce que je voulais.
Au contraire, je vais refaire ce ici.
Je vais aller à l'ID du cours
et en vertu de plus je suis va dire ajouter indice.
Et je vais passer sous instructeur ID et dire ajouter indice.
Et maintenant, si l'on clique ici, Notez que nous avons trois indices,
un primaire et que je prévu un pour chaque
de ces clés étrangères.
Et je l'appelle étrangère parce ID de cours dans ce tableau les cartes
à qui le terrain, juste pour être effacer, dans une autre table.
La clé primaire appelé ID, dans la table appelée cours,
et même affaire pour l'autre.
Mais maintenant, c'est une intéressante tromper et vraiment technique.
Je suis juste allé de l'avant et permettez-moi de faire un peu plus lentement.
Dans le même écran, un avis il dit vue de Relation ici.
Je clique sur cette remarque et maintenant je arriver à faire quelques contraintes.
Ainsi, l'un des bons côtés aussi
non seulement à l'aide de conceptuellement les clés étrangères et d'autres tables
comme nous venons de le est que par la définition d'un index
sur eux, vous pouvez avoir l' aide de base de données encore plus
assurer l'intégrité de ce champ.
Plus précisément, je peux maintenant indiquer par cette baisse
bas que le champ cours d'identification
dans ce tableau fait cartes à courses.id.
De même, instructeur de soulignement ID mappé à instructors.id.
Maintenant, pourquoi est-ce utile?
Eh bien, remarquez, sur la droite côté de ce qui semble maintenant.
Je peux maintenant apprendre le base de données que si Henry
par exemple retire jamais et sa ligne disparaît
de la table de l'instructeur tout étant ainsi
supprimé, je peux par ce cascade approche assurer
que les cours qu'il enseigne sont ne lui est associée.
Je peux enseigner la base de données à supprimer les lignes
dans ce que l'on appelle la table de jointure automatiquement si Henry ou si l'on
de ses cours disparaît.
Maintenant, pourquoi est-ce intéressant?
Ouais?
[Inaudible Remarque]
Vous n'avez qu'à le faire une fois et à long terme, non?
Il est très facile si sorte de les gens vont et viennent, les cours sont
et aller, votre base de données pourrait juste se jonché de cours
et avec les professeurs qui ne sont plus pertinente à l'ensemble de données.
Et vos données commence à être très malpropre et sale et le renfermé,
et ici nous pouvons trier
de respecter certains ces contraintes.
Ouais?
[Inaudible Remarque]
Il sait par le biais de ce.
C'est l'écran où nous spécifions un lien
entre la clé étrangère et la clé primaire.
Donc, tout le nommage conventions auxquelles j'ai fait allusion
tout à l'heure ne sont que des conventions.
Il n'y a pas de signification propre.
C'est l'écran qui est seulement utile
après avoir spécifié les index sur chacun de ces domaines que nous avons fait.
Et pour cette liste déroulante nous avons un certain nombre de choses, par exemple
si un cours est supprimé, vous pouvez en fait empêcher que la deletion
de se produire s'il y est une ligne dans cette table
en disant simplement, Restreindre.
En d'autres termes Henry ne peut pas prendre sa retraite
jusqu'à ce que nous lui découplons de CS51 et CS1.
Donc, c'est une bonne chose.
Mais cela pourrait déclencher des erreurs dans votre code
si vous ne prévoyez pas que, ou nous pouvons avoir une cascade,
une cascade similaire à aimer les feuilles de style en cascade
et la cascade signifie que si une chute d'eau -
si Henry prend sa retraite si - en se supprimé
il en va de sa ligne ici obtenir supprimé.
Aucune action ne signifie rien ou null est une sorte de pratique si vous nature
de vouloir quelque dossier historique de Henry avoir enseigné CS51,
mais vous voulez juste ce domaine à nulle de sorte que les lignes là
mais ce n'est pas plus longtemps qui lui est associée.
Ce sont donc très puissant techniques que vous pouvez
et doivent utiliser même si intérêt particulier
de vous sauver de vous-même.
Alors permettez-moi de faire mention d'un quelques derniers détails ici,
ingrédients avec lesquels cela pourrait être utile
que nous planifions pour la conception de base de données.
Vous avez aussi le choix sur le moteur de base de données
que vous utilisez dans votre code.
Si vous êtes familier de CS161 vous pourriez -
ou même 61, vous pourriez général se familiariser avec les systèmes de fichiers.
Et il ya des choses comme, NTFS et HFS +
et X2FS4 [transcription phonétique] et 3 et ainsi de suite.
Il ya différentes façons de stocker des données sur le bureau.
De même y at-il différents moyens de stockage de données
dans une base de données par défaut au moins dans la Appliance
avec la dernière version de MySQL.
Nous avons utilisé la moteur de base de données appelé, NODB,
qui prend en charge un quelques fonctionnalités intéressantes.
Mais un autre commune est également appelé MyISAM et encore un autre
qui peut être utilisé est la mémoire, ce qui signifie ne pas mettre quoi que ce soit
sur le disque, il faut garder les choses en mémoire.
Pour la plupart, vous probablement ne vous tromperez pas juste de commencer
avec NODB, mais pour tous les projets qui tendent à impliquer des taux élevés
d'insertion, par exemple, comme beaucoup de l'exploitation rapide,
des centaines de choses par seconde ou des milliers de choses.
Chaque fois que vous avez une beaucoup de choses qui se passent
sur la base de données alors ce genre
décisions prises au niveau de la baisse commencer à s'impliquer.
La fonction de texte intégral pour exemple ne fonctionne que dans MyISAM
de sorte que a une implication.
Mais vous souvenez peut-être cela, nous allons au moins motiver pourquoi nous nous soucions
sur NODB en particulier.
A conditions de course se réfère généralement à quoi?
Très bien, c'est une allusion à un exemple, certains
vous pourriez avoir entendu dans dernières années si 161 ou 50
où vous avez un colocataire, deux d'entre vous aiment vraiment le lait,
un de vous se première maison ouvre le réfrigérateur, il n'y a pas de lait,
fermer le réfrigérateur marche à travers rues à CVS et obtenir
en ligne pour acheter du lait.
Pendant ce temps, votre colocataire revient ici.
Elle aime aussi le lait.
Ouvrez le réfrigérateur et réalise pas de lait.
Ici, elle se dirige ensuite vers l' stocker, peut-être l'autre CVS.
Avance rapide de quelques minutes plus tard, vous revenez et maintenant à la fois
vous avez acheté le lait.
L'un d'eux va maintenant gâcher parce que vous n'avez pas
comme le lait que beaucoup et c'est un problème, non?
Parce que chacun de vous inspectés l'état d'une variable
et pris une décision sur la base sur elle, même si l'état
de cette variable était essentiellement en train d'être modifié,
tous être lentement sur le quantité de temps qu'il faut
d'accès et de CVS.
Alors, quelle est une sorte de réel stupide solution mondiale à ce problème?
Laissez une note, non?
Il est arrivé la dernière fois.
Toujours laisser une note ou cadenasser la chose littéralement.
Et je dis cadenas, car si vous prenez ou avez pris CS161,
blocage est un droit fondamental idée dans ce genre de monde.
Donc, les conditions de course peuvent survenir aussi dans le monde de la base de données
et vous vous en souvenez peut-être de CS50 financer si vous avez pris 50,
ce code que nous avons fait vous les gars dans la spécification
à l'époque, que votre opération est dite atomique.
Si vous voulez, dans ce cas, acheter une part du stock
et ce stock a un symbole particulier.
Nous avons dit d'utiliser un code comme ce, parce que par le biais de ce
sur la mise à jour de clé en double syntaxe, qui est construit
dans MySQL, vous êtes efficace faire soit en insert
ou en mise à jour après faire une sélection à voir
si un stock est déjà là.
En d'autres termes, l'analogue dans le monde de l'achat d'un stock
de lait et le réfrigérateur peut-être, d'abord,
avant d'acheter une part de Google vous pouvez sélectionner
à partir de la base de données l'ensemble de l' actions de Google que David possède
pour voir si il possède zéro ou plus.
Une fois que vous voyez s'il possède zéro ou plus, vous avez
pour ensuite faire ce qui suit.
Soit vous avez à faire un insert
s'il propre cause zéro » il n'y a pas de ligne David encore,
ou que vous avez à faire une mise à jour si au moins en théorie, vous voulez
d'avoir une ligne par utilisateur.
Le problème est de sélectionner le nombre d'actions
puis la mise à jour ou insertion pourrait être interrompue
par quelqu'un d'autre à un autre terminal d'ordinateur en essayant d'acheter
ou vendre certains de David actions de stocks si
à bon escient ou tri des fins malveillantes.
C'est comme aller au magasin quand votre colocataire revient
et vérifie l'état de la variable.
Donc, cette syntaxe au moment qui était en quelque sorte approprié
pour CS50, évite que problème tout à fait.
Et il le fait juste tout cela magie de verrouillage pour vous,
mais maintenant, avec ces sortes des projets pour ce cours
qui sera très probablement impliquer des ensembles de données plus complexes,
vous ne pouvez pas atteindre toujours cette atomicité.
Tout se passe en une seule fois ou pas du tout
sans interruption si élégamment.
Et si MySQL, un autre moteur de base de données,
les choses de soutien appelés verrous,
lequel vous pouvez dire ce verrou Table de sorte que seule une friandise
et généralement un seul utilisateur peut toucher à n'importe quel point dans le temps
pour lire ou écrire et alors vous pouvez déverrouiller.
Ceci est un exemple d'un de ses propres références de MySQL,
où si vous avez comme une banque compte que vous essayez
à déduire des sommes de puis ajouter de l'argent.
Vous voudrez peut-être assurez-vous que
de ces choses se produisent ensemble
de sorte qu'il n'y a pas de erreurs mathématiques
et pas une perte de l'argent, en quelque sorte.
Le problème avec les verrous bien que dans une base de données est
cela signifie généralement que toute la table est verrouillé,
ce qui signifie que si vous avez une centaine de personnes qui tentent
de faire des affaires avec votre banque en ligne à la même quantité
de temps que l'un des peuvent évoluer à la fois.
Ce qui est stupide, surtout sur les serveurs de nos jours
qui ont huit cours, 16 Bien sûr, avoir une quantité énorme
de mémoire, il n'y a pas raison de feuilleton tout
de vos transactions si les les clients ne vont
d'interagir avec leurs propres lignes.
Donc NODB vous permet de faire choses plus intelligente
et ce sera généralement l'approche que vous prenez dans le code,
que vous utilisez quelque chose appelé la transaction.
Et vous le faites généralement dans le code PHP,
Code Ruby, Python, peu importe.
Mais le code SQL qui est en fin de compte utilisée est la suivante,
généralement.
Démarrer la transaction, alors vous spécifier deux ou plusieurs requêtes
que vous voulez exécuter tout
sans interruption ou pas du tout.
Il peut même y avoir une certaine sélectionnez déclarations dans
ou des suppressions ou des mises à jour.
Mais la bonne chose est que la base de données sera assez intelligent
pour s'assurer qu'il ne fera que verrouiller les lignes qu'ils sont effectivement
impliqués dans cette mise à jour ou sélectionne ou suppressions.
Donc, si vous avez des milliers de lignes et vous êtes seulement de toucher trois
d'entre eux, seul le sous-ensemble de la table sera verrouillé
ce qui signifie que les autres 99 les clients peuvent toucher leurs lignes
sans être sérialisé et ralenti par vous.
Pendant ce temps, c'est le plus beau aspect des opérations.
Ils sont des opérations dans un sentir comme 161 sur un système de fichiers,
ils sont transactionnel
ce qui signifie que vous pouvez rouler -les, vous pouvez les annuler.
C'est comme la commande ou contrôler F de bases de données.
Si vous découvrez une partie un chemin à travers toute
de vos différents opération de données, tirer, quelque chose va mal.
Vous exécutez littéralement une différente rouleau de requête SQL dos
et toutes ces tendances - tous des déclarations que vous avez exécuté
après le début en disant disparaître transaction
comme si elles n'avaient jamais existé,
qui est étonnamment chose puissante.
Et ce sont les types de choses certainement 50 nous sorte
de balayer sous le tapis et vous venez de genre de supposer
que tout ira bien.
Mais une fois que vous commencez penser à des projets réels
et des utilisateurs réels et la l'intégrité de votre base de données,
ce sont les types des décisions de conception
qui vont être important.