>> Muy bien.
Así, sin más preámbulos, SQL, Structured Query Language.
Así que, probablemente acostumbrado a este menos en CS50, tal vez en CS165,
tal vez en su propia proyectos personales.
¿Y qué es SQL te deja hacer, en un SQL Server de manera más general?
¿Sí?
[Inaudible Observación]
Bueno, eso fue muy manera segura de decirlo.
Sí. Por lo tanto, permite almacenar datos
y permite más importante realizar consultas de datos.
Y este es un paso adelante
desde el uso de algo más simple como un archivo CSV, claro.
Variables separadas por comas.
Valores similares.
Del mismo modo le permiten guardar información de una fila
en un archivo de texto.
Pero cuál es el inconveniente de un CSV para almacenar sus datos,
a pesar de que efectivamente obtener las filas y columnas de él?
Sí.
>> Usted no 'tiene de la misma organización
eficiencia [inaudible].
>> Usted no tiene la misma eficiencia organización.
¿Qué quieres decir?
>> Bueno, como [inaudible] tienen como principal [inaudible].
>> Aceptar. Sí.
>> Es una base de datos relacional usted puede tener varias bases de datos
vinculados el uno al otro de formas muy específicas.
>> Aceptar. Bueno.
>> Es [inaudible] para configurar un archivo CSV.
>> Y déjame modifico un poco de terminología.
Así varias tablas dentro de una base de datos, seguro,
y que va más allá de lo se puede hacer con un solo archivo CSV.
Pero en realidad la limitación con CSV yo diría es
que la ineficiencia de todo.
Es muy fácil de diseño.
Pero si usted quiere hacer un consulta, lo que es el tiempo de ejecución
de cualquier consulta de selección en un archivo CSV?
Quiero decir que es grande y viejo [inaudible], bien, porque en el peor de los casos,
se levantaron en la parte inferior.
Incluso si se hubiera ordenado el conjunto Archivo CSV, si usted no sabe
que por adelantado, bueno, usted todavía va a tener
Busca en todo el asunto.
Así, entre las cosas vamos a conseguir
el uso de un real base de datos utilizando un lenguaje
como SQL es que podemos consultar y lo que podamos por adelantado
como los diseñadores de bases de datos especifican cuáles son los campos
que probablemente se va a tener preguntas acerca de lo que la gente
en MySQL o Microsoft u Oracle,
quien ha hecho de la base de datos que está utilizando se puede hacer todo
de la ardua labor de averiguar, OK,
dado un millón de estos IDS.
¿Cómo podemos Layout - a cabo en la memoria?
Una especie de árbol estructurar tal vez,
de modo que cuando usted hace realmente ejecutar Select,
que es algo que es logarítmico o logarítmico
de logarítmica en el tiempo en lugar que en realidad delegando
en algo lineal.
Así que nos dieron una gran cantidad de rendimiento de esa manera.
Y también podemos almacenar mucha más datos más fácilmente porque el SQL
Server se almacena normalmente en la memoria RAM a pesar de que las partes
de que podría ser almacenado en el disco y usted probablemente sabe por ahora
que la memoria RAM es generalmente más rápido que los discos,
así que eso es una buena cosa.
Y también podemos manejar concurrencia mucho mejor.
Si usted ha tomado 165 o 161, usted sabe que si dos personas tratan
a hacer lo mismo a la vez en un sistema,
cosas malas en general, puede suceder.
Así entre las otras características que puede obtener si diseñamos nuestras mesas
de la manera correcta es mejor soporte y seguridad
cuando se trata de concurrencia.
Así, dos personas en dos partes
del mundo a través de la misma sitio web, si ambos intentan
comprar algo en el mismo tiempo, que el orden no va
para ir en forma simultánea.
De alguna manera ellos pueden serializar por alguien que no sea la nuestra -
alguien que no sea nosotros mismos.
La voluntad de bases de datos hacer eso por nosotros.
Así que cuando su forma más simple,
SQL nos permite una consulta base de datos relacional.
Una base de datos relacional es uno que tiene uno
o más tablas en ella normalmente.
Y si esto es un poco desconocido,
usted puede realmente pensar en esto como Excel o números
o hojas de cálculo Google.
Sólo tiene filas y columnas y por lo general la parte superior de cada
de las filas tiene un nombre para él.
Así que este podría ser el ID columna, la columna nombre,
la columna de la dirección y así sucesivamente.
Y entonces usted puede tener múltiples dichas tablas si desea
para empezar a trazar diferentes tipos de datos.
Pero usted puede recordar por lo menos desde CS50 que intentamos
para darle una interfaz gráfica de usuario basada- herramienta [inaudible]
para gestionar su base de datos.
Se llamaba phpMyAdmin.
Así que es sólo una coincidencia que fue escrito en PHP, en realidad,
pero era justo basado en la web una terminar frente a una base de datos.
Y a través de las diferentes pestañas y enlaces, ¿podría comenzar
para configurar una base de datos por sí mismo.
Pero una buena herramienta para empezar a conseguir un poco más cómodo
con es también el cliente de línea de comandos.
Por lo tanto, si se utiliza el aparato CS50 o en realidad con cualquier PC macro
que tiene una línea de comandos de MySQL cliente, también puede hacerlo especie
de la vieja escuela, como este.
Como acotación al margen del proyecto MySQL, por lo menos la versión de código abierto
de que ahora se llama MariaDB para diversos motivos puedes leer
en la Wikipedia, pero que es el mismo software,
que es la misma sintaxis y así sucesivamente,
más o menos la misma base de código.
Y así, cuando estoy en el este Prompt ahora puedo interactuar
con mi base de datos mucho más manualmente.
Así ejemplo de ello, déjame ir por delante
y acaba de abrir una ventana de terminal.
Me pasó a utilizar el CS50 Appliance, pero usted puede hacer esto
en la mayoría de cualquier sistema en que usted tiene el derecho
software instalado.
Y yo voy a hacer MySQL-u por nombre de usuario John Harvard
en este sistema en particular, p- una contraseña que voy escribo
en un poco más segura golpeando Intro.
Ahora estoy me pide.
Voy a escribir carmesí en el Appliance CS50
y ahora veo esencialmente que la misma pantalla.
Pero hay comandos ahora que podemos empezar a escribir
como mostrar las bases de datos, y que me va a mostrar todo
de las bases de datos que tengo ya creados en el sistema,
más o menos la misma lista puedes ver en phpMyAdmin.
Hay un par de otros como esquema de información y de pruebas,
que si te asomas alrededor del CS50 Appliance, que esconde algunos
de estas tablas de nivel inferior
pero han sido allí todo este tiempo.
MySQL en realidad tiene bajo nivel propiedades como nombres de usuario
y las contraseñas de la base de datos sí mismo, no para su aplicación
que es posible que que se ejecuta en la parte superior de la misma.
Así que por adelantado, hoy, creado un par de bases de datos,
uno de los cuales se llama courses50.
Lo más probable es que algunos de ustedes han utilizado Herramienta de compra supuesto CS50,
que es una gran interfaz para catálogo de cursos del registrador.
Y esto es en realidad una buena conjunto de datos que hablar porque,
uno, que somos una especie de todo obviamente familiarizados con cursos
y los instructores y reuniones lugares y toda la clase
de las cosas ordinarias de la universidad,
pero también tiene algo de oportunidades interesantes
para el diseño.
Así que pensamos que usaríamos la noción de un catálogo de cursos
y una herramienta comercial como ejemplo a lo largo de hoy para ordenar
de enmarcar algunos de los diseños decisiones que tenemos que tomar.
Así que vamos a empezar por ahí.
Supongamos que yo realmente quería para representar a la súper simple
por supuesto, las compras de herramientas.
Y el mundo más simple Me imagino y uno es
en el que hay cursos y hay instructores.
Y supongamos que el bien de la discusión
que cada curso tiene al menos un nombre.
Así que vamos a empezar a dibujar esto.
Voy a usar phpMyAdmin sólo para su conveniencia,
así que no tenemos que escribir todas las consultas de forma manual.
Pero aquí estoy, en mi base de datos courses50.
Si no está familiarizado con este, que va a ser muy fácil una vez que te sumerjas
a su propio proyecto si desea utilizarlo.
Voy a crear una tabla llamada Cursos
y sólo puedo pensar de un campo
por ahora, el nombre de un curso.
Voy a seguir adelante y digamos darme una columna.
Ahora, al recordar a obtener una interfaz que es un poco
como este.
Y la otra boca francamente de phpMyAdmin es que una especie
de auto-instrucción y que a través de los menús desplegables, puede ordenar
de ver lo que su posible las decisiones de diseño son.
Así que me voy a dar cada curso de un nombre.
Ese es el nombre de esta columna.
Y ¿qué hay de su tipo de datos?
La mayoría de ustedes deben saber a menos algunos de estos tipos de datos
de la experiencia previa.
Lo que es apropiado por nombre del curso?
Sharon?
>> Varchar.
>> Aceptar, varchar que es variable char.
Y lo que hace que significar más técnicamente?
[Inaudible Observación]
Aceptar. Así que es una cadena.
Y el aspecto var de lo que implica?
Variable. Pero lo que Qué significa eso?
¿Sí?
[Inaudible Observación]
Exactamente. Así que es una variable número de caracteres
en la cadena hasta hasta cierto máximo.
Así que aquí está nuestra primera decisión de diseño.
De hecho, tenemos que decidir cuántos bytes como máximo
asignar a cada una de esas cadenas.
En términos generales, usted desea especie de no hacerlo demasiado pequeño,
lo haga demasiado grande 'Causa obvia
si es demasiado pequeña no eres más que va a empezar a truncar los datos de
y si no se pierden datos.
Y si es demasiado grande, no eres más que especie de decir la base de datos
a esperar y optimizar para más datos
de lo que podría de hecho alguna vez.
Entonces, ¿qué es un sentimiento razonable número del nombre de un curso?
60? OK, así que 60.
Eso parece bastante razonable
siempre es que no hay excepciones a eso.
En realidad no hay duro, regla fija.
Para ser honesto, para razones históricas mucho
de la gente elegirá 255 Porque desde hace años que era una especie
del máximo predeterminado utilizando 8 bytes - 8 bits como su contador.
Me gustaría más [inaudible] podría utilizar potencias de 2
pero es una especie de importancia.
Así que podemos ir con 60.
Eso parece razonable, siempre
ya que con el tiempo no me arrepiento Porque eso es una cota superior.
Ahora, supongamos lo contrario había tomado una decisión,
chars no variable, pero sólo el campo de caracteres.
Así que a diferencia de C y C + +, carbón de leña no significa que hay un carácter
y bases de datos que generalmente significa un número fijo
de caracteres de una cadena.
¿Cuál sería la boca y / o desventaja de mi elección de 60
para un campo char, en lugar de varchar?
Esta es exactamente la primera clase de la decisión que tendrá que hacer
al inspeccionar [fonético] fuera de proyectar con sus socios.
Sí, Sharon de nuevo.
[Inaudible Observación]
Bueno. Así que si el nombre es menos
de 60 entonces usted está perdiendo lo que el delta es
entre 60 y el longitud real.
Así que sólo se siente un desperdicio, más bytes que usted necesita.
Pero, ¿por qué existe?
Seguramente hay algún revés.
¿Sí?
[Inaudible Observación]
Claro. Así que a veces podría saber el número fijo
de personajes como 10 dígitos un número de teléfono, por ejemplo.
Pero a quién le importa, como por qué No acaba de decir el 11 de todos modos
o por qué no decirlo 60 de todos modos con el varchar?
¿Qué ventaja Cómo llegamos conociendo y diseñar
para un número fijo de caracteres?
[Inaudible Observación]
Estás en el camino correcto.
Por lo que es la optimización, pero que es realmente de - sí?
[Inaudible Observación]
Aceptar. Bueno. Vamos enfoque en la última parte.
Así indexación.
Así que resulta si saber de antemano que todo
de sus campos se van a ser de 60 caracteres,
realmente se puede pensar en este la columna en la base de datos de Excel
como tener muy recto, justificado a la izquierda
y los bordes rectos justificados
porque cada columna es de 60 caracteres de ancho.
Esto significa que esta cadena es de 60 caracteres de distancia
de esta cadena, 60 personajes alejados de éste
y éste y éste.
Por lo que sólo desea volver al aprendido C, que tuvo acceso aleatorio
en el mundo de las matrices, misma idea aquí.
Si se representa la columna usando caracteres de longitud sólo fijos,
usted puede efectivamente índice al azar a 60 o 120 o 180
y se puede obtener en forma individual cuerdas mucho más rápidamente.
Entonces, si en cambio, su columna tenía un borde recto izquierdo por así decirlo
sino un derecho muy accidentado el borde de la columna
porque es posible que tener 10 caracteres,
15 caracteres, 5 caracteres.
Así que esto también es una solución de compromiso.
Y a veces sólo a través del ensayo y error
y la experimentación puede usted imaginar
lo que realmente la decisión correcta no es más que estos son los tipos
de preguntas que debe ir
a través de sus mentes y / o mesas cuando llega el momento
el diseño de su base de datos.
Por lo tanto, no necesariamente derecho responder, pero que debiera
al menos tener algún frase o dos en mente
hacer copias de seguridad lo decisión que tomes.
Está bien.
Así que vamos a mantener el desplazamiento en las instrucciones aquí
que son la interfaz de usuario de phpMyAdmin.
Por lo tanto, el valor predeterminado para un nombre, debo especificar
que debe ser tiene un valor predeterminado de null?
¿Qué piensa usted?
¿Puede un supuesto tener un nombre nulo?
Sólo parece extraño, ¿verdad?
No puedo pensar en ninguna cursos identificados en Harvard.
Y tal vez hay algo de caso oscuro rincón
, cuando un curso se le da un número
y el profesor no tiene elegido un nombre para él, pero -
Quiero decir, al diablo con eso,
como vamos ni siquiera moleste apoyar eso.
Yo diría que en el interés de una buena base de datos limpia,
vamos a especificar que no se puede tener un valor predeterminado de null.
Alternativamente, podríamos hacer algo como supuesto sin título
que no es diferente con Mac OS y Windows hacer
cuando se crea un carpeta, por ejemplo,
pero hay que hace un poco más de sentido
por lo que el ser humano ver algo.
Estamos hablando de un base de datos back-end, presumiblemente,
de catálogo de cursos.
Así que realmente no me incluso como la idea de darle
en los nombres de los cursos sin título
ya que eso no es realmente va a ayudar a nadie.
Así que vamos a dejar esto como ninguna, lo que significa que cuando se inserta
en esta base de datos, usted tiene para dar a cada curso de un nombre
que se siente un poco limpiador para mí.
Está bien.
Así que desplazarse más lejos, el cotejo.
Esto sólo tiene que ver con juegos de caracteres y otras cosas
si alguna vez has visto menciones de Sueca
phpMyAdmin es Porque la gente
quien escribió phpMyAdmin fuera de Suecia.
¿Eso es PHP o es MySQL?
Uno de los dos, olvidó brusco.
Pero es por razones históricas
pero usted puede expresar cada carácter en Inglés
que pueda hacerlo con sueca por lo que es en gran parte un problema inexistente.
El CS50 Appliance aunque es utilizado - configurado para utilizar UTF-8,
por lo que por lo general debe no abrirá para usted.
Atributos.
Así que ninguno de estos son realmente relevante aquí.
Veo binario, sin firmar, Zerofill sin signo,
y en la actualización de marca de tiempo actual.
Ese campo sólo se aplica por algún campo numérico
o algunos campos de hora.
Así que nos saltaremos sobre que en su totalidad.
Null. ¿Puede este campo sea nulo?
Así que no. Ya tenemos ese tipo de conversaciones.
Así que no queremos un valor predeterminado.
Nosotros no queremos que sea nulo.
¿Qué pasa con el índice?
Hay cuatro opciones aquí.
¿Qué significa si especificamos
que esta fila se va ser una clave principal?
Pensando en CS50 o CS165 si usted ha tomado él.
[Inaudible Observación]
Exactamente. Así que una clave principal por definición, es el campo
que identifica de cada fila de esta tabla.
Y usted puede confiar en él para hacer que la identificación única.
Así que, ¿qué significa luego simplemente ser único?
Bueno, algo de estos dos tiene suerte
de bajo implicaciones debajo de la capucha.
Pero en general, la clave principal es una especie de contrato que usted haga
con la cosa de la base de datos.
Cuando hago consultas en busca de un curso,
Voy a utilizar este campo particular.
Y vamos a volver a por lo que podríamos tener dos
dichas opciones aquí, primaria o única.
Unique sólo dice, esta campo va a ser único
pero yo no estoy haciendo ninguna tipo de compromiso verbal aquí
para utilizar ese campo hacer mis búsquedas
por razones que ver en un momento.
Si especificamos en lugar de índice, ¿qué significa para especificar
que un campo tiene un índice sobre el mismo?
¿Sí?
[Inaudible Observación]
Exactamente. Ha sido optimizado para la consulta.
Así que - servidor de base de datos, Oracle, MySQL, lo que sea,
generalmente trabajar su magia detrás de la escena una vez que haga clic
esa opción y luego haga clic en Guardar y se va a construir
por lo general una estructura de árbol, Árboles B si usted ha visto
o escuchado fuera de que es un árbol muy corto buscando
eso te da muy bien propiedades logarítmicas
en la búsqueda de los datos.
Si no se especifica un índice en un campo, ¿qué está pasando
al ser el funcionamiento tiempo de búsqueda
para una arbitraria [Fonético] Nombre del curso?
¿Qué es eso?
[Inaudible Observación]
Oh, [inaudible], lineal, ¿no?
Si no hay optimizaciones otorgada a la base de datos
y usted no ha pensado la base de datos de qué tipo
de los datos para esperar.
Lo mejor que puedes hacer es cheque todo cuando se está buscando
para un cierto valor, especialmente si no pudiera
de hecho ser duplicados.
De texto completo mientras tanto, vamos a agitar nuestras manos por ahora.
Pero, en general, este es un tipo de índice que permite
para optimizar la palabra clave busca en un campo.
Así que esto podría ser un buen candidato
para como una descripción del curso donde es posible que tenga un par
de párrafos y usted puede ser querer hacer coincidencias de subcadenas.
De texto completo por lo general deja lo haces bastante eficiente.
AI, se trata de una especie de siniestro de la explicación, pero si pasemos por
sobre ella verás Incremento automático.
No es aplicable tanto aquí pero incremento automático es útil
para como campo de un int porque la base de datos se hará cargo
del proceso de más plusing que cada vez que haces una inserción.
Así que, incluso si dos personas literalmente, haga clic en Enviar
al mismo tiempo y tratar para crear una fila de alguna manera
en la base de datos, uno de ellos conseguirán el número I,
el otro será conseguir el numero mas 1.
Usted no tiene que preocuparse
cerca de dos números que son asignado de forma idéntica si fueras
hacerlo usted mismo en el código.
Está bien.
Así que un poco como cuando tenemos un nombre para ser.
Así que vamos a hacer clic en Guardar.
¿Es este un buen diseño para una tabla de base de datos?
Y en un aparte si oxidado en SQL o especie
apenas gire siempre una persiana ojo a lo que estaba pasando,
Yo podría haber escrito exactamente eso -
esas tres líneas en ese símbolo blanco y negro
en la línea de comandos cliente o que podría haber hecho
que en el código de programación.
Así que todo phpMyAdmin está haciendo por mí, es sólo que me ahorra el esfuerzo
de recordar a veces el sintaxis y escribir por
como comandos tediosos.
Está bien.
Así que esto no se siente como el mejor diseño, una mesa de campo uno.
Ahora podríamos tener cosas como profesores
y locaciones y descripciones.
Pero incluso entonces, el uso sólo de nombre
para identificar cursos no se siente ideal.
Lo que generalmente tienen hemos hecho en el pasado
si ha utilizado las bases de datos de forma única las filas?
No usar varchars normalmente.
¿Sí?
[Inaudible Observación]
Sí. Así que por lo general un ID de golf.
Por lo tanto, la más común acercarse aquí, sobre todo
cuando se utiliza un marco en realidad es sólo
para utilizar un número como un número entero.
Así que déjame ir adelante y hacer esto.
Y podemos hacer esto en unos pocos maneras, pero previo aviso si el zoom
en el fondo aquí.
Voy a decir agregue columnas en el extremo de la mesa,
generalmente sólo para visual conveniencia de poner IDs
en el principio de la tabla a pesar de que esto no tiene ningún verdadero
impacto funcional.
Así que voy a decir agregar uno columnas
en el principio de la tabla.
Voy a hacer clic en Ir, que me da la espalda esta interfaz de usuario aquí.
Vamos a llamar a este ID.
Si pensamos que vamos a tener hay más cosas 4.000.000 cursos
campo de un int está muy bien.
Incluso podríamos reducirla
pero el espacio es barato por lo que realmente le importa.
Pero, estamos tratando de escribir Facebook ahora,
podría no ser una mala cosa anticipar grandes ints
lo que nos daría enteros de 64 bits
pero entonces usted está, literalmente, duplicando el número de bits
que está utilizando, tan menor compensación
pero es algo a tener en cuenta.
Ahora, este es un confuso Lo legado.
Usted puede ser que recuerde el uso de MySQL
que cada vez que se declara un int campo que a menudo va a ver un número
junto a él, como el número 10.
No tiene nada que ver con el tamaño del número
o el número de bits.
Eso tiene que ver con el número de caracteres que se utilizan
visualmente pantalla ese campo int
cuando se utiliza una ventana de terminal.
Así podemos ver que en un momento.
Por lo tanto, no se deje engañar introduciendo números
allí, aunque es efectivamente pedirnos
una aquí.
Aquí, voy a seguir adelante y decir sin firmar.
No hay razón para desechos todos nuestros números negativos
desde la base de datos en general, se va
asumir positivo valores o nula.
El ID definitivamente no debe ser nulo.
¿Y qué piensa usted acerca de el índice para este campo ID?
Hagámoslo primaria.
Así que, ¿qué pasa si, sin embargo, como lo que pueda sólo pensar en un curso CS164
en Harvard y sólo uno Por supuesto CS50 en Harvard
y eso es bastante mucha verdad en general
que hay tal vez excepciones [Inaudible] los dos semestres
o algo raro como eso.
Pero más fundamentalmente, por qué es mejor
utilizar un integrante ID numérico a identificar de manera única cursos más
que una cadena única?
¿Sí?
[Inaudible Observación]
Bien, interesante.
Así que si teníamos suerte de cursos de cross-lista.
Así que eso es un buen ejemplo.
No estoy seguro de que lo haría resolver que, aunque
dándoles la misma Número de identificación, si eso es
donde usted iba con eso.
No? Aceptar. Pero sin duda, un caso esquina a considerar.
Si hay una especie de - necesitamos algún tipo
de aliasing potencialmente.
[Inaudible Observación]
Claro.
[Inaudible Observación]
Eso es un buen ejemplo.
El nombre puede cambiar con el tiempo, totalmente razonable.
¿Qué más?
[Inaudible Observación]
Lo sentimos, decir de nuevo.
[Inaudible Observación]
Sí, exactamente.
Así que en realidad, eso es el verdadero factor decisivo es
que el uso de una de 32 bits int es Probablemente va a ser más rápido
de alguna variable campo de caracteres de longitud.
En el primer caso, la lata caber literalmente en un registro,
por no hablar de mucho más menor consumo de memoria.
En este último caso, vas a tener que hacer resort [fonético]
para las comparaciones de cadenas que en sí mismos con el lineal
en el tamaño de la cadena potencialmente.
Así que es sólo un buen optimización,
y en particular se va
para dejarnos hacer lo que se llama Se une de forma más eficiente
en un momento.
Así que vamos a hacer eso.
Vamos a especificar que este es primaria
porque yo particularmente no quieren cuidar o pensar
sobre lo que el número es de un curso.
Que tomen en cualesquiera valores que quieren.
Yo voy a decir de incremento automático así que puedo externalizar ese detalle.
Al igual que en un lado usted puede ser saber que la Universidad de Harvard
al menos tiene único número de cursos.
No tengo ningún recuerdo lo que estos cursos se ofrecen.
Sé que de CS50 número de catálogo es 4949,
completamente arbitraria.
Pero no es raro casos extremos en que incluso
en el vertedero registrarial por supuesto, los datos del catálogo,
a veces, los cursos, los viejos los cursos tienen un número similar 4.
Pero técnicamente que campo es un campo de caracteres
que simplemente comienza con 0004.
Así que aquí también, usted tiene que estar cuidado con distinguir
entre cosas como un Por supuesto el número de catálogo
que podría tener algún humano noción de longitud fija, 0004,
y no se debe almacenar que, por ejemplo en un ints.
Ese tipo de campo debe ser almacenada en otro lugar.
Así que en Harvard, si tuviéramos realmente hacer un curso
herramienta de compras, es probablemente no es suficiente
a los cursos de números con sólo 1, 2, 3, 4.
Probablemente vamos a tener
tener otro campo llamado número de catálogo,
que también se supone que basarse única
en las convenciones humanas aquí pero no es la mejor opción
para un identificador único porque podría ser de longitud variable.
Puede que no sea de cuatro caracteres, podría ser cinco.
De hecho, creo que unos pocos Hace años que se mueven
a causa cinco personajes hay fueron más de 999 cursos
en total, o algo así eso, o 9.999 cursos.
Así que, eso podría ser un ejemplo en el que el campo no es primaria
pero debe ser único.
Y la dirección de correo electrónico es otro.
Es posible que quieras que sea única
pero no necesariamente su clave primaria.
Está bien.
Así que permítanme golpear a otro mesa mucho más rápido que éste.
Así que voy a llamar a este uno Instructores y voy
para dar a este un total número de columnas de dos.
Voy a aprender mi lección de la última vez.
Voy a llamar a la primera columna ID.
Voy a llamar a la Nombre segunda columna.
Yo también voy a hacer Varchar.
Voy a asumir ninguna profesor tiene un nombre más largo
de 60 personajes, aunque Ahora esto puede ser empujando
con algunos nombres largos, especiales personas con segundos nombres.
Eso está bien por hoy.
Así que vamos a desplazarse hasta aquí.
Vamos a hacer esto sin firmar de nuevo.
Hagamos de este primario.
Y nos permitimos nombres duplicados
en caso de que haya dos John Smith, o algo así.
Y ahora tenemos dos tablas.
Así que ahora, esto plantea la Pregunta ¿Cómo asocio
en instructor en el curso?
Me siento como que tipo de tengo delante de mí mismo
porque si un instructor enseña un curso,
mi primer instinto sería ser en realidad volver
a los cursos se dan cuenta, este no era una buena idea.
Permítanme agregar realmente una columna al final de la tabla,
haga clic en Ir, y lo voy a hacer llamar a este Instructor.
Y voy a hacer este tipo varchar y voy a hacer este 60.
Y tal vez lo dejaré nula ahora
en caso de que el curso no tiene sido sin autor dentro de instructor
que a veces ocurre antes plazo comienza y haga clic en Guardar.
¿Cuál de estos diseños Qué te gusta más?
El primero en el que tenemos una la mesa del instructor independiente
o el segundo en el que sólo agregar un campo al curso?
Así que es una vincular estrechamente instructor del curso.
[Inaudible Observación]
Aceptar. Bueno. Pero permítanme hacer retroceder.
Es tan simple como lo que pueda sólo tiene que escribir el nombre de la persona
en esta tabla, como seguramente eso tiene algún valor o -?
[Inaudible Observación]
Está bien.
Bueno, déjame ser difícil aquí.
Así que permítanme decir que este curso es CS51
y sé que ha enseñado este año por dos personas.
Así, Henry Leitner y Jesse Tov pero -
así que me voy a poner una coma entre los dos, derecha.
Soy bueno en CSV desde antaño.
[Inaudible Observación]
Exactamente, claro.
Tan pronto como usted recurre a algo como esto,
que podría sentir razonable y se puede sentir
como esto es un poco inteligente.
Yo soy una especie de préstamo de una idea que ha de funcionar bien,
prestada una idea nueva y tipo de combinarlos.
Estás especie de derrotar totalmente el punto de utilizar la base de datos
en la causa el primer lugar " Si uno de los valores
de uso es agilizar las búsquedas debido a los diversos índices
y tablas que pueden ser construido para usted
por el motor de base de datos en sí.
Ahora, si usted quiere buscar para todos los cursos
que Jesse enseña, ahora usted tiene Para ello subcadena coincidente en todos los
de los campos de instructor,
lo que significa que efectivamente lineal buscar de nuevo porque tienes
encontrar este conjunto arbitrario de los tres personajes en cualquier lugar
en el campo instructor precedido
dentro de tal vez seguida por una coma.
Así que esto definitivamente no presagia nada bueno.
Así que déjame ir de nuevo a la mesa.
Déjame ir por delante de cursos, deshacer eso.
Voy a ir por delante y colocar ese campo.
Y si quieres hacerlo manualmente,
la sintaxis es ALTER TABLE cursos DROP instructor.
Así que vamos a seguir adelante y decir que sí a eso.
Y volver a esta idea anterior
donde tengo una separada mesa para instructores.
Pero ahora esto se siente un poco como puedo poner un curso
en la mesa del curso y el instructor
en la mesa del instructor, pero me de alguna manera hay que vincular los dos.
¿Y cómo lo harías Proponemos que lo hagamos?
[Inaudible Observación]
Bueno. Así que vamos a hacer eso.
Y se podría llamar a este tabla en nada la teoría.
Voy a deliberadamente llámalo como mucho
de marcos haría llamarlo, entre ellos,
Laravel como se verá en un momento.
Voy a llamarlo curso subrayar instructor.
Usando singular en esta caso para cada una de las palabras
y todo en minúsculas de nuevo, y también con el -
después por orden alfabético ordenados de izquierda a derecha.
Esto es totalmente arbitraria, sino que tiende a ser una convención
en muchos de estos marcos en PHP en otros idiomas.
¿Cuántas columnas Qué necesito Esto es lo que llamamos una tabla de unión,
para unirse a otros dos mesas juntos?
Tres columnas?
Cual - ¿cuáles serían?
[Inaudible Observación]
Aceptar. Bueno. Eso funciona.
Y pudiéramos técnicamente cortar una esquina aquí, pero mucho
de los marcos, en particular le siguen dando incluso estas filas
identificadores únicos a pesar de que semánticamente la fila
que realmente nos importa o las columnas que realmente nos importan
sobre este último son dos de lo que dijiste, ID del curso
y el ID del instructor.
Así que vamos a hacer esto.
Voy a llamar a esta fila sólo ID, tal como lo hicimos antes.
Pero éste me voy llamar supuesto ID.
Éste me voy a llame ID instructor.
Y yo voy a especificar que todas
de ellos están sin firmar Porque quiero
para maximizar mi 4 millones int rango.
Ninguno de ellos debe ser nulo.
Voy a especificar que ID debe seguir siendo primordial.
Y de nuevo, esto es sólo una convención,
una gran cantidad de marcos incluso si usted no ordena
fundamentalmente de la necesidad de una identificador único de la fila,
resulta que es conveniente para el código, el SQL que está pasando
ser automáticamente generada por nosotros.
Así que lo dejo como primaria.
Pero ahora, que tipo de tener una decisión de diseño,
ID del curso y ID instructor.
¿Qué índices si cualquier en caso de que conseguir?
Si lo dejo sin índices, ¿Cuál es la implicación?
¿Qué es una implicación?
Rendimiento como antes, ¿no?
Si no hay ningún índice, la lo mejor que puedes hacer es tipo
de [inaudible] a través de la Todo esto en busca de números.
Así que no se siente listo.
¿Debería ser primaria?
Así que ¿por qué no?
¿Por qué no primaria?
[Inaudible Observación]
Perfect. Así que rodamos fuera [fonético] primaria.
Ya Elegimos eso.
Así, en caso de ser único?
[Inaudible Observación]
Bueno. Por lo tanto, si se asume un instructor por supuesto,
totalmente bien.
Y eso es sin duda el caso común
pero ya nos despojamos uno ejemplo tal vez familiar.
CS51 tiene dos instructores así que estamos un poco
de ahora atornillado en ese caso.
Si lo hiciéramos permitir sólo un instructor,
que podríamos hacer de una manera con la tabla de unión total,
volver al anterior enfoque
y no poner el nombre de la persona tal vez, pero la identificación del instructor.
Si conoces a cada curso que acaba un instructor puede tener sólo
una columna.
Sin embargo, la variabilidad es lo que nos metió en problemas.
Está bien.
Así, en caso de ser único?
No. El texto completo no sentir aplicable.
Como antes hemos dicho que eso es
para como subcadena juego para las descripciones.
¿Qué pasa con el índice?
Bueno, el índice es probablemente nuestro mejor candidato
que narra optimizar MySQL para búsquedas en este
O yo elaboro, optimizar para búsquedas o uniones
como veremos en un momento
por lo que son una poco más eficiente
que cualquier cosa puramente lineal.
¿Quiero auto incrementos de este campo?
Así que no, porque la verdadera existe elemento padre
en el cuadro de los cursos.
Ahí es donde es va a conseguir más,
además, cuando en realidad es insertada.
Aquí, todo esto va para ser insertado manualmente
por nosotros presumiblemente en el código.
Así que vamos a especificar simplemente que tanto supuesto Identificación
y ID instructor tiene índices.
Ahora vamos a seguir adelante y ahorrar.
Y ahora, sólo para mostrar que la correspondencia
entre lo que es un buen Interfaz amigable interfaz gráfica de usuario
y la interfaz de línea de comandos.
Déjenme seguir adelante y hacer la siguiente en este mensaje MySQL.
Voy a decir el uso courses50
que es el nombre arbitrario Le di a esta base de datos.
Y ahora, no lo sé aún Recordemos lo que hicimos.
Así que permítanme Escriba show tablas
y en general, el punto y coma será tu amigo aquí
para terminar la consulta.
Y ahí está.
Así que aquí están las filas o más bien las mesas que tenemos aquí.
Ahora, me olvido de lo que un curso parece,
así que vamos a describir qué cursos y ahora veo una especie de ASCII
o una versión de lo phpMyAdmin estaba haciendo
y veo que el DI es un int.
Hay que 10.
¿Qué significa eso?
Eso sólo significa que cuando es aparece que va a tomar
hasta 10 caracteres en la ventana de terminal.
¿Es anulable?
No. Esta es la clave principal.
¿Puede tener un valor por defecto?
No. Y extra que es especial banderas como incremento automático.
Así que vamos a hacer un par inserciones de rápido aquí.
Voy a subir a - vamos a decir.
Vamos a cambiar el estado de una diapositiva
donde me especie de pre-preparo esto.
Este es un resumen a continuación, de los tres de esas tablas.
Ya sólo manualmente escrito el primer comando.
Y aquí, me fui por delante y escriba los demás por ti.
Esto es sólo el lo estilístico.
En general, una gran cantidad de personas escribir sentencias SQL en todas las tapas
y luego los nombres de tablas y nombres de campo en minúsculas,
aunque sólo sea porque tipo de stands
cuál es su terminología y lo que es la sintaxis de la base de datos.
Así que aquí tenemos tres tablas, cursos, instructores,
y cursos de instructores.
En la diapositiva que hice con antelación, Yo no tenía el campo ID
pero eso no es realmente una cosa mala en absoluto.
Nos acaba de ver un tercera columna de allí.
Si yo hubiera hecho eso aquí?
Así que ahora permítanme proponer que hacemos un montón de inserciones.
Así que aquí está algunos datos, Voy a agrandar
Así que voy a proponer que en los cursos,
sólo nos ocupamos de tres cursos.
Y elegí estos tres Porque son representativos
de algunos agradable - tienen algunas propiedades agradables.
CS1, CS50, CS51, se tienen cada vez mayores identificaciones
pero ¿qué es lo que ID es totalmente irrelevante.
Eso es sólo el orden en que se auto insertados por mí.
¿Qué hay de los instructores?
Así que ahora, porque Henry Leitner enseña tanto CS1 y CS51,
esto es una especie de un oportuno implicación para nuestro diseño.
Y Jesse enseña CS51 y Malan enseña CS50.
Así que ahora - o más bien se trata de sólo los identificadores únicos de esas personas.
Y cursos y los instructores, - instructores del curso, aviso aquí.
ID1 Course, que Se CS1 se enseña
por instructor ID1 que es Henry.
ID2 Course, que me creo fue CS50 se enseña
por instructor ID2, que es Malan.
Y a continuación, por último, CS51, y cuenta que tenemos dos filas.
Y ahora esta es la razón por la unión mesa es de gran alcance que se enseña
por tanto Henry como Jesse.
Así que esto es todo fino y bueno,
pero apenas puede recuerdo de la parte superior
de mi cabeza quién es quién aquí.
¿Cómo es posible lidiar con eso en el código,
sin tener que cosas de códigos duros?
Bueno, aquí es donde SQL sí comienza a ser nuestro amigo.
Y yo voy a proponer que podemos escribir la siguiente.
Voy a hacer esto en en prompt actual.
Déjenme seguir adelante y insertar estas cosas.
Así, en la tabla de cursos vamos a hacer exactamente lo que teníamos un
Hace momento.
Voy a adelante y decir, Vamos a insertar CS1 y CS50.
Vamos a insertar un poco más filas a la vez, CS51.
Ahora, déjame ir por delante y ahorre.
Muy bien, así que estoy solo recrear lo más rápidamente
como pueda las relaciones que acabamos de ver en la pantalla.
Y así, aquí tenemos Leitner, aquí tenemos Malan.
Vamos a dar a nosotros mismos otra fila, y Tov.
Ahora voy a salvar esto.
Y lo estoy haciendo deliberadamente en el mismo orden.
No, me olvidé de darle este incremento automático.
Voy a corregir rápidamente este.
Voy a arreglar esto en el código en línea.
Que fracasó en un aparte.
El hecho de que yo no podía inserte Leitner y Malan
y Tov fracasó, porque no lo hice especificar un número de identificación a pesar de que
que está esperando una y me se olvidó de comprobar incremento automático,
lo que significa que eran todos por defecto conseguir cero.
Pero que luego contradice que propiedad que hemos especificado.
La clave primaria se violó así que ni siquiera me dejó hacerlo.
Así que déjame arreglar esto.
Ahora, déjame volver a la En la ficha Insertar aquí y especifique
que quiero Leitner, Malan y, una fila más, Tov.
Y ahora, por último, la única uno que es un poco difícil
es recordar curso instructor.
Vamos a insertar ahora que Por supuesto ID1 es instructor ID1
así que eso es CS1 y Henry.
ID2 Curso es instructor ID2 que es CS50 y Malan.
Y luego, los últimos los que tenemos es preocuparse por supuesto ID3
que es CS51, se enseña
por supuesto instructor 1, que es Henry.
Y tres, como también enseña por 3, que es Tov.
Así que espero que ahora hemos recreado esta -
maldita sea, yo hice lo mismo.
El instructor del curso necesidades de incremento automático.
Está bien.
Voy a hacer esto más rápido esta vez, curso 1, curso 1, 2, 2.
Y ahora, por último, hacemos CS51 que tiene curso ID3 y Henry.
Y por supuesto ID3 y Jesse.
Eso se ve bien.
Aceptar. Así que ahora, volvamos a la ventana de terminal.
Así que si yo describo cursos ya veremos esto.
Si quiero ver los cursos que puedo ahora lo hacen seleccione estrella de los cursos,
punto y coma, y ​​ahora vemos esos valores.
Y ahora, ¿qué más Qué quiero hacer?
Seleccione la estrella de los instructores, eso es lo que yo esperaba,
y seleccione la estrella de los cursos - curso de instructor de subrayado.
Entonces, ¿cómo puedo unirme ahora estas tablas?
Así que la belleza de haber elegido los valores de ID de esta manera se
que si se piensa en teniendo la tabla curso
y el instructor mesa y luego insertar
entre los dos en su mente el instructor del curso
tabla Puede especie de línea por todas estas columnas ID
para que ellos se funden en una columna masiva que tiene todo
de la información nos importa.
La sintaxis SQL para este no es necesariamente evidente,
pero vamos a ver si podemos hacerlo.
Así que seleccione la estrella de los cursos,
y hay una forma en que pocas como podemos hacer esto.
Voy a golpear Ingrese sólo para tipo de formato cosas muy bien,
pero eso es sólo una flecha síntoma de la herramienta del lado del cliente,
no tiene nada que ver con la propia SQL.
Así que seleccione la estrella de los cursos.
Voy ahora a unirse a la tabla cursos
en la mesa del instructor del curso.
¿Cómo? En el campo llamado courses.id supuesto igualando
subrayar instructor dot ¿cuál es el nombre de
del campo correspondiente aquí que quiero una pareja.
No es ID.
Es - lo, lo siento?
>> ID del curso.
Bien, déjame alejar la imagen.
Pero quiero aprovechar un paso más allá.
Ahora que he hecho esta mesa y éste.
Ahora quiero tirar a este tipo en también.
Así que, permítanme más unir todo esto
en el instructor de tabla en la que?
Subrayado Curso Identificación instructor.instructor
igualando instructors.id.
Así que podríamos haber escrito esta consulta en varias formas.
El orden en que lo hice no es tan importante.
Acabo de tipo de hice en mi mente, de izquierda a derecha.
Podríamos haber hecho esto en las pocas maneras diferentes
pero si ahora tengo la punto y coma y pulse Enter,
Aviso vuelva un nuevo tabla temporal, un conjunto de resultados
por así decirlo en jerga de base de datos.
Y ¿qué tengo que en esta cosa?
Tengo en ID, un nombre, otro ID, que es un poco confuso
para mí en ese momento, un ID de curso,
un ID instructor, ID y nombre.
Así, al final del día tenemos los datos en estos momentos.
Puedo ver que CS1 se enseña by Leitner, CS51 se enseña
by Leitner y Tov, y CS50 es impartido por Malan.
Pero estoy un poco nervioso por esta ambigüedad que he creado.
¿Cuál es la ambigüedad Estoy aludiendo a?
¿Sí?
[Inaudible Observación]
Hay tres columnas de identidad.
Así que en realidad podemos solucionar este problema y vamos a ir en realidad
aplazar a nuestro marco en última instancia, para que nos ayude con esto,
pero resulta que hay una palabra clave en SQL denominada S,
donde se puede especificar una alias, un nuevo nombre para un campo
de manera que podamos evitar esto ambigüedad por completo.
Pero se dio cuenta de que si no lo hacemos tratar de alguna manera como con
esa palabra clave o un marco,
hay potencialmente este ambigüedad si intenta
para acceder al campo ID porque es evidente que los hay
con nombres duplicados allí.
Así que esta es una combinación y creo en el ojo de su mente la mejor manera
pensar en lo que realmente es tomar las dos tablas,
alinearlos en el manera que usted desea.
Y este es un denominado combinación interna en el sentido
que estamos combinando los cuadros aquí.
Hay otros tipos de se une que podríamos encontrar
con el tiempo, como las combinaciones externas,
pero en su mayor parte esta es probablemente el más común
para la reconstrucción de los datos.
Lo que hemos hecho ahora es en general, lo que se llama
la normalización de los datos, de manera que no hay duplicación en cualquier lugar
en las tablas.
Y por la duplicación, lo haría han hecho que la primera aproximación.
Si hubiéramos mencionado Leitner y Tov en múltiples lugares
en su base de datos, no es en general, la mejor decisión
especialmente si su nombre puede cambiar las horas extraordinarias o en el caso
del matrimonio, el nombre de soltera fuerza cambiarse a sí misma lo que desea es una
lugar canónico para algunos valor de los datos como un nombre.
Está bien.
Así que, para recapitular, hemos tenido un algunas decisiones de diseño para hacer
y los más importantes probablemente reducido a algunos
de estas opciones de índices.
Pero permítanme señalar una cosa así.
Si vuelvo a ir a phpMyAdmin,
una característica que no podría haber encontrado antes es
el siguiente.
Si voy al curso de instructor, Ya especifiqué que algunos
de estas cosas tienen índices.
Pero deja que me vaya a la estructura pestaña del curso de instructor.
Permítanme Haga click sobre los índices y observe lo siguiente.
He aquí especificado que hay una clave primaria
en la columna llamada ID.
Este es un tanto complicado forma de especificar la cardinalidad
y así sucesivamente como una referencia a el tamaño del campo en bytes.
Pero ahora también tengo otra campo, ID supuesto, que es -
ID supuesto que se hace por adelantado y único, en Aceptar.
Lo hice una en avanzar por nosotros.
Así que, ¿por qué es esto - Déjeme caer esto por el bien de la discusión.
Oh, ya sabes lo que hice?
Aceptar. Así, antes, uno de los peligros de la utilización de una herramienta de interfaz gráfica de usuario
así, cuando éramos La creación de esta tabla de unión,
la tabla instructor del curso, Recuerdo que he especificado
que quiero un índice en este campo
y un índice en esta otro campo.
El efecto secundario de comprobación tanto de esas cajas
en la misma pantalla es que phpMyAdmin deducirse de lo anterior,
que yo quiero no dos índices separados,
que quiero un índice de unirse a los que es por lo general sólo es útil
o la más útil cuando estás buscando en un campo no
pero estos dos campos.
Y es por eso que tuvimos ellos conjugan allí
así que me dejé caer porque eso no era lo que pretendía.
Más bien, me voy volver a hacer esto aquí.
Voy a ir a la ID de golf
y bajo más Estoy va a decir agregar índice.
Y voy a pasar por debajo de ID instructor y decir agregar índice.
Y ahora, si hacemos clic aquí, AVISO tenemos tres índices,
uno principal y como yo previsto para cada uno
de esas claves externas.
Y llamo al extranjero, puesto ID del curso En este mapas de mesa
a qué campo, sólo para estar borrar, en otra tabla.
La clave primaria llamada ID, en la tabla llamada cursos,
y el mismo trato para el otro.
Pero ahora, es una interesante engañar y realmente técnica.
Acabo de ir por delante y me dejó hacerlo un poco más despacio.
En la misma pantalla, el aviso dice Vista de relaciones aquí.
Hago clic en esto y ahora noto yo llegar a hacer unas cuantas limitaciones.
Así, una de las partes superiores también
de no sólo usando conceptualmente claves externas y otras tablas
como acabamos de es que mediante la definición de un índice
en ellos se puede tener la base de datos de ayuda que aún más
asegurar la integridad de ese campo.
En concreto, ahora puedo especificar a través de esta caída
hasta que el campo de golf ID
en esta tabla realidad mapas a courses.id.
Del mismo modo, subrayado instructor ID asignada a instructors.id.
Ahora, ¿por qué es esto útil?
Bueno, fíjate, a la derecha lado de lo que parece ahora.
Ahora puedo enseñar el base de datos que si Henry
por ejemplo, se jubila nunca y su fila desaparece
de la mesa del instructor siendo del todo de ese modo
eliminado, lo que pueda a través de este cascada enfoque asegurar
que cualquiera de los cursos que imparte son ya no se asocia con él.
Puedo enseñar a la base de datos para eliminar las filas
en esta llamada tabla de unión automáticamente si Henry o si uno
de sus cursos desaparece.
Ahora, ¿por qué es convincente?
¿Sí?
[Inaudible Observación]
Sólo tienes que hacerlo una vez y largo plazo, ¿no?
Es muy fácil si una especie de las personas van y vienen, vienen los cursos
y vaya, su base de datos podría simplemente ponerse lleno de cursos
y con los profesores que no son ya relevante para el conjunto de datos.
Y sus datos comienza a ser muy desordenado y sucio y rancio,
y aquí podemos clasificar
de cumplir algunos de estas limitaciones.
¿Sí?
[Inaudible Observación]
Se sabe por medio de esto.
Esta es la pantalla donde estamos especificando un enlace
entre clave externa y la clave primaria.
Así que toda la nomenclatura convenciones me referí
anteriormente son sólo convenciones.
No hay significado inherente.
Esta es la pantalla que sólo es útil
después de que ha especificado los índices de cada uno de esos campos como lo hicimos.
Y para este desplegable tenemos algunas cosas, por ejemplo
si un curso se elimina puedas en realidad prevenir que la supresión
suceda si hay es una fila de esta tabla
con sólo decir, Restringir.
En otras palabras Henry no pueden retirarse
hasta que lo desacoplamos de CS51 y CS1.
Así que eso es una buena cosa.
Pero podría desencadenar errores en el código
si usted no anticipa que, o podemos tener una cascada,
una cascada similar a gustaría hojas de estilo en cascada
y la cascada significa que si una cascada -
si Henry se retira de manera - por ser eliminado
también lo hará su fila aquí se eliminan.
Sin acción no significa nada o nulo es una especie de utilidad si tipo
de querer algún registro histórico de Henry habiendo enseñado CS51,
pero lo que desea es que el campo de ser nulo de manera que las filas allí
pero no es por más tiempo asociado con él.
Así que estos son muy poderosos técnicas que pueda
y debería usar incluso aunque en el interés particular
de salvarte de ti mismo.
Así que permítanme hacer mención de un par de detalles finales aquí,
ingredientes con los que que podría ser útil
ya que tenemos pensado para el diseño de base de datos.
Usted también tiene la elección sobre el motor de base de datos
que se utiliza en el código.
Si está familiarizado de CS161 usted puede ser -
o incluso 61, es posible que por lo general estar familiarizados con los sistemas de archivos.
Y hay cosas como, NTFS y HFS +
y X2FS4 [fonético] y 3 y así sucesivamente.
Hay diferentes maneras de almacenar datos en el escritorio.
Del mismo modo hay diferentes formas de almacenamiento de datos
en una base de datos por defecto al menos en el aparato
con la última versión de MySQL.
Hemos estado utilizando la motor de base de datos llamada, NoDB,
que soporta una algunas características agradables.
Pero otra común es también llamado MyISAM y otro
que se pueden utilizar es la memoria, lo que significa que no ponga nada
en el disco, sólo sigue cosas en la memoria.
En su mayor parte, probablemente no va a salir mal acaba de empezar
con NoDB, pero para cualquier proyecto que tienden a involucrar a las altas tasas de
de inserción por ejemplo, como un montón de registro rápido,
cientos de cosas por segundo o miles de cosas.
Cada vez que tienes un gran cantidad de cosas que están pasando
en en la base de datos entonces este tipo
las decisiones a nivel de la menor comenzar a involucrarse.
La función de texto completo para ejemplo sólo funciona en MyISAM
de manera que tiene una implicación.
Pero usted puede recordar esto, vamos a al menos motivar por qué nos importa
sobre NoDB en particular.
A las condiciones de carrera generalmente se refiere a qué?
Muy bien, este es un alusión a un ejemplo un poco de
de que pueden haber escuchado en año pasado si 161 o 50
donde usted tiene un compañero de cuarto, tanto de ustedes les gusta realmente la leche,
uno de ustedes llegue a casa primero se abre la nevera no hay leche,
cerrar el paseo a través de nevera calles a CVS y obtener
en la fila para comprar un poco de leche.
Mientras tanto, su compañero de cuarto vuelve aquí.
También le gusta la leche.
Abra el refrigerador y se da cuenta de nada de leche.
Aquí ella se dirige a la almacenar, tal vez el otro CVS.
Avance rápido de un par de minutos más tarde regresas y ahora ambos
de que usted ha comprado leche.
Uno de ellos está ahora va echar a perder porque no es así
como la leche que mucho y esto es un problema, ¿verdad?
Debido a que los dos inspeccionados el estado de alguna variable
y tomó una decisión basada en él a pesar de que el estado
de esa variable era esencialmente en el proceso de ser cambiado,
todo sea lentamente sobre el cantidad de tiempo que tarda
para ir y volver del CVS.
Entonces, ¿qué es una especie de estúpido reales mundo solución a ese problema?
Deja una nota, ¿verdad?
Se pasó la última vez.
Siempre deje una nota o un candado a la cosa, literalmente.
Y digo candado, porque si usted toma o tomó CS161,
de bloqueo es un elemento fundamental idea en esa clase de mundo.
Así que pueden surgir condiciones de carrera también en el mundo de base de datos
y se puede recordar lo mejor de CS50 financiar si se toma 50,
el código que realmente dimos ustedes en la especificación
en el momento para que su la operación se llama así atómica.
Si usted quisiera, en este caso, compre una acción de las acciones
y esa población tiene algunos símbolo particular.
Le dijimos que utilice un código como esto, porque a través de este
en la actualización de clave duplicada sintaxis, que se construye
en MySQL que está efectivamente haciendo bien en inserción
o en la actualización después de haciendo una selección, para ver
si una acción que ya está ahí.
En otras palabras, el análogo en el mundo de la compra de una acción
de leche y el refrigerador podría ser, primero,
antes de comprar una participación en Google es posible que desee seleccionar
de la base de datos de toda la acciones de Google que David posee
para ver si es propietario de cero o más.
Una vez que vea si es propietario cero o más se tiene
a continuación, haga lo siguiente.
Usted tiene que hacer una inserción
si propia causa cero " no hay fila para David, sin embargo,
o que tiene que hacer una actualización si por lo menos en la teoría de que deseas
tener una fila por cada usuario.
El problema es seleccionar ese número de acciones
y a continuación, la actualización o inserción podría ser interrumpido
por otra persona en otro terminal de computadora tratando de comprar
o vender parte de David de acciones de las poblaciones ya sea
para buenos propósitos u ordenar de propósitos maliciosos.
Es como ir a la tienda cuando su compañero de piso vuelve
y comprueba el estado de la variable.
Así que esta sintaxis en el momento que era una especie de adecuada
para CS50, que evita problema por completo.
Y sólo hace todo eso magia de bloqueo para usted,
pero ahora con este tipo de los proyectos para este curso
que muy probablemente será involucrar a los conjuntos de datos más complejos,
no se puede lograr siempre esta atomicidad.
Todo sucede a la vez o nunca
sin interrupción con tanta elegancia.
Y así MySQL, otro motor de base de datos,
cosas de apoyo llamados bloqueos,
por el que se puede decir de este bloqueo mesa de modo que sólo un tratamiento
y en general, sólo un usuario puede toque en cualquier punto en el tiempo
para leer o escribir y entonces usted puede desbloquearlo.
Este es un ejemplo de uno de las propias referencias de MySQL,
donde si tienes como un banco cuenta de que usted está tratando de
puede descontar dinero de y luego agregar dinero a.
Es posible que desee asegurarse de que tanto
de esas cosas que pasan juntos
por lo que no hay errores matemáticos
y no hay pérdidas de uno dinero, de alguna manera.
El problema con las cerraduras aunque en una base de datos es
que esto significa, generalmente toda la tabla está bloqueada,
lo que significa que si usted tiene un centenar de personas que tratan
hacer negocios con su banco en línea en la misma cantidad
de tiempo de sólo uno de los ellos pueden ir a la vez.
Lo cual es estúpido, especialmente en los servidores de hoy en día
que tiene ocho platos, 16 Por supuesto, tener una enorme cantidad
de la memoria, no hay razón para serializar todos
de sus transacciones si los los clientes sólo se va
para interactuar con sus propias filas.
Así NoDB le permite hacer las cosas más inteligentes
y esto será generalmente el enfoque que usted tome en el código,
como se utiliza algo llamado la transacción.
Y lo hace en general en el código PHP,
Código Ruby, Python, lo que sea.
Pero el código SQL que es utilizado en última instancia, es la siguiente,
normalmente.
Inicie la transacción, entonces especificar dos o más consultas
que desea ejecutar por completo
sin interrupción o no en absoluto.
Incluso puede haber alguna Seleccionar los enunciados en
o algunas eliminaciones o actualizaciones.
Pero lo bueno es que el base de datos será lo suficientemente inteligente
para asegurarse de que sólo se bloquear las filas en realidad son
involucrados en esta actualización o selecciona o eliminaciones.
Así que si tienes miles de filas y sólo se está tocando tres
de ellos, sólo que subconjunto de la tabla se bloqueará
lo que significa que los otros 99 los clientes pueden tocar a sus filas
sin ser serializado y frenado por ti.
Mientras tanto, este es el más bonito aspecto a las transacciones.
Son las operaciones en una sentir como 161 en un sistema de archivos,
son transaccional
lo que significa que usted puede rodar de nuevo, puede deshacerlos.
Esto es como el comando o controlar F de bases de datos.
Si usted descubre parte camino a través de todo
de la operación de datos diferentes, disparar, algo va mal.
Usted, literalmente, ejecuta un diferente rollo consulta SQL de nuevo
y todos estos tendencia - todo de las declaraciones que ha ejecutado
después de haber dicho inicio desaparecer transacción
como si nunca pasó,
que es un increíblemente algo muy poderoso.
Y estos son los tipos de cosas ciertamente en 50 clasificamos
de barrer bajo la alfombra y que sólo un poco de asumir
que todo irá bien.
Pero una vez que comience pensar en proyectos reales
y los usuarios reales y el integridad de su base de datos,
estos son los tipos de las decisiones de diseño
que van a ser importantes.