>> Todo ben.
Entón, sen máis delongas, SQL, Structured Query Language.
Así, probablemente usou iso en menos en CS50, talvez en CS165,
quizais na súa propia proxectos persoais.
E o que é SQL permiten que fai, nun SQL Server de forma máis xeral?
Si?
[Inaudível Observación]
OK, iso foi moi xeito seguro de dicilo.
Si Por iso, permite que almacene datos
e máis importante, permite vostede para consultar datos.
E este é un paso adiante
de utilizar algo máis simple como un ficheiro CSV, certo.
Comme separated variables.
Os valores semellantes.
Do mesmo xeito que salva información dunha liña
nun arquivo de texto.
Pero cal é a desvantaxe dun CSV para almacenar os seus datos,
aínda que de forma eficaz obter liñas e columnas a partir del?
É.
>> Non 'ten mesma organización
eficiencia [inaudível].
>> Non ten o mesmo eficiencia organización.
O que quere dicir?
>> Ben, como [inaudível] ten como principal [inaudível].
>> Aceptar. É.
>> É unha base de datos relacional pode ter varios bancos de datos
ligados uns ós outros de formas moi específicas.
>> Aceptar. Boa.
>> É [inaudível] para definir un CSV.
>> E déixeme axustar un pouco de terminoloxía.
Así, varias táboas dentro dun banco de datos, con certeza,
e que vai alén do que podes facer con só un CSV.
Pero realmente a limitación con CSV diría é
que a ineficiencia de todo isto.
É moi fácil de esquema.
Pero se quere facer unha consulta, que é o tempo de execución
de calquera consulta de selección nun ficheiro CSV?
Quero dicir, é grande e vello [inaudível] seguro, porque no peor dos casos,
eles se levantaron na parte inferior.
Mesmo se tivese ordenado a todo Arquivo CSV, se non sabe
que adiantado, ben, aínda vai ter
para buscar a cousa toda.
Así, entre as cousas imos comezar
de utilizar unha real base de datos a usar unha linguaxe
como o SQL é que pode consultar el e podemos con antelación
como deseñadores de base de datos especificar o que son os campos
que foron probablemente terá preguntas sobre a que a xente
MySQL ou Microsoft ou Oracle,
quen fixo que a base de datos que está a usar pode facer todo
o traballo duro de descubrir, todo ben,
dado un millón destes IDs.
Como podemos Esquema - los na memoria?
Algún tipo de árbore estruturar quizais,
de xeito que cando fai realmente realizar Select,
é algo que se logarítmica ou logarítmica
de logarítmica co tempo, no canto do que realmente devolvendo
en algo lineal.
Entón, nós temos unha morea de desempeño dese xeito.
E nós tamén pode almacenar moito máis datos máis facilmente porque SQL
Servidor adoitan ser gardados na memoria RAM, aínda que as partes
dos que poden ser almacenadas no disco e probablemente xa sabe
que a memoria RAM é xeralmente máis rápido que os discos,
entón iso é bo.
E nós tamén pode tratar con competencia moito mellor.
Se tomou 165 ou 161, vostede sabe que, se dúas persoas tentan
para facer o mesmo dunha soa vez nun sistema,
cousas malas poden ocorrer en xeral.
Así, entre outros recursos que pode comezar se nos proxectos nosas mesas
no camiño correcto é mellor soporte e seguridade
cando se trata de competencia.
Entón, dúas persoas en dous partes
do mundo, utilizando a mesma sitio, se ambos tentan
para mercar algo, ao mesmo tempo, esa orde non vai
para ir ao mesmo tempo.
Dalgunha forma eles ían ser serializado por alguén que non a nosa -
alguén que non sexa nós mesmos.
A vontade de base de datos facelo por nós.
Entón, cando a súa forma máis simple,
SQL permítenos unha consulta base de datos relacional.
Unha base de datos relacional é aquel que ten un
ou máis táboas na que normalmente.
E se esta é unha pouco raro,
realmente pode pensar só deste como Excel ou números
ou follas de cálculo de Google.
El só ten liñas e columnas e, tipicamente, a parte superior de cada
destas liñas ten un nome para el.
Polo tanto, este pode ser o ID columna, a columna nome,
a columna de dirección e así por diante.
E entón pode ter varios tales táboas, se quere
para comezar a pór para fóra diferentes tipos de datos.
Pero ten que lembrar, polo menos, de CS50 que intentamos
para lle dar unha baseada en GUI ferramenta [inaudível]
para xestionar o seu banco de datos.
Foi chamado phpMyAdmin.
Por iso, é só unha coincidencia que estaba escrito en PHP, realmente,
pero foi só un baseado na web front-end para unha base de datos.
E a través das varias guías e ligazóns, pode comezar
configurar unha base de datos a si mesmo.
Pero unha boa ferramenta para comezar a estar un pouco máis cómodo
con é tamén o cliente de liña de comandos.
Entón, se usar o aparello CS50 ou realmente usar calquera PC macro
que ten unha liña de comandos de MySQL cliente, tamén pode facelo tipo
da vella escola, como esta.
Como un aparte do proxecto MySQL, polo menos a versión de código aberto
do que é agora chamado a MariaDB varias razóns que pode ler
na Wikipedia, mais que é o mesmo software,
é o mesmo sintaxe e así por diante,
practicamente a mesma base de código.
E así cando estou neste pedir agora podo interactuar
co meu banco de datos moito máis a man.
Entón, caso en cuestión, déixeme ir adiante
e basta abrir unha fiestra de terminal.
Aconteceu de eu estar a usar o CS50 Appliance, pero pode facelo
en ningún sistema en que ten o dereito
software instalado.
E eu vou facer MySQL-u polo nome do usuario John Harvard
este sistema particular,-p un contrasinal que eu vou escribir
en algo máis seguridade por bater Intro.
Agora estou solicitado.
Vou escribir carmesim no Appliance CS50
e agora vexo esencialmente que a mesma pantalla.
Pero hai comandos agora que podemos comezar a escribir
como mostran as bases de datos, e que me vai amosar todo
das bases de datos que eu teño xa creados no sistema,
practicamente a mesma lista vería en phpMyAdmin.
Hai un par de outros como esquema de información e probas,
que se xogar co CS50 Appliance, que esconden algúns
destes cadros de nivel inferior
pero eles foron hai todo ese tempo.
MySQL realmente ten baixo nivel propiedades, como nomes de usuarios
e contrasinais para a base de datos si só, non para a súa aplicación
que pode ser rodando enriba dela.
Entón, con antelación, hoxe, eu creado unha base de datos par,
un dos cales se chama courses50.
As probabilidades son de que algúns de vós teñen usado Claro CS50 ferramenta de compras,
que é unha gran interface para catálogo de cursos do registrador.
E este é realmente un bo conxunto de datos para falar porque,
un, somos unha especie de todo evidentemente familiarizado con cursos
e instrutores e reunión locais e toda a especie
de cousas comúns da universidade,
pero tamén ten algúns oportunidades interesantes
para o proxecto.
Entón pensamos en utilizar a noción dun catálogo de cursos
e unha ferramenta de compra como un exemplo ao longo de hoxe para clasificar
de enmarcar un pouco do deseño decisións que debemos facer.
Entón, imos comezar por aí.
Supoñamos que eu realmente quería para representar o super sinxelo
claro compra ferramentas.
E o mundo máis sinxelo Podo imaxinar e un é
en que existen cursos e hai profesores.
E imos supor que a fins de debate
que cada curso ten, polo menos, un nome.
Entón, imos comezar a esbozar iso.
Vou usar o phpMyAdmin só como unha conveniencia,
por iso non ten que escribir todas as consultas manualmente.
Pero aquí estou eu na miña base de datos courses50.
Se non está afeito con iso, que vai ser moi fácil xa que mergullo
para o seu propio proxecto se quere usalo.
Eu estou indo a crear un táboa chamada Cursos
e só podo pensar dun campo
polo de agora, o nome dun curso.
Eu estou indo a ir adiante e digamos me dar unha columna.
Agora ben, como se lembra que comeza unha interface que é un pouco
como esta.
E o outro de cabeza, francamente de phpMyAdmin usa-se o tipo
de auto-instruíndo e que vía no menú, pode clasificar
de ver o que a súa posible decisións de deseño son.
Entón eu vou dar cada curso un nome.
Ese é o nome desta columna.
E en canto ao seu tipo de datos?
A maioría de vós debe saber en polo menos algúns destes tipos de datos
a partir da experiencia anterior.
Que é apropiado para o nome do curso?
Sharon?
>> Varchar.
>> OK, varchar que Char é variable.
E o que iso significa tecnicamente máis?
[Inaudível Observación]
Aceptar. Polo tanto, é unha cadea.
E o aspecto var iso implica que?
Variable. Pero o que que significa isto?
Si?
[Inaudível Observación]
Exactamente. Polo tanto, é unha variable número de caracteres
na secuencia up para algúns máxima.
Entón aquí está o noso primeiro decisión de deseño.
En realidade, temos que decidir cantos bytes maxima
a asignar a cada unha desas cordas.
Dun modo xeral, quere especie de non facelo moi pequeno,
non facelo moi grande Porque evidente
se é moi pequeno que é só comezará truncar datos
e vai perder información.
E se é moi grande, é só tipo de dicir á base de datos
de esperar e optimizar a máis datos
do que podería realmente nunca chegar.
Entón, cal é a sensación de razoable número ao nome dun curso?
60? OK, entón 60.
Isto parece bastante razoable
canto tempo é que non hai excepcións para iso.
Non hai realmente ningunha regra dura, rápida.
Para ser honesto, para razóns históricas moi
de persoas van escoller 255 Porque hai anos que era unha especie
do máximo nivel usando 8 bytes - 8 bits como o seu contador.
Eu tiña máis [inaudível] pode usar potencias de 2
pero é unha especie de irrelevante.
Así, podemos ir coa 60.
Isto parece razoable, sempre
coma nós, finalmente, non me arrepinto Por iso é un límite superior.
Agora, supoña que o contrario decisión foi tomada,
caracteres non variables, pero só o campo de char.
Así, a diferenza de C e C + +, char non significa un carácter
e bases de datos que xeralmente significa un número fixo
de carácteres nunha cadea.
Cal sería o lado positivo e / ou desvantaxe de miña elección de 60
para un campo char, no canto de varchar?
Este é o primeiro tipo de decisións que terá que facer
ao inspeccionar [fonética] fóra de proxecto cos seus socios.
Si, Sharon novo.
[Inaudível Observación]
Boa. Polo tanto, se o seu nome é menos
de 60, entón está perdendo sexa alí o que é delta
entre 60 e o lonxitude real.
De xeito que só se sente un desperdicio, máis bytes do que precisa.
Pero por que existe?
Certamente hai algún cabeza.
Si?
[Inaudível Observación]
Claro. Entón, ás veces pode saber o número fixo
de personaxes como 10 díxitos a un número de teléfono, por exemplo.
Pero quen lle importa, por Non basta dicir 11 de calquera maneira
ou por que non dicir 60 de ningún xeito co varchar?
Que vantaxe é que imos chegar coñecendo e proxectar
para un número fixo de personaxes?
[Inaudível Observación]
Está no camiño correcto.
Entón é optimización, pero é realmente de - si?
[Inaudível Observación]
Aceptar. Boa. Imos foco nesa última parte.
Así, a indexación.
Entón non é que se saber de antemán que todos
dos seus campos están indo a ser de 60 caracteres,
pode realmente pensa deste columna da base de datos de Excel
como tendo moi en liña recta, esquerda xustificado
e bordes xustificados dereita
xa que cada columna é de 60 carácteres de ancho.
É dicir, que esta cadea é 60 caracteres de distancia
desa corda, 60 caracteres de distancia dun presente
e este é este.
Entón, só tes que gusta de volta cando aprendín C, tiña acceso aleatorio
no mundo de matrices, mesma idea aquí.
Se a súa columna está representada usar caracteres só fixos,
Pode efectivamente índice aleatoriamente a 60 ou 120 ou 180
e pode obter en individualmente cordas moito máis rápido.
Entón, en vez diso, a súa columna tivo o bordo esquerda en liña recta por así dicir
pero un dereito moi accidentada Borde á columna
porque pode ten 10 caracteres,
15 caracteres, 5 caracteres.
Entón, iso tamén é un intercambio.
E ás veces só por intento e erro
e experimentación pode descubrir
o que realmente a elección ben é, pero estes son os tipos
de preguntas que debe ir
a través das súas mentes e / ou mesas cando chega a hora
para proxectar o seu banco de datos.
Entón, non necesariamente seguro responder, pero ten que
, Polo menos, algúns teñen ou dúas frases en presente
facer copia de seguridade de todo o que decisión que fai.
Todo ben.
Polo tanto, imos manter a rolagem nas instrucións aquí
que son UI do phpMyAdmin.
Así, o valor predeterminado para un nome, eu debería especificar
que debe ser teñen un valor por defecto de null?
¿Que pensas?
Un curso pode ter un nome nulo?
Só se sente raro, non?
Eu non podo pensar en ningún cursos sen nome en Harvard.
E quizais haxa algunha caso canto escuro
onde o curso é xa un número
eo profesor non ten escollido un nome para el, pero -
É dicir, ao diaño con iso,
como non imos nin incomodar apoiar isto.
Eu diría que, en interese de unha base de datos limpo e agradable,
imos indicar que non pode ten un valor por defecto de NULL.
Alternativamente, poderiamos facer algo así como curso sen título
que non é diferente con Mac OS e Windows facer
cando se crea un cartafol por exemplo,
pero que fai un pouco máis de sentido
para que o ser humano ver algo.
Estamos falando dun base de datos back-end, presuntamente
para catálogo de cursos.
Entón, realmente non mesmo como a idea de darlle
en nomes de cursos sen título
sempre que non é realmente axudará a ninguén.
Entón, imos deixar isto como ningún, o que significa que cando inserir
a este banco de datos, ten para dar a cada curso un nome
que se sente un pouco limpo para min.
Todo ben.
Entón desprazamento máis, agrupación.
Isto só ten que ver coa un conxunto de caracteres e outros adornos
se xa viu mencións sueca
phpMyAdmin usa-se Porque a xente
que escribiu phpMyAdmin foron sueco.
É que o PHP ou é MySQL?
Un dos dous, I Esquecín de improvisar.
Pero é por razóns históricas
pero pode expresar as carácter en inglés
que podería co Swedish polo que é en gran parte unha non-cuestión.
O CS50 Appliance, con todo, é usado - configurado para usar UTF-8,
de xeito que, xeralmente, debe non aparece para ti.
Atributos.
Así, ningún deles é realmente relevante aquí.
Vexo binario, non asinado, Zerofill non asinado,
e na actualización timestamp actual.
Este campo só é aplicable por algún campo numérico
ou algúns campos de tempo.
Entón, imos saltar que enteiramente.
Nulo. Pode este campo ser nulo?
Entón, non. Nós xa temos este tipo de conversas.
Entón, nós non queremos un valor por defecto.
Non queremos que sexa nulo.
Que tal índice?
Hai catro opcións aquí.
Que significa que especificar
que esta liña vai para ser unha chave primaria?
Lembrando CS50 ou CS165 se ten tomado.
[Inaudível Observación]
Exactamente. Así, unha chave primaria por definición, é o campo
que identifica cada ficheiro nunha tabela.
E pode contar con el para facer que a identificación único.
Entón, o que significa isto a continuación, para ser só único?
Ben, máis ou menos estes dous ten sorte
de menos de implicacións debaixo do capó.
Pero, xeralmente, a clave primaria é unha especie de contrato que fai
coa cousa base de datos.
Cando fago consultas buscar un curso,
Vou usar este determinado campo.
E nós imos volver por que pode ter dous
tales opcións aquí, primario ou único.
Único só di, este campo será único
pero eu realmente non estou facendo ningunha tipo de compromiso verbal aquí
para utilizar este campo para facer as miñas investigacións
por razóns que imos ver en só un momento.
Se especifica no canto do índice, o que significa isto para indicar
que un campo ten un índice sobre el?
Si?
[Inaudível Observación]
Exactamente. Foi óptimo para consulta.
Entón - servidor de base de datos, Oracle, MySQL, calquera que sexa,
normalmente funcionará a súa maxia nos bastidores cando fai clic
esta opción e, a continuación, prema Garde e construirá
-Normalmente unha estrutura de árbore, Árbores B se xa viu
ou oído fóra que é unha moi curto con aspecto de árbore
que lle dá moi agradable propiedades logarítmicas
durante a investigación sobre os datos.
Se non especifica un índice nun campo, o que está a suceder
para ser o corredor tempo de busca
a un arbitrario [Fonética] nome do curso?
¿Que é iso?
[Inaudível Observación]
Oh, [inaudível], lineal, non?
Se non hai ningún optimizacións revisada á base de datos
e non penso a base de datos que tipo
de datos para esperar.
O mellor que podes facer é comprobar todo cando está olhando
para algún valor, sobre todo se non podía
en realidade, ser duplicados.
Texto completo mentres tanto, nós imos acenar nosas mans agora.
Pero, xeralmente, este é un tipo de índice que permite que
para optimizar o seu contrasinal busca nun campo.
Entón, iso se pode un bo candidato
para como unha descrición do curso onde pode ter unha parella
de parágrafos e pode quere facer xogos subcadea.
Texto completo xeralmente deixar fai isto moi eficiente.
IA, esta é unha especie terrible de explicación, pero se pasar
sobre el que vai ver Incremento Auto.
Non se aplica, tanto aquí pero auto incremento é útil
pois, como campo dun int porque a base de datos vai coidar
do proceso de máis plusing cada vez que fai unha inserción.
De xeito que, aínda que dúas persoas literalmente clic en Enviar
á vez e tentar para crear unha liña de algunha maneira
na base de datos, unha das eles van obter o número I,
o outro vai chegar o número que eu máis 1.
Non ten que se preocupar
preto de dous números asignado de forma idéntica se fose
para facelo só no código.
Todo ben.
Entón eu medio que me gusta de onde temos un nome a ser.
Entón, imos facer clic en Gardar.
É este un bo proxecto para unha táboa de base de datos?
E como un aparte, se enferrujado en SQL ou clasificar
de só sempre virar un cego ollo ao que estaba acontecendo,
Eu podería ter escrito exactamente iso -
estas tres liñas en que ventá de branco e negro
na liña de comandos cliente ou eu podería ter feito
que o código de programación.
Polo tanto, todo está a facer para phpMyAdmin min, é só me Aforre o esforzo
de recordar, por veces, a sintaxe e escribindo para
como os comandos tediosos.
Todo ben.
Polo tanto, este non se sente como o mellor deseño, unha mesa de campo un.
Agora podemos ter cousas como profesores
e locais e as descricións.
Pero, aínda así, só usando o nome
para identificar campos non se sente ideal.
Que xeralmente teñen que fixo no pasado
Se xa usou bases de datos a unicamente unha liña?
Non usar varchars normalmente.
Si?
[Inaudível Observación]
É. Entón, normalmente, un número de identificación do curso.
Así, o máis común abordar aquí especialmente
cando se utiliza un cadro é en realidade só
a utilización dun número como un número enteiro.
Entón deixe-me ir adiante e facelo.
E podemos facelo nalgúns formas, pero aviso se eu zoom
no ao final aquí.
Eu vou dicir engadir un columnas ao final da táboa,
xeralmente só para visuais conveniencia de poñer IDs
no inicio do cadro aínda que este non ten certo
impacto funcional.
Entón eu vou dicir engadir un columnas
no inicio do cadro.
Vou prema Cambiar, que me dá de volta este UI aquí.
Imos chamar ese ID.
Se pensamos que imos ter non máis facer 4 millóns de cursos
campo dun int é bo.
Poderiamos incluso reduci-lo
pero o espazo é barato Entón, o que realmente importa.
Pero estamos intentando escribir Facebook agora,
Pode non ser unha cousa mala anticipar grandes Ints
que nos daría Ints de 64 bits
pero entón está literalmente a duplicación do número de bits
que está a usar, tan pequena cambio
pero algo a considerar.
Agora, este é un confuso cousa legado.
Debe lembrar de usar MySQL
que en calquera momento vostede declarar un int campo moitas veces vai ver un número
próximo a el, como o número 10.
Non ten nada que ver con o tamaño do número
ou o número de bits.
Isto ten que ver co número de caracteres que se usan
visualmente visualización que campo int
cando se utiliza unha fiestra de terminal.
Así, podemos ver que en un momento.
Entón, non se deixe enganar escribindo números
alí aínda que sexa efectivamente nos pedindo
por aquí.
Por aquí, eu vou vai adiante e dicir sen sinal.
Non hai ningunha razón para residuos todos os nosos números negativos
xa que a base de datos vai xeralmente
asumir positiva valores ou nulo.
A ID definitivamente non debe ser nula.
E o que pensa sobre o índice deste campo ID?
Imos facelo imprimación.
Entón, o que, con todo, como podo só pensar nun curso CS164
en Harvard e só un Claro CS50 en Harvard
e iso é moi moi certo global
que hai quizais excepcións [Inaudível] ambos semestres
ou algo estraño así.
Pero, máis fundamentalmente, por que é mellor
usar unha identificación numérica para integrante identificar cursos vez
que unha secuencia única?
Si?
[Inaudível Observación]
OK, interesante.
Entón, se nós tivésemos unha especie de cursos de cross-lista.
Entón, iso é un bo exemplo.
Eu non estou seguro se faría resolver que aínda
, Dándolles o mesmo Número de identificación, se é o
onde estaba indo con iso.
Non? Aceptar. Pero sempre un caso canto a considerar.
Se non o houbera unha especie de - necesitamos algún tipo
de aliasing potencialmente.
[Inaudível Observación]
Claro.
[Inaudível Observación]
Isto é un bo exemplo.
O nome pode cambiar ao longo do tempo, totalmente razoable.
Que máis?
[Inaudível Observación]
Sentímolo, dicir de novo.
[Inaudível Observación]
Si, exactamente.
Entón, realmente, isto é o verdadeiro argumento decisivo é
que o uso dun 32 bits é int Probablemente vai ser máis rápido
do que algunha variable campo de char lonxitude.
No primeiro caso, a lata literalmente caber nun rexistro,
para non falar moito menor consumo de memoria.
Neste último caso, vai ter que facer Resort [fonética]
para comparacións de cadeas que en si co lineal
no tamaño do cadea potencialmente.
Entón, é só un bo optimización,
e, en especial, que vai
para deixar-nos facer o que se chama Xunta-se de forma máis eficiente
en só un momento.
Entón, imos facelo.
Nós imos especificar que este é primario
porque eu particularmente non quere coidar ou pensar
sobre o que o número é dun curso.
Deixalos asumir o que quere que os valores que eles queren.
Eu vou dicir auto incremento para que eu poida terceirizar ese detalle.
Como no lado podes sabemos que Harvard
, Polo menos, ten único números para os cursos.
Eu non teño ningunha lembranza o que este curso é.
Sei que CS50 do número de catálogo é 4949,
totalmente arbitraria.
Pero non é estraño casos de canto en que aínda
no desaloxo registrarial de cursos de datos de catálogo,
por veces, vellos cursos cursos teñen un número como 4.
Pero técnicamente que campo é un campo de char
que simplemente inicia con 0004.
Polo tanto, aquí tamén, ten que ser coidado coa distinción
entre as cousas como un Por suposto número de catálogo
que pode ter algún humano noción de lonxitude fixa, 0004,
e non debe almacenar que, por exemplo, nun Ints.
Este tipo de campo debe ser almacenada noutro lugar.
Así, en Harvard, se estivésemos en realidade, facer un curso
ferramenta de compra, é probablemente non suficiente
para cursos de número con só 1, 2, 3, 4.
Nós probablemente imos ter
ter outro campo chamado número de catálogo,
que tamén se quere basearse única
en convencións humanas aquí pero non é a mellor opción
por un identificador único, xa que pode ser de lonxitude variable.
Pode non ser catro caracteres, pode ser cinco.
En realidade, eu creo que algúns anos, eles se moven
a causa cinco personaxes alí foron máis de 999 cursos
en total ou algo así que, ou 9.999 cursos.
Entón, isto pode ser un exemplo en que o campo non é primario
pero debe ser único.
Correo-e é outro.
Pode querer que sexa único
pero non necesariamente súa chave primaria.
Todo ben.
Entón deixe-me bater para fóra outro mesa moito máis rápido do que este.
Entón, eu vou chamar a este unha Instrutores e eu vou
dar a este un total número de columnas de dous.
Vou aprender a miña lección da última vez.
Vou chamar o primeiro ID columna.
Vou chamar ao segundo nome da columna.
Eu tamén vou facer varchar.
Vou asumir ningunha o profesor ten un nome máis
de 60 carácteres, aínda que Agora isto pode ser empurrando-o
con algúns nomes longos, especiais persoas con nomes do medio.
Isto é bo para hoxe.
Entón, imos rodar por aquí.
Imos facelo sen sinal de novo.
Imos facelo imprimación.
E nós imos permitir nomes duplicados
no caso de haber dous John Smith ou algo parecido.
E agora temos dúas táboas.
Entón, agora, iso levanta a pregunta como fago para asociar
en instrutor co curso?
Eu sinto que tipo de quedou por diante de min
porque se un instrutor ensina un curso,
o meu primeiro instinto sería realmente ser para volver
para cursos de entender, este Non foi unha boa idea.
Déixeme realmente engadir unha columna ao final da táboa,
prema en Ir e eu vou chamar iso de Instrutor.
E eu vou facelo varchar e eu vou facelo 60.
E quizais eu vou deixar nulo agora
no caso de que o curso non ten foi unsigned en instrutor
o que ás veces acontece antes prazo comeza e prema Gardar.
Cal destes proxectos prefire?
Primeiro un, onde temos unha mesa do instrutor separado
ou o segundo en que engadir un campo para o curso?
Polo tanto, é unha conexión estreita instrutor de curso.
[Inaudível Observación]
Aceptar. Boa. Pero déixeme empurrar cara atrás.
É tan sinxelo como podo escriba o nome da persoa
para esta táboa, como seguramente que ten algún valor ou -?
[Inaudível Observación]
Todo ben.
Ben, deixe-me ser difícil aquí.
Entón deixe-me dicir que este curso é CS51
e sei que se ensina este ano por dúas persoas.
Así, Henry Leitner e Jesse Tov, pero -
entón eu vou poñer unha coma entre os dous, seguro.
Eu son realmente bo en CSV de outrora.
[Inaudível Observación]
Exactamente correcto.
Así que recorrer para algo como iso,
que pode sentirse razoable e pode sentirse
como este é unha especie de intelixente.
Eu son unha especie de préstamo dun idea que está funcionando ben,
pedir unha nova idea e tipo de combina-los.
Está medio que totalmente derrotando o punto de usar a base de datos
en dúbida o primeiro lugar " un dos valores
de usalo é buscas máis rápidas por mor dos distintos índices
e táboas que poden construír para ti
polo motor de base de datos en si.
Agora, se quere buscar para todos os cursos
que Jesse ensina, agora tes para que subcadea correspondente en todo
dos campos de instrutor,
o que significa efectivamente lineal buscar de novo porque ten
para atopar este conxunto arbitrario de tres personaxes en calquera lugar
no campo instrutor precedida
dentro quizais seguido por unha coma.
Entón, iso sempre non augura nada bo.
Entón déixeme volver á mesa.
Deixe-me ir adiante para cursos, desfacer iso.
Vou só ir adiante e caer nese campo.
E se queres facelo a man,
a sintaxe é ALTER TABLE cursos caer instrutor.
Entón, imos adiante e dicir si a iso.
E volver a esta idea anteriormente
onde eu teño un separado mesa para instrutores.
Pero agora iso se sente un pouco como podo poñer un curso
na táboa do curso e instrutor
na mesa do profesor, pero eu dalgún xeito ten que conectar os dous.
E como é que propoñen que facemos isto?
[Inaudível Observación]
Boa. Entón, imos facelo.
E podería chamar iso de mesa en calquera teoría.
Vou deliberadamente chame do que unha morea
de cadros faría chamalo, entre eles,
Laravel como podes ver aquí a pouco.
Vou chamalo de curso resaltan instrutor.
Usando singular neste caso para cada unha das palabras
e en letras minúsculas de novo, e tamén co -
a continuación, en orde alfabética clasificadas a partir de esquerda a dereita.
Isto é totalmente arbitraria, senón el tende a ser un convenio
en moitas desas estruturas en PHP noutras linguas.
Cantas columnas que eu teño iso o que chamamos táboa de unión,
para unirse a outros dous mesas xuntos?
Tres columnas?
Cal deles - o que serían eles?
[Inaudível Observación]
Aceptar. Boa. Isto funciona.
E poderiamos tecnicamente cortar un canto aquí, pero moi
de cadros, en particular sería aínda dar mesmo esas liñas
IDs únicas, aínda que semanticamente a liña
que realmente se preocupan ou as columnas que realmente importan
aproximadamente son os últimos dous dos o que dixo, o curso ID
ea identificación do instrutor.
Entón, imos facelo.
Vou chamar a esta liña só ID, así como fixemos antes.
Pero iso é o que eu vou para chamar curso ID.
Ese vou chamar instrutor ID.
E eu vou especificar que todos
deles están sen sinal Porque quero
para dar o meu 4 millóns gama int.
Ningún deles debe ser nulo.
Eu estou indo a especificar que ID aínda debe ser primario.
E unha vez máis, este é só unha convención,
unha morea de cadros mesmo se non clasificar
de fundamentalmente precisa dun identificador único para a liña,
verifícase que é conveniente para o código, o SQL que está a suceder
ser automaticamente xerado por nós.
Entón, eu vou deixar isto como fondo.
Pero agora, eu medio que ter unha decisión de proxecto,
ID curso e instrutor ID.
Que índices se hai debe chegar?
Se eu vou deixar ningún índice, cal é a implicación?
¿Que é unha implicación?
Actuación como antes, non?
Se non o houbera un índice, o mellor que podes facer é tipo
de [inaudível] a través da cousa toda buscando números.
Para que non se sente intelixente.
Caso de que sexa primaria?
Entón, por que non?
Por que non primaria?
[Inaudível Observación]
Perfecto. Entón, nós rolamos fóra [fonética] imprimación.
Xa escolleu iso.
Así, debe ser único?
[Inaudível Observación]
Boa. Entón, se asumir un instrutor por curso,
totalmente ben.
E iso é sempre o caso común
pero xa adiadas un exemplo quizais familiarizado.
CS51 ten dous instrutores polo que estamos especie
de agora ferro nese caso.
Se fixésemos só permiten un instrutor,
poderiamos facer unha forma coa táboa de unión por completo,
voltar á visión anterior
e non poñer o nome da persoa quizais, pero a identificación do instrutor.
Se sabe que cada curso só como un instrutor que pode ter só
unha columna.
Pero a variabilidade é o que nos meteu en problemas.
Todo ben.
Así, debe ser único?
Non o texto completo non sentir aplicable.
Como dixemos antes de que sexa
para como subcadea correspondente para descricións.
Así que sobre o índice?
Así, o índice pode ser o mellor candidato
que di ao MySQL optimizar para a investigación sobre este
ou déixeme elaborar, optimizar a pescudas ou xunta
como veremos de aquí a pouco
de xeito que xa son un pouco máis eficiente
do que calquera cousa puramente linear.
Quero auto incrementa neste campo?
Entón, non, porque o certo elemento pai existe
na táboa dos cursos.
É aí que el é pode ir máis,
máis cando é realmente inserido.
Aquí, iso é todo vai para ser inserida manualmente
presuntamente por nós en código.
Entón, imos simplemente especificar que tanto o ID do curso
e instrutor ID teñen índices.
Agora imos adiante e gardar.
E agora, só para mostrar lle a correspondencia
entre o que é un bo GUI interface amigable
ea interfaz de liña de comandos.
Déixeme ir adiante e facer o seguindo neste ventá MySQL
Eu vou dicir o uso courses50
que é o nome arbitrario Eu dei a este banco de datos.
E agora, eu nin sequera lembrar o que fixemos.
Entón deixe-me escribir show tables
e, xeralmente, punto e coma será o seu amigo aquí
para completar a consulta.
E aí está.
Entón, aquí están as liñas, ou mellor, as táboas que temos aquí.
Agora, eu esquezo o que un curso parece,
entón déixeme que describen cursos e agora vexo unha especie de ASCII
ou unha versión do que phpMyAdmin estaba facendo
e vexo que ID é un int.
Hai que 10.
Que significa isto?
Isto só significa que cando se amosa que vai tomar
ata 10 caracteres en a xanela do terminal.
É anulável?
Non Esta é a clave primaria.
Pode ter un valor por defecto?
Non E extra que é especial bandeiras como auto incremento.
Entón imos facer un par insercións de rápidos aquí.
Eu estou indo a ir para arriba a - imos dicir.
Imos cambiar de estado a unha diapositiva
onde eu especie de pre-preparar este.
Esta é unha síntese logo de estas tres táboas.
Eu xa só manualmente escriba a primeira orde.
E aquí, eu fun adiante e introduza os outros para ti.
Este é só o cousa estilística.
Xeralmente, unha chea de xente escriba instrucións SQL en todas as tapas
e logo, os nomes das tabelas e dos nomes de campos en minúsculas,
se só porque tipo de stands
o que é a súa terminoloxía e cal é a sintaxe de datos.
Polo tanto, temos aquí tres mesas, cursos, profesores,
e cursos de instrutores.
O slide fixen con antelación, Eu non tiña o campo ID
pero iso non é verdade algo malo en todo.
Queremos ver só unha terceira columna alí.
Se eu tivese feito isto aquí?
Entón, agora déixeme propoñer que facemos unha morea de insercións.
Entón aquí vai algúns datos, Vou zoom in
Entón eu vou propoñer que en cursos,
só lidamos con tres cursos.
E escollín estes tres Porque son representativos
dalgún bo - eles teñen algunhas propiedades agradables.
CS1, CS50, CS51, eles ter IDs crecentes
pero o que é o ID é totalmente irrelevante.
Esta é só a orde en que foron auto inserido por min.
Como preto de instrutores?
Entón, agora, xa Henry Leitner ensina tanto CS1 e CS51,
este é unha especie de oportuno implicación para o noso proxecto.
E Jesse ensina CS51 Malan e ensina CS50.
Entón agora - ou mellor, estes son só IDs únicas destas persoas.
E cursos e instrutores, - instrutores do curso, teña en conta aquí.
ID1 Course, que foi CS1 se ensina
polo instrutor ID1 quen é Henry.
ID2 Course, que eu creo que foi CS50 se ensina
polo instrutor ID2, que é Malan.
E, a continuación, por fin, CS51, e conta, temos dúas liñas.
E agora é por iso que a unión táboa é poderoso se ensina
por ambos Henry e Jesse.
Entón, iso é moi bo e correcto,
pero eu mal podo Teña en conta que o principio
da miña cabeza quen é quen aquí.
Como pode, posiblemente, tratar con isto no código,
sen ter que ríxidos cousas código?
Ben, este é o lugar onde ela mesma SQL comeza a facer o noso amigo.
E eu vou propoñer que podemos escribir o seguinte.
Vou facelo no ventá de real.
Déixeme ir adiante e inserir estas cousas.
Así, na táboa de cursos imos facer exactamente o que tivemos un
momento atrás.
Eu vou adiante e dicir: imos introducir CS1 e CS50.
Imos introducir un pouco máis liñas á vez, CS51.
Agora, deixe-me ir adiante e gardar.
Todo ben, entón eu son só recreando o máis axiña
que eu poida as relacións acabamos de ver na pantalla.
E así, temos aquí Leitner, aquí temos Malan.
Imos darnos outra liña, e Tov.
Agora déixeme gardar esta.
E eu estou facendo-os deliberadamente para o mesmo fin.
Non, eu esquezo de dar este incremento automático.
Déixeme rapidamente corrixir isto.
Vou corrixir isto en o código en liña.
Que fallou como un aparte.
O feito de que eu non podía introducir Leitner e Malan
e Tov non, porque eu non fixen especificar un número de identificación, aínda que
ela está esperando un e eu esqueceu de comprobar auto incremento,
o que significa que todos eles estaban por defecto, quedando cero.
Pero iso contradi o que entón propiedade que especificou.
A chave primaria violada polo que nin sequera me deixa facelo.
Entón deixe-me corrixir isto.
Agora, deixe-me volver a Guía Inserir aquí e seleccione
que quero Leitner, Malan e, máis dunha liña, Tov.
E agora, para rematar, o único un que é un pouco difícil
a lembrar é claro instrutor.
Imos agora que inserir Claro ID1 é instrutor ID1
de xeito que é CS1 e Henry.
ID2 Curso é instrutor ID2 que é CS50 e Malan.
E, a continuación, os últimos que temos que preocuparse por suposto ID3
CS51 que é, se ensina
polo instrutor do curso 1, que é de Henry.
E tres, como tamén ensinou por 3, que é Tov.
Polo tanto, agardamos que agora temos recreado este -
caramba, eu fixen o mesmo.
Instrutor de curso precisa auto incremento.
Todo ben.
Vou facelo máis rápido desta vez, 1 curso, curso 1, 2, 2.
E agora, para rematar, facemos CS51 que ten curso ID3 e Henry.
E claro ID3 e Jesse.
Isto parece bo.
Aceptar. Entón, agora, imos voltar para a xanela do terminal.
Entón, se eu describir cursos, imos ver iso.
Se eu queira ver os cursos que eu poida agora facer seleccionar estrela de cursos,
punto e coma, e agora vemos estes valores.
E agora, o que máis que quero facer?
Seleccione estrela de profesores, iso é como eu esperaba,
e seleccione estrela de cursos - curso de instrutor de subliñado.
Entón, como fago agora xuntar-se esas táboas?
Así, a beleza de ter escollido os valores de ID, deste xeito é
que, se pensar sobre tendo a mesa de curso
e o instrutor mesa e, a continuación, inserindo
entre os dous na súa mente o instrutor do curso
táboa que podes tipo de liña se todos estes columnas ID
de xeito que fundín-los en unha columna masiva que ten todo
da información Nós nos preocupa.
A sintaxe de SQL para este non é necesariamente evidente,
pero imos ver se podemos facelo.
Entón escolla estrela de cursos,
e hai un xeito que poucos como podemos facelo.
Vou bater Escriba só para tipo de cousas formato ben,
pero esa frecha é só unha síntoma da ferramenta do lado do cliente,
non ten nada que ver coa propia SQL.
Entón escolla estrela de cursos.
Vou unirse xa a táboa de cursos
na mesa do instrutor do curso.
Como? No campo chamado courses.id curso igualando
resaltan instrutor dot cal é o nome
do campo correspondente aquí que quero unha parella.
Non se ID.
É - o que, desculpe?
>> ID Course.
OK, déixeme afastar.
Pero quero aproveitar un paso adiante.
Eu xa fixen iso mesa e un agasallo.
Agora quero tirar este cara tamén.
Entón, deixe-me aínda máis xuntar esa cousa toda
sobre o instrutor de mesa en que?
Subliñado Curso id instructor.instructor
igualando instructors.id.
Así, podería escribir esta consulta en algunhas formas.
A orde en que eu fixen iso non é tan importante.
Eu medio que fixen iso en miña mente, de esquerda a dereita.
Poderiamos ter feito isto nalgunhas formas diferentes
pero agora teño a punto e coma e prema Intro,
Repare que eu atrás un novo táboa temporal, un conxunto de resultados
por así dicir, en falar de base de datos.
E o que eu teño nesta cousa?
Teño en ID, un nome, outro ID, que é unha especie de confundir
para min, no momento, o ID do curso,
un instrutor ID, ID e nome.
Así, ao final do día temos os datos agora.
Podo ver que CS1 se ensina por Leitner, CS51 se ensina
por Leitner e Tov, e CS50 se ensina por Malan.
Pero estou un pouco nervioso sobre esa ambigüidade que eu creei.
Cal é a ambigüidade Estou aludindo?
Si?
[Inaudível Observación]
Hai tres columnas de identificación.
Así, podemos realmente corrixir isto e imos indo realmente
de aprazar a nosa estrutura en definitiva, para axudarnos con iso,
pero verifícase que hai unha palabra clave en SQL chamado S,
onde pode especificar un de feito, un nome novo para un campo
para que poidamos evitar este ambigüidade completamente.
Pero entender que se non o facemos abordalo-la dalgunha forma, como con
a palabra clave ou un cadro,
hai, potencialmente, este ambigüidade se tentar
para acceder o campo ID porque claramente hai quen
con nomes duplicados alí.
Polo tanto, esta é unha unión e creo que no ollo da súa mente o mellor xeito
para pensar sobre iso realmente é tomar as dúas táboas,
aliñar a eles en xeito que sexa.
E isto é unha chamada unión interna, no sentido de
que estamos combinando as táboas aquí.
Existen outros tipos de xunta que podemos atopar
ao longo do tempo como unións externas,
pero para a maior parte desta é probablemente o máis común
para reconstrución de datos.
O que fixemos é agora xeralmente o que se chama
normalizar os datos, de xeito que non hai duplicación en calquera lugar
nas súas táboas.
E por duplicación, eu o faría fixeron que a primeira visión.
Se tivésemos mencionado Leitner e Tov en varios lugares
na súa base de datos, que non é xeralmente a mellor decisión
sobre todo se o seu nome podería cambiar de horas extras ou, no caso
do matrimonio, o nome de solteira poder cambiar-se só quere un
lugar canónico por algún valor de datos como un nome.
Todo ben.
Entón, para recapitular, tivemos un algunhas decisións de deseño para facer
e os máis importantes probablemente reducida a uns
destas opcións de índices.
Pero déixeme salientar outra cousa tamén.
Se eu voltar phpMyAdmin,
un recurso que non pode encontrar antes é
o seguinte.
Se eu fose para instrutor do curso, Eu xa indicado que algúns
estas teñen índices.
Pero déixeme ir á estrutura guía de instrutor do curso.
Deixe-me agora prema índices e teña en conta o seguinte.
Estou aquí especificado que hai unha chave primaria
na columna chamada ID.
Isto é un pouco complicada forma de especificar cardinalidade
e así por diante, como referíndose a o tamaño do campo en bytes.
Pero agora eu tamén teño outro campo, ID curso, que é -
ID curso que está feito con antelación e único, Aceptar.
Eu fixen este en avanzar nós.
Entón, por que é iso - déixeme caer isto por mor da discusión.
Oh, vostede sabe o que eu fixen?
Aceptar. Así, en principio, un dos perigos do uso dunha ferramenta gráfica
así, cando estabamos Crear esta táboa de unión,
mesa instrutor do curso, Recordamos que especifiquei
que quero un índice neste campo
e un índice neste outro campo.
O efecto colateral verificación de ambas caixas
na mesma pantalla é que phpMyAdmin detectada a partir diso,
que quero e non dous índices separadas
que quero xuntar un índice que xeralmente só é útil
ou máis útil cando está buscando nun campo non
pero ambos os campos.
E é por iso que tivemos eles conxugan alí
por iso deixei-o porque iso Non era o que eu pretendía.
Pola contra, eu vou para renovar este aquí.
Eu estou indo a ir á ID curso
e baixo máis eu son só vai dicir engadir índice.
E eu estou indo a ir en instrutor ID e dicir engadir índice.
E agora, se nós, prema aquí, aviso temos tres índices,
fondo e, como eu destino se unha para cada
desas claves estranxeiras.
E eu chamo-lle raro porque ID curso neste mapas de mesa
a que campo, só para ser limpar, noutra táboa.
A clave primaria chamada ID, na táboa chamada cursos,
e mesmo negocio a outro.
Pero agora, é un interesante enganar e realmente técnica.
Eu só fun adiante e déixeme facelo un pouco máis devagar.
Na mesma pantalla, aviso di vista Relación aquí.
Premo iso e agora eu entender comeza a facer algunhas restricións.
Así, unha das vantaxes tamén
non só a través conceptualmente claves estranxeiras e outras táboas
como temos só é que, ao establecer un índice
sobre eles pode que o axuda de base de datos aínda máis
garantir a integridade dese campo.
En concreto, podo agora especificar vía esa caída
baixo que o campo curso ID
neste cadro, de feito mapas para courses.id.
Do mesmo xeito, subliñado instrutor ID mapeado para instructors.id.
Agora, por que isto é útil?
Ben, repare, á dereita lado o que parece agora.
Agora podo ensinar o base de datos que se Henry
por exemplo, nunca se apousenta ea súa liña desaparece
da mesa do instrutor totalmente sendo así
eliminado, podo través deste fervenza visión garantir
que todos os cursos que ensina son non está asociado con el.
Podo ensinar a base de datos para eliminar as liñas
nesta chamada táboa de unión automaticamente se Henry ou se un
dos seus cursos desaparece.
Agora, por que iso é atractivo?
Si?
[Inaudível Observación]
Só ten que facelo xa e longo prazo, non?
É moi fácil se unha especie de as persoas veñen e van, os cursos veñen
e van, a base de datos podería só se chea de cursos
e cos profesores que non son máis relevantes para o conxunto de datos.
E os datos comeza a estar moi desorde e sucio e vello,
e así por aquí, podemos clasificar
de facer cumprir algunhas das esas restricións.
Si?
[Inaudível Observación]
Sabe por medio deste.
Esta é a pantalla onde estamos especificando un enlace
entre clave estranxeira e clave primaria.
Entón, toda a nomenclatura convencións que aludi
anteriormente son só convencións.
Non hai ningún significado inherente.
Esta é a pantalla que só é útil
despois que especificou índices en cada un destes campos, como fixemos.
E para iso temos suspendida algunhas cousas, por exemplo
se un curso é excluído que poida realmente evitar que a supresión
de ocorrer se hai é unha liña nesta táboa
só dicindo, Restrinxir.
Noutras palabras Henry non pode retirarse
ata que disociar do CS51 e CS1.
Entón, iso é unha cousa boa.
Pero podería desencadear erros no seu código
se non se anticipar que, ou podemos ter unha fervenza,
unha fervenza semellante ao gusto follas de estilo en cascada
ea fervenza fervenza significa que se unha -
Henry se apousenta-lo - por estar excluído
así será a súa liña aquí estar excluído.
Ningunha acción non significa nada ou nulo é unha especie de útil se tipo
de querer algún rexistro histórico de Henry ensinar CS51,
pero só se quere que o campo de ser nulo de tal forma que as liñas alí
pero non é por máis tempo asociada a el.
Entón, estas son moi poderosos técnicas que pode
e usar, a pesar de do interese particular
de gardar vostede de ti mesmo.
Entón deixe-me facer mención dun algúns detalles finais aquí,
ingredientes cos que que poden ser útiles
coma nós planeamos para o proxecto de base de datos.
Tamén ten opción sobre o motor de base de datos
que usa no seu código.
Se está familiarizado de CS161 pode -
ou 61, pode xeralmente estar familiarizado cos sistemas de ficheiros.
E hai cousas como, NTFS e HFS +
e X2FS4 [fonética] e 3 e así por diante.
Hai diferentes formas de almacenar datos na mesa.
De igual modo existen diferentes medios de almacenamento de datos
nunha base de datos, por defecto, polo menos, o dispositivo
coa última versión do MySQL
Temos que chegou a utilizar o motor de base de datos chamado, NoDB,
que soporta unha algunhas características interesantes.
Pero outro común é tamén chamado MyISAM e aínda outro
que se pode usar é a memoria, o que significa non poñer nada
no disco, só manter cousas na memoria.
Para a maioría, probablemente non vai dar mal só comezando
con NoDB, pero para todos os proxectos que tenden a involucrar altas taxas
de inserción, por exemplo, como unha morea de rexistro de rápido,
centos de cousas por segundo ou miles de cousas.
Cando ten un chea de cousas a suceder
na base de datos entón este tipo
decisións de nivel de menor comezan a se involucrar.
A funcionalidade de texto completo para exemplo funciona só no MyISAM
de xeito que ten unha implicación.
Pero ten que lembrar iso, imos polo menos motivar porque nos preocupa
sobre NoDB en particular.
A condicións de carreira xeralmente refírese a que?
Todo ben, esta é unha alusión a un exemplo algúns
de que pode ter oído falar en ano pasado se 161 ou 50
onde ten un compañeiro de cuarto, tanto de que realmente gusta de leite,
un de vós chega na casa abre por primeira vez a neveira non hai leite,
pechar a ruta frigorífico través rúas para CVS e obter
na cola para mercar un pouco de leite.
Mentres tanto, o seu compañeiro de cuarto ven para acá.
Ela tamén lle gusta de leite.
Abre a neveira e entende ningún leite.
Aquí ela, a continuación, vai para o almacenar, quizais o outro CVS.
Fast forward uns minutos despois volta e agora ambos
de ter adquirido leite.
Un deles está indo agora romper, porque non
como o leite que moito e este é un problema, non?
Porque vostedes dous inspeccionados o estado dalgúns variable
e tomou unha decisión con base sobre el, aínda que o Estado
desta variable foi esencialmente no proceso de ser cambiado,
todo sexa lentamente sobre o cantidade de tempo que leva
para ir e volver do CVS.
Entón, o que é unha especie de certo idiota mundo solución a este problema?
Deixe unha nota, non?
Xa pasou a última vez.
Sempre deixe unha nota ou cadeado a cousa literalmente.
E digo cadeado, porque Se tomar ou tomou CS161,
bloqueo é un dereito fundamental idea en que tipo de mundo.
Así, as condicións de carreira poden xurdir tamén no mundo dos datos
e ten que lembrar, se cadra desde CS50 financiar, se tomou 50,
este código que realmente deu vostedes na especificación
no momento, para que o seu operación é chamada atómica.
Se quixese, neste caso, mercar unha parte do stock
e que o stock ten algún símbolo particular.
Contámosvos para usar o código como isto porque por medio da presente
na actualización de unha chave duplicada sintaxe, que está construído
en MySQL que está efectivamente facendo tanto na inserción
ou en actualización despois facendo unha selección para ver
se un stock xa está aí dentro.
Noutras palabras, o análogo en o mundo de mercar un stock
de leite e o neveira pode ser, en primeiro lugar,
antes de comprar unha participación de Google pode querer escoller
a partir da base de datos de todos os accións de Google, que é propietario de David
para ver se ten cero ou máis.
Unha vez que ver se é propietario cero ou máis ten
para, a continuación, faga o seguinte.
Ten que facer unha inserción
se ten causa cero " non hai ningunha liña de David, con todo,
ou ten que facer unha actualización se, polo menos en teoría, quere
ter unha liña por usuario.
O problema é a selección que o número de accións
e logo, actualizar ou inserción podería ser detido
por outra persoa noutro terminal de ordenador tentando mercar
ou vender algunhas de David accións de accións quere
para bos propósitos ou especie de propósitos maliciosos.
É como ir á tenda cando o seu compañeiro de cuarto queda atrás
e comproba o estado da variable.
Polo tanto, esta sintaxe no momento que era unha especie de adecuada
para CS50, evita que problema por completo.
E iso só fai todo isto maxia de bloqueo para ti,
pero agora con estes tipos de proxectos para este curso
que probablemente ha envolven conxuntos de datos máis complexos,
non pode conseguir sempre esta Atomicidade.
Todo acontece dunha soa vez ou non en todos
sen interrupción tan elegante.
E así, MySQL, outra motor de base de datos,
apoio cousas chamadas peches,
a través do cal pode dicir este bloqueo mesa, de xeito que só un deleite
e, xeralmente, só un usuario pode toca-lo en calquera punto no tempo
para ler ou escribir e entón podes desbloquealo.
Este é un exemplo dun de referencias propias do MySQL,
onde se ten como unha base conta que estás
deducir o diñeiro de e logo, engade o diñeiro.
Pode querer asegúrese de que tanto
isto acontece xuntos
de xeito que non hai ningunha erros matemáticos
e un sen perdas diñeiro, de algunha maneira.
O problema co atado aínda que en unha base de datos é
que xeralmente significa toda a táboa é bloqueada,
o que significa que se ten un centenar de persoas que tentan
para facer negocios co banco liña ao mesmo importe
de tempo de só unha das poden ir á vez.
Cal é parvo, sobre en servidores hoxe
que ten oito suposto, 16 Por suposto, ten unha cantidade enorme
de memoria, non hai ningunha razón para serializado todo
das súas transaccións aqueles clientes están indo só
para interactuar cos seus propios rexistros.
Entón NoDB permite que fai cousas máis intelixente
e este será normalmente o achegamento adoptada no código,
como se usa algo chamada a transacción.
E fai iso xeralmente en código PHP,
Código Ruby, Python, o que sexa.
Pero o código SQL que se en última instancia, se emprega este,
normalmente.
Comezar a transacción, entón especificar dúas ou máis consultas
que quere realizar por completo
sen interrupción ou non en todos.
Non pode mesmo ser algún seleccionar declaracións en
ou algunhas exclusións ou actualizacións.
Pero a cousa boa é que o base de datos vai ser intelixente o suficiente
para asegurarse de que ela só vai bloquear as liñas que están realmente
implicados neste actualizacións ou selecciona ou exclusións.
Entón, se ten miles de liñas e só está tocando tres
deles, só o subconxunto da táboa será bloqueada
o que significa que os outros 99 os clientes poden tocar as súas liñas
sen ser serializado e retardado por ti.
Mentres tanto, este é o mellor aspecto de transaccións.
Son transaccións nun sentir como 161 nun sistema de arquivos,
son transacional
o que significa que pode rolar Los de volta, pode desfacelo-las.
Isto é como a orde ou controlar F de bases de datos.
Se descubrir que parte camiño a través de todos
da súa operación de datos diferentes, lanzar, algo está mal.
Vostede literalmente realizar unha diferente rolo pesquisa de volta
e todos estes tendencia - Todos das demostracións que executou
despois de dicir inicio transacción desaparecer
como se nunca tivese acontecido,
que é unha sorprendente cousa poderosa.
E estes son os tipos de cousas, por suposto, en 50 nós medio
de varrer para debaixo da alfombra e só tipo de asumir
que todo estará ben.
Pero unha vez que comezar a pensar en proxectos reais
e os usuarios reais eo integridade do seu banco de datos,
estes son os tipos de decisións de proxecto
que van ser importantes.