>>所有权利。
因此，事不宜迟，SQL， 结构化查询语言。
所以，你可能用这个在 至少在CS50，也许在CS165，
也许在你自己的 个人项目。
又是什么SQL让你做， 在SQL Server更普遍？
是吗？
[无声备注]
好了，这是非常 的说法是有抵押的方式。
是。因此它允许 您存储数据
更重要的是使 您要查询的数据。
这是向前迈出的一步
从使用的东西 简单的像一个CSV，右。
逗号分隔的变量。
类似的值。
同样让你节省 信息一排
在一个文本文件中。
但是，什么是一个缺点 CSV文件存储数据，
即使你有效 从它那里得到的行和列？
是啊。
>>你不'有 同一组织
效率[听不清]。
>>您不必相同 组织效率。
你是什​​么意思？
>>嗯，就像[听不清] 有像主[听不清]。
>>确定。是啊。
>>这是一个关系型数据库 你可以有多个数据库
彼此连接 在非常特殊的方式。
>>确定。好。
>>这是[听不清] 设置一个CSV。
>>让我调整 一点点的术语。
所以多个表 在数据库中，当然，
而且超出了 你可以只用一个CSV做。
但真正的限制 使用CSV我认为是
那这一切的低效率。
这是很容易的布局。
但是，如果你想要做一个 查询，什么是运行时间
任何选择查询的 在一个CSV文件？
我的意思是它的大旧[听不清] 右，在最坏的情况下“的原因，
他们上升在最底层。
即使你已经排序的整个 CSV文件，如果你不知道
即前期，好了， 你仍然会有
搜索整个事情。
因此，其中的事情 我们要得到
从使用的实际 使用语言数据库
就像SQL是我们可以查询 这一点，我们可以提前
数据库设计人员 指定哪些领域
这也很可能将不得不 有关的问题，使人们
在MySQL或Microsoft或Oracle，
谁取得了数据库 您使用的是可以做所有
的辛勤工作 搞清楚好不好，
鉴于这些IDS的一百万。
我们如何布局 - 它们在内存中？
某种树 结构也许，
让你做的时候 实际执行选择，
它的东西，是 对数或对数
对数的时间，而 比实际下放
弄成线性的。
因此，我们得到了很多 表现的方式。
而且我们还可以存储更大量 数据更容易“导致SQL
服务器通常存储 在RAM中，即使部分
它可以被存储在磁盘上的 你可能知道现在
该内存通常是 比磁盘快，
所以这是一件好事。
而且我们还可以处理 并发性要好得多。
如果你已经采取了165或161， 你知道，如果两个人尝试
做同样的事情 一次在系统上，
不好的事情一般都可以发生。
所以，在其他的功能我们 如果我们设计我们的表中可以得到
正确的方法是 更好的支持和保障
当涉及到并发性。
所以，两个人在两部分
使用相同的世界 网站，如果他们都尝试
买东西的同时 时，该订单是不会
同时进去了。
不知怎的，他们将被序列化 有人比我们自己其他的 -
有人比我们其他。
该数据库将 做到这一点的我们。
因此，当它的最简单的形式，
SQL允许我们查询 关系型数据库。
关系数据库 是一个具有一个
在它或多个表中一般。
如果这是一个 有些不习惯，
你可以真的只是想 这为Excel或数字
或谷歌电子表格。
它只是有行和列 并且通常每个顶
这些行都有它的名称。
所以这可能是标识 列，名称列，
地址栏等等。
然后你可以有多个 这样的表，如果你想
开始铺设 不同类型的数据。
但你可能还记得至少 从CS50我们尝试
给你一个基于GUI的 工具[听不清]
管理数据库。
这就是所谓的phpMyAdmin。
所以它只是一个巧合， 它是用PHP写的，真的，
但它只是一个基于Web的 前端到数据库。
并通过不同的选项卡 和链接，你能开始
配置数据库 为你自己。
但一个好的工具开始 得到舒服些
用也是 命令行客户端。
所以，如果使用CS50电器 还是真的使用任何电脑宏
有一个命令行的MySQL 客户端，你也可以做到这一点排序
的老同学，是这样的。
顺便说一句MySQL的项目， 至少在开源版本
它现在被称为MariaDB的供 你可以阅读各种原因
在维基百科，但 这是同样的软件，
这是同样的语法 等等，
几乎相同的代码库。
所以当我在这 提示我现在可以交互
我的数据库 更为手动。
因此，典型的例子， 让我继续前进
而刚刚开放 一个终端窗口。
我碰巧使用CS50 电器，但你可以做到这一点
在大多数系统中的任何 你得到了正确的
安装的软件。
而我要做的MySQL-U 用户名约翰·哈佛
这个特定的系统上，-P 因为这样，我会输入密码
在一个多一点 安全地通过按下回车键。
现在我提示。
我要去型深红色 在CS50电器
现在我看基本上 该相同的画面。
但是，还有现在的命令 我们可以开始输入
像显示数据库， 那就是要告诉我所有
我有数据库 已在系统中创建的，
几乎相同的列表 你会看到在phpMyAdmin。
有一对夫妇别人喜欢的 信息架构和测试，
而如果你闲逛的 CS50电器，我们隐藏一些
这些较低级的表
但他们已经 有这么长的时间。
MySQL的实际上有低水平 喜欢的用户名的属性
和密码的数据库 本身，而不是为你的应用程序
那你可能会对 在它上面运行。
所以在前进，今天，我 创建了几个数据库，
其中之一是被称为 courses50。
赔率是一些你已经使用 CS50课程的购物工具，
这是一个很大的接口 处长的课程目录。
这实际上是一个很好的 数据集谈'的原因，
1，我们是那种所有 显然熟悉课程
与导师及会议 位置和所有的排序
普通的东西 大学，
但它也有一些 有趣的机会
设计。
因此，我们认为我们会使用 课程目录概念
和购物工具作为 例如今天整个排序
的一些框架的设计 决定我们必须做出。
因此，让我们从这里开始。
假设我其实是想 来表示超简单
当然购物工具。
而最简单的世界 我可以想像，一个是
其中有场 并有导师。
让我们假设到 为了讨论的方便
每个课程 具有至少一个名称。
因此，让我们开始 勾画了这一点。
我要使用phpMyAdmin 只是为了方便，
所以我们没有打出来 全手动的查询。
但在这里，我在我的 courses50数据库。
如果不熟悉这一点，它会 很容易，一旦你潜水
在到自己的项目 如果你想使用它。
我要创建一个 表称为课程
我只能想到 一个场的
现在，一个疗程的名称。
我要继续前进， 说给我一列。
现在，你还记得你 一个接口，这是一个有点
像这样。
而另一坦言上攻 phpMyAdmin的是，它的排序
自发出指示的那 通过下拉菜单，您可以排序
见你的可能 设计决策。
所以我想给 每门课程的名称。
这就是本专栏的名称。
怎么样的数据类型？
大多数时候，你应该知道 至少一些这些数据类型的
从以往的经验。
什么是适当的 对于课程名称？
莎朗？
>> VARCHAR。
>>确定，其中VARCHAR 是可变的字符。
而究竟是什么 意味着更多的技术？
[无声备注]
确定。所以这是一个字符串。
和无功方面 它意味着什么？
变量。但 什么意思呢？
是吗？
[无声备注]
没错。所以这是一个变量 字符数
在串起来 在一定的最大值。
因此，这里是我们的第一 设计决策。
实际上，我们必须决定 多少字节最大
分配给每个这样的字符串。
一般来说，想要 有点不让它过小，
不能使它太大 '引起明显
如果太小，你只是 要开始截断数据
你会丢失信息。
如果它太大，你只是 排序告诉数据库
期望和 优化更多的数据
比它实际上可能永远得到。
那么，什么是合理的感觉 数为一疗程的名称？
60？好了，60。
这似乎很合理
只要是没有 例外的是。
真的没有 硬，快治。
说实话，对于 历史原因很多
的人会选择255 “导致多年，是那种
使用8默认的最大 字节 - 8位作为你的计数器。
我倒是更[听不清] 可能使用的2的幂
但它是那种无关。
因此，我们可以一起去60。
这似乎是合理的，只要
因为我们最终不后悔 因为那是一个上限。
现在，假设相反 决定已作出，
不变量，但字符 只是char字段。
所以不像C和C + +，烧焦 并不代表一个字符
和数据库 通常是指一个固定数量
在一个字符串中的字符。
什么是上行和/或 我选择60的缺点
对于一个char字段， 而不是VARCHAR？
这正是第一种 决定你将不得不作出
当检查[拼音]出 的项目与您的合作伙伴。
是啊，沙龙再次。
[无声备注]
好。所以，如果名称是少
大于60，那么你就是在浪费 不管这是三角洲
60和间 实际长度。
所以这只是感觉浪费， 更多的字节比你所需要的。
但它为什么存在？
当然还有一定的上涨空间。
是吗？
[无声备注]
当然可以。所以有时你 可能知道的定数
像10位字符 一个电话号码，例如。
但谁在乎，想干吗 不只是说反正11
或者为什么不说60 反正用VARCHAR？
有什么优势我们得到 通过了解和设计
对于一个固定数目的 字符？
[无声备注]
你在正确的轨道上。
所以它的优化，但 它是真正的 - 是吗？
[无声备注]
确定。好。让我们聚焦 在这最后一部分。
所以索引。
所以，事实证明，如果你 事先知道所有
您的领域将会 为60个字符，
你真的可以想到这 在Excel的数据库列
作为有很直， 左对齐
和右对齐边缘
因为每一列 是60个字符宽。
这意味着，这 字符串是60个字符程
从这个字符串，60 字符远离这一个
而这一次，这一次。
所以，就像回到你的时候 学过C，你有随机访问
在阵列的世界中， 这里同样的想法。
如果列表示 只使用固定长度的字符，
可以有效地指数 随机到60或120或180
你可以得到在单独 串快得多。
然后，如果不是，你列了 直左边缘可以这么说
但一个非常坚固的权利 边到柱
因为你可能会 有10个字符，
15个字符，5个字符。
所以这也是一个折衷。
有时只 通过试验和错误
和实验 你自己看着办
什么真的是正确的调用 是，但是这些都是种
的问题， 应该去
通过你的头脑和/或 表，当谈到时间
设计您的数据库。
所以，不一定是正确的 回答，但你应该
至少有一些 记住两句话
要备份什么 你做出的决定。
好的。
所以，让我们继续滚动 在这里提示
是的phpMyAdmin的用户界面。
所以，作为默认值 一个名字，我应该指定
它应该是有 空的默认值？
你怎么看？
一门课程可以有一个空的名字吗？
只是感觉怪怪的，对不对？
我想不出任何 不愿透露姓名的课程在哈佛大学。
也许有一些 不起眼的角落案例
其中一门课程都有一个编号
和教授有没有 选择一个名字对于它，但 -
我的意思是，要与赫克说，
像让我们甚至没有 打扰支持这一点。
我想说的兴趣 一个干净的数据库，
让我们来指定你不能 具有空的默认值。
或者，我们可以做 像无标题课程
这是不象与 Mac OS和Windows做
当你创建一个 文件夹，例如，
但也有使 一些更有意义
从而使人类看到的东西。
我们谈论的是一个 后台数据库大概
对于课程目录。
所以，我真的不连 就像给它的想法
在无标题课程名称
因为这不是真的 去帮助任何人。
因此，让我们离开这个无， 这意味着，当你插入
进入这个数据库，你有 给每门课程的名称
这感觉有点 清洁剂给我。
好的。
因此，进一步的滚动，整理。
这仅仅是因为有 字符集和诸如此类的东西
如果你见过 提到瑞典的
在phpMyAdmin这是 '导致人
谁写的phpMyAdmin 为瑞典语。
是，PHP或者是MySQL的？
其中的两个，我 忘了副手。
但它的历史原因
但你可以表达每 字符的英文
您可以与瑞典 所以它在很大程度上是一个非问题。
该CS50电器虽然是 使用 - 配置为使用UTF-8，
使一般应 不会弹出你。
属性。
所以这些都不是 真的与此有关。
我看到二进制，无符号， 无符号ZEROFILL，
并更新当前时间戳。
该字段仅适用 对于一些数字字段
或一段时间的字段。
所以我们略过 那完全是。
空。可这个字段为空？
因此，没有。我们已经有 诸如此类的谈话。
所以，我们不希望 一个默认值。
我们不希望它为null。
怎么样指数？
有四个选择这里。
是什么意思，如果我们指定
此行是怎么回事 是主键？
回想CS50或 如果你已经采取了CS165。
[无声备注]
没错。所以主键 由定义为场
唯一标识 每行中的此表。
而且你可以依靠它做 该唯一标识。
那么，是什么意思 然后仅仅是独一无二的？
嗯，有点这两个具有排序
的影响下 引擎盖下方。
但通常，主键是 排序你犯了一个合同
与数据库的事。
当我做查询 寻找过程中，
我打算用这个 特定领域。
我们会回来的 为什么我们可能有两个
这里这样的选择， 主要或唯一的。
独一无二的只是说，这 字段将是唯一
但我真的没有做任何 种在这里口头承诺
要使用该字段 做我的搜索
其原因我们会 看一会儿就好了。
如果我们指定，而不是指数， 这是什么意思，指定
一个字段上有索引？
是吗？
[无声备注]
没错。它已经 对查询进行优化。
所以，你 - 数据库服务器， Oracle，MySQL等，什么的，
将一般工作它的魔力 在幕后，一旦你点击
该选项，然后单击 保存并会建立
向上通常是一个树结构， B树如果你看过
或者听说过这是一个 很短的前瞻性树
，让你很漂亮 对数特性
对数据进行搜索时。
如果不指定索引 在现场，这是怎么回事
要运行 搜索时间
对于任意 【拼音】课程名称？
那是什么？
[无声备注]
哦，[听不清]，线性的，对不对？
如果没有优化 给予该数据库
你有没有想过 该数据库是什么样
数据的期望。
你能做的最好的就是检查 当你正在寻找一切
对于一定的价值，特别是 如果有可能
实际上是重复的。
全文同时，我们也会 挥动我们的手现在。
但是总体来说，这是一个 索引类型，它允许您
以优化的关键字 在搜索字段。
所以这可能是 一个很好的候选
像你这样的课程介绍 在那里你可能有一对夫妇
段落和你可能的 想要做字符串匹配。
全文将让一般 你这样做很有效。
AI，这是一个可怕的排序 的解释，但如果我们将鼠标悬停
过它，你会看到 自动递增。
不适用都在这里 但自动增量是非常有用的
对于像int类型的字段，因为 数据库会照顾
加PLUSING的处理的 它每次执行插入时间。
这样即使两个人 从字面上点击提交
在相同的时间和努力 以某种方式创建一个行
在数据库中，其中一个 他们将获得多少我，
另将得到 数字I加1。
您不必担心
大约两个数字是 分配相同的，如果你是
在代码中自己做。
好的。
样的，所以我喜欢在那里 我们已经有了一个名字的人。
因此，让我们单击保存。
这是一个很好的设计 对于一个数据库表？
而作为题外话，如果 生锈的SQL或您排序
只是总是视而不见 眼睛是怎么回事，
我可以键入 正是 -
在那些三线 黑色和白色提示
在命令行 客户端或者我可以做
在代码编程。
因此，所有的phpMyAdmin是干什么的 我，只是救了我的努力
有时想起的 语法和打字出来
喜欢繁琐的命令。
好的。
因此，这感觉并不像 最好的设计，一个字段的表。
现在，我们可以有 之类的东西教授
及位置和描述信息。
但即便如此，只使用名称
找出课程 感觉并不理想。
什么一般有 我们在过去所做的那样
如果你使用的数据库 唯一的行？
不使用VARCHAR的典型。
是吗？
[无声备注]
是啊。因此，通常一个疗程的ID。
因此，最常见的 接近慕名
使用框架时， 其实只是
使用许多类似的整数。
因此，让我继续前进，做到这一点。
我们可以在几个做到这一点 方式，但注意如果我放大
在这里的底部。
我会说加一 列在该表的最后，
一般只是视觉 方便你把标识
在该表的开头 尽管这并没有真正的
功能的影响。
所以我要说的话 添加一个列
在该表的开头。
我要去一下去， 给我回这个UI在这里。
让我们把这个ID。
如果我们认为我们将有 没有做更多的事4000000课程
int类型的字段是罚款。
我们甚至可以将其缩小
但空间是便宜 所以谁真正关心。
但是，我们正在努力 写Facebook的现在，
也许不是一件坏事 预测大整数
这将使我们的64位整数
但后来你从字面上 比特的数量增加一倍
你使用， 如此轻微的权衡
但值得考虑的。
现在，这是一个令人困惑 传统的东西。
您可能还记得 从使用MySQL
，任何时候你声明一个int 现场你会经常看到一些
它旁边像数字10。
它有没有关系 数的大小
或比特数。
这是因为有数量 所使用的字符
直观地显示 这个int场
使用终端窗口时。
所以我们可以看到，在一个时刻。
所以，千万不要被误导 通过键入数字
在那里，即使它的 有效问我们
对于一个在这里。
在这里，我要 继续前进，说无符号。
有没有理由浪费 我们所有的负数
自数据库 一般是将
假设正 值或空值。
该ID肯定 不应为null。
那你想想 该指数为这个ID字段？
让我们把它首要。
那么，如果，不过，像我一样 只想到一个CS164课程
在哈佛，只有一个 CS50课程在哈佛
那是相当 很多真正的整体
这有可能例外 [听不清]两个学期
或一些奇怪这样的。
但更根本的是， 为什么是更好
用数字组成的ID 唯一确定的课程，而
不仅仅是一个唯一的字符串？
是吗？
[无声备注]
好了，有趣。
所以，如果我们有几分 交叉上市的课程。
所以这是一个很好的例子。
我不知道我会 解决，虽然
通过给他们同样的 ID号，如果这
你要去什么地方这一点。
没有？确定。但绝对是一个 角落的情况来考虑。
如果有几分 - 我们需要某种
的别名可能。
[无声备注]
当然可以。
[无声备注]
这是一个很好的例子。
这个名字可能会改过来 时间，完全合理的。
还有什么？
[无声备注]
对不起，再说一遍。
[无声备注]
是的，没错。
因此，其实，这是 真正的硬道理是
，使用一个32位的int是 可能将是更快
比一些变量 长度的字符字段。
在第一种情况下，在罐 从字面上适合在寄存器中，
不要说太多 更小的内存占用。
在后一种情况下，你会 有做度假区[拼音]
以字符串比较的 在自己与线性
中的大小 字符串可能。
所以，这是一个不错的 优化，
特别是它要
让我们做什么是所谓的 加入更有效
在短短的一瞬间。
因此，让我们做到这一点。
我们将指定 这是主要的
因为我并不特别 要关心或想
什么数 是当然的。
让他们承担 任何值他们想要的。
我要说的自动递增 这样我就可以外包的细节。
正如在一旁您可能 知道哈佛
至少确实有独特的 数字的课程。
我不记得 这是什么课程是。
我知道，CS50的 目录号为4949，
完全是任意的。
但有怪异 角落案件中，即使
在registrarial转储 当然目录数据，
有时课程，老 课程有一个像4。
但在技术上是 字段是一个char场
这只是开始，0004。
所以在这里也一样，你必须要 小心区分
事情像之间 课程目录号
其中可能有一些人 概念固定的长度，0004，
你不应该存储 即例如在一个整数。
那种现场的应 存储在别处。
因此，在哈佛，如果我们 其实制作过程
购物工具，它的 可能不够
到数课程 只用1，2，3，4。
我们可能将不得不
有另一场 所谓的目录编号，
这还假定 是唯一的基础
在这里人的约定 但它不是最好的选择
为一个唯一的标识符，因为 它可能是可变长度的。
它可能不是4 字符，这可能是5。
其实，我觉得几 几年前，他们移动
五个字符'事业有 有超过999场
在全部或类似的东西 如此，或9,999课程。
因此，这可能是一个例子 其中字段不是主
但它应该是唯一的。
和电子邮件地址 是另外一个。
你可能会希望它是独一无二的
但不一定 你的主键。
好的。
所以让我轰轰烈烈的另一 表比这快得多。
所以，我要调用这个 1教师我要去
给这个总 的两列的数目。
我要学我 教训从最后一次。
我要去打电话 第一列的ID。
我要去叫 第二列名称。
我也要做VARCHAR。
我将不承担任何 教授有一个名称长度
超过60个字符，但 现在，这可能会推动它
有些长文件名，特 人的中间名。
那好今天。
因此，让我们翻阅了这里。
让我们把这个签名了。
让我们把这个主。
我们将允许重复的名称
万一有2约翰 史密斯的或类似的东西。
现在我们有两个表。
所以，现在，这引出了一个 问题我怎么关联
在教练的课程？
我觉得像我种 得到了自己前进
因为如果一个教练 讲授一门课程，
我的第一本能会 实际上是要回去
要实现课程的，这 是不是一个好主意。
让我实际添加一列 在该表的最后，
单击Go，我会 调用这个导师。
我会让这个VARCHAR 我会让这个60。
也许我会离开它现在空
在案件的过程中有没有 被无符号的教练
之前，有时会发生 任期开始，然后单击保存。
这些设计 你更喜欢？
第一个，我们有一个 单独教练的表
或第二，我们只是 一个字段添加到课程？
所以这是一个紧密联系 教师与课程设置。
[无声备注]
确定。好。不过，让我推回。
这只是这么简单的像我一样 只要输入这个人的名字
到这个表中，肯定像 有一定的价值或 - ？
[无声备注]
好的。
好吧，让我很难在这里。
所以，让我说， 这当然是CS51
我知道它的教 今年由两个人。
所以，亨利莱特纳 和杰西TOV，但 -
所以我只是把一个逗号 两者之间，正确的。
我在真的好 CSV从昔日。
[无声备注]
没错，右。
只要你再打 到这样的事情，
这可能会觉得 合理的，你可能会感到
这样是一种聪明。
那种我借1 想法是把工作做好，
借用一种新的思路和 这类组合它们。
那种你完全击败 使用该数据库的点
摆在首位“的原因 如果该值中的一个
使用的是更快的搜索 因为各种指标
和表格，可以 建立到你
由数据库引擎本身。
现在，如果你想搜索 所有课程
耶西教，现在你有 要做到所有子串的匹配
指导员多个领域，
这实际上意味着线性 再次搜索，因为你有
找到这个任意设置 三个字符的任何地方
在前面的教练场
也许在后面 一个逗号。
因此，这绝对 并不是一个好兆头。
所以，让我回去到表中。
让我继续前进， 课程撤消。
我将只是去 前进，丢弃场。
如果你想 手动执行此操作，
语法ALTER TABLE 课程掉落讲师。
因此，让我们继续前进 并说是这一点。
然后回到这个想法更早
在那里我有一个单独的 表教官。
但是现在这种感觉有点 就像我可以把一门课程
在使用过程中的表 和讲师
在老师的桌子，但我 需要以某种方式连接两个。
你会怎么 建议我们这样做吗？
[无声备注]
好。因此，让我们做到这一点。
并且你可以调用这个 表在理论上任何东西。
我要去刻意 叫它什么了不少
框架会 调用它，其中，
Laravel您将在一个位见。
我要去当然称它为 强调导师。
在这个用奇异 情况下为每一个字
和全部小写 再次，并且还与 -
然后按字母顺序 排序从左向右。
这完全是任意的，但 它往往是一个常规
在很多这些框架 在其他语言PHP。
多少列，我需要在 这个我们称之为一个连接表什么的，
加入其他两个 表连接在一起？
三列？
哪一个 - 那又是什么？
[无声备注]
确定。好。这一工程。
我们可以在技术上 在这里切开一个角落里，但很多
特别是框架 仍给予，即使这些行
唯一的ID，即使 语义上的行
我们真正关心或 我们真正关心的列
约是后者的2的 你说的是什么，课程编号
和教练的ID。
因此，让我们做到这一点。
我会打电话给该行刚刚ID， 就像我们以前那样。
但是这一次我要去 调用过程的ID。
这一次我要去 叫导师的ID。
而我要去 指定所有
他们是无符号 因为我想
最大限度地提高我的4 十亿整数范围。
没有人应该为null。
我要去指定 ID应该还是主要的。
再次，这是 只是一个约定，
很多框架 即使你不排序
从根本上需要一个 唯一标识符的行，
事实证明，它的方便 代码中，SQL是怎么回事
是自动 对我们产生的。
所以，我会离开，作为主。
但现在那种，我 有一个设计决策，
当然ID和导师的ID。
什么指标如有 他们应该得到什么？
如果我会离开没有索引， 有什么含义？
什么是暗示？
性能和以前一样，对不对？
如果不存在索引，则 最好你能做的就是那种
的[听不清]通过 整个事情找数字。
所以，不觉得自己聪明。
它应该是主要的？
那么，为什么不呢？
为什么不主？
[无声备注]
完美的。所以，我们推出 出[拼音]小学。
我们已经选择了。
因此，它应该是唯一的？
[无声备注]
好。所以，如果你假设 当然每一名导师，
完全罚款。
这就是绝对 常见的情况
但我们已经把断其一 也许是熟悉的例子。
CS51有两个教官 所以我们亲切
现在拧在这种情况下。
如果我们这样做，只允许 一名导师，
我们其实可以做的方式 与完全连接表，
回到前面的方法
并把对事不对人的名字 也许是，但教师的ID。
如果你知道每一个课程，作为刚 一名导师，你可以有只
一列。
但变性 是什么让我们陷入麻烦。
好的。
因此，它应该是唯一的？
编号全文不 觉得适用。
正如我们以前说过的
像子 匹配的说明。
那么，关于指数？
嗯，索引可能 我们的最佳人选
它告诉MySQL的优化 对于这个搜索
还是让我解释一下， 优化搜索或加入
正如我们将在短短的一瞬间看到
所以，他们是一 小更高效
比什么纯粹的线性关系。
我想汽车 增量这个领域？
因此，没有，因为真正的 父元素存在
在课程'表。
这就是它的 要得到加，
再加上，当它实际上 插入。
在这里，这一切会 要手动插入的
我们大概在代码中。
因此，让我们简单地指定 这两个课程编号
和教师的ID有索引。
现在，我们将继续和保存。
而现在，只是为了显示 您的信件
之间有什么好的 GUI界面友好
和命令行界面。
让我继续前进，做 下面这个MySQL的提示。
我会说使用courses50
这是任意名称 我给了这个数据库。
而现在，我什至不 还记得我们所做的。
因此，让我键入show表
一般分号 将在这里您的朋友
完成该查询。
它就在那里。
因此，这里的行或相当 我们这里的表。
现在，我忘了是什么 一个疗程的样子，
所以让我做课程介绍 而现在我看到的排序的ASCII
或者一个版本是什么 phpMyAdmin的是做
而我看​​到，ID是一个i​​nt。
还有就是10。
这是什么意思？
这只是意味着，当它的 显示它要采取
最多10个字符 终端窗口。
它是可为空？
号这是主键。
它可以有一个默认值？
号和额外的特殊 标志像自动递增。
所以，就让我们做一对夫妇 快速插入这里。
我要上去 到 - 让我们只说。
让我们改变状态到幻灯片
排序的，我预先准备 这个。
这是随后的概要 所有这三个表。
我已经只是手动 键入的第一个命令。
在这里，我说干就干， 键入别人给你的。
这仅仅是 文体的事情。
一般来说，很多人 在全部大写输入SQL语句
然后表名和 小写字段名，
如果仅仅是因为它 那种看台
什么是你的术语 什么是数据库的语法。
所以在这里，我们有三个 表，课程，教师，
和课程导师。
在幻灯片中我事先做了， 我没有ID字段
但是这不是真正 一个坏事。
我们只是看到一个 第三栏出现。
如果我这样做了吗？
所以，现在让我建议 我们做了一堆插入的。
因此，这里的一些数据， 我会放大。
所以我要提出 在课程，
我们只处理三个疗程。
我选择了这三个 “因为他们是代表
一些不错的 - 他们有 一些很好的特性。
CS1，CS50，CS51，他们 有越来越多的ID
但ID是什么 是完全不相干的。
这仅仅是顺序 他们被自动插入了我。
怎么样的导师？
所以，现在，因为亨利·莱特纳 教两个CS1和CS51，
这是一个样的时机 寓意为我们的设计。
和杰西教CS51 和马兰教授CS50。
所以，现在 - 或者更确切地说，这些都是 只是那些人的唯一ID。
与课程和教师， - 课程导师，注意到这里。
当然ID1，这 在CS1是教
由导师ID1谁是亨利。
当然ID2，我 认为是CS50是教
由导师ID2， 这是马兰。
然后最后，CS51，和 注意到我们有两列。
现在这就是为什么加盟 表是强大的教导
双方亨利和杰西。
因此，这是一切优秀和良好的，
但我可以勉强 记得关闭顶部
我的头谁是谁在这里。
你怎么可能 处理，在代码中，
无需 硬编码的东西？
嗯，这就是SQL本身 开始成为我们的朋友。
而且我要建议 我们可以键入以下命令。
我会在这样做 实际的提示。
让我继续前进， 将这些东西。
所以，进入课程表 让我们做什么，我们有一个
刚才。
我要直截了当地说出， 让我们将CS1和CS50。
让我们来插入一些更 行一次，CS51。
现在，让我继续和保存。
好吧，所以我只是 尽快重建
尽我所能的关系 我们刚才看到的屏幕上。
所以在这里，我们有 莱特纳，我们这里有马兰。
让我们给自己 另一行，并TOV。
现在让我保存这个。
和我做他们故意 进入的顺序相同。
不，我忘了给 这种自动递增。
让我很快解决这个问题。
我将在解决这个问题 网上的代码。
失败作为备用。
事实上，我做不到 插入莱特纳和马兰
和TOV失败了，因为我没有 即使指定一个ID号
它的期待之一，我 忘了检查自动递增，
这意味着他们都 默认情况下，越来越为零。
但是，当时的矛盾 我们已经指定的属性。
主键被侵犯 因此它甚至没有让我这样做。
因此，让我解决这个问题。
现在，让我回去 这里插入选项卡，并指定
我想莱特纳，马兰 并且，多一个排，TOV。
而现在最后，唯一的 一个有点硬
要记住的是过程 指导员。
现在，让我们插入 当然ID1是教师ID1
所以这是CS1和亨利。
当然ID2是教练 ID2这是CS50和马兰。
然后在最后的我们 担心是当然的ID3
这是CS51，是教
由课程导师 1，这是亨利。
三是还教 由3，这是TOV。
所以希望现在 我们已经重新创建这个 -
该死的，我也做了同样的事情。
课程导师 需要自动递增。
好的。
我会做这个更快的这个时候， 当然1，课程1，2，2。
而现在最后，我们做CS51 这当然有ID3和亨利。
当然ID3和杰西。
这看起来不错。
确定。所以，现在，让我们回到 到终端窗口。
所以，如果我描述 课程，我们会看到这一点。
如果我想看到的课程，我可以 现在要做的课程选择明星，
分号，而现在 我们看到这些值。
而现在，还有什么 我想干什么？
从导师选择明星， 这是如我所料，
并从课程选择明星 - 当然下划线导师。
所以，我怎么现在加入 这些表？
所以，既然选择之美 在这样的ID值是
如果你仔细想想 服用疗程表
和导师 表，然后插入
这两个在你的 心灵课程导师
表，你可以种行 把所有这些ID列
这样你将它们合并到 一台庞大的列有所有
的信息 我们所关心的。
这种情况的SQL语法 不一定是显而易见的，
但是让我们看看我们是否能够做到这一点。
从课程，所以选择明星，
并有几个方式 因为我们能做到这一点。
我要敲回车只是为了 那种格式的东西很好，
但箭头仅仅是一个 症状客户端工具，
它没有任何关系 跟SQL本身。
从课程，所以选择明星。
我要马上加入 课程表
在课程导师表。
怎么样？在所谓的现场 courses.id等于课程
强调教师 点叫什么名字
相应的字段中 在这里，我要一对夫妇。
这不是ID。
It's - 什么，你说​​什么？
>>课程编号。
好吧，让我缩小。
但我想利用 这一步。
现在我已经做到了这一点 桌子和这一个。
现在，我想拉 这家伙也是如此。
所以，让我进一步 参与这件事
对教师的 表的是什么？
当然下划线 instructor.instructor ID
等于instructors.id。
因此，我们可以写 这个查询在几个方面。
在我这样做的顺序 是不是所有的重要。
我只不过做了它 从我的脑海左到右。
我们可以这样做 在几种不同的方法
但如果我现在有 分号，然后按Enter，
请注意，我得到一个新的 临时表，结果集
所以在数据库中讲说话。
和我有什么 在这件事情？
我有身份证，名字，另一 ID，哪一种是混淆
给我的那一刻， 一，课程编号，
一个教练的ID，ID和名称。
这样，在一天结束时 我们现在有正确的数据。
我可以看到，CS1是教 由莱特纳，CS51是教
由莱特纳和TOV，并 CS50是由马兰教授。
但我对有点紧张 这种模糊我已经创建。
什么是模糊 我影射？
是吗？
[无声备注]
有3个id列。
因此，我们实际上可以解决这个问题，并 我们要实际去
推迟到我们的框架 最终帮助我们与此，
但事实证明，有 在SQL关键字称为S，
在这里你可以指定一个 别名，一个字段的新名称
这样我们就可以避开这个 歧义完全。
但意识到，如果我们不这样做 不知怎么解决它与
该关键字或一个框架，
有这个可能 歧义，如果你尝试
访问ID字段 因为显然有那些
具有重复名称的出现。
因此，这是一个连接，我认为 在你的心灵之眼的最佳方法
想想真的 是取两个表，
在它们对齐 你想要的方式。
这就是所谓的 内部联接在这个意义上
我们正在结合 表在这里。
还有其他类型的 加入我们可能会遇到
随着时间的推移像外连接，
但在大多数情况下这 可能是最常见的
重构数据。
我们现在所做的是 一般什么叫做
正火您的数据，从而使 有没有重复的任何地方
在你的表。
并通过重复，我会 都意味着第一种方法。
如果我们曾经提到莱特纳 和TOV在多个地方
在数据库中，这不是 通常最好的决定
特别是如果他们的名称可能 更改或加班的情况下
婚姻，娘家姓威力 改变自己你只是想要一个
对于一些典型的地方 数据值一样的名称。
好的。
所以，总的来说，我们已经有一个 一些设计决策，使
并且最重要的 可能减小到一定
的索引的这些选择。
但我要指出的 一件事为好。
如果我回去的phpMyAdmin，
一个特点你可能不 也遇到过就是
以下。
如果我去课程导师， 我已经没指定某些
这些东西有索引。
但让我去结构 当然导师标签。
现在让我点击索引 并注意以下几点。
我在这里指定 有一个主键
在名为ID的列。
这是一个比较复杂的 指定基数的方式
等为指 该字段的字节大小。
不过现在我也有另一种 场，当然ID，这是 -
当然ID，这是做 提前和独特的，确定。
我在做这个 提前给我们。
那么，为什么是这样的 - 让我放下 本作是就事论事。
哦，你知道我做了什么？
确定。因此，早期，人们的 使用GUI工具的危险
这样，当我们 创建此连接表，
课程导师表， 记得我在指定的
我想要一个索引 在这个领域
并在此索引 其他领域。
的副作用 同时检查这些盒子
在同一屏幕上是 phpMyAdmin的从推断，
我想不是两个 单独的索引，
我想要一个连接索引的 一般只有有帮助
或大部分，当你有帮助 搜索不上一个字段
但是这两个字段。
这就是为什么我们有 他们有相合
所以我放弃了它，因为那 是不是我的意图。
相反，我要去 在这里重做这一点。
我会去的过程中ID
并根据以上我只是 要说添加索引。
我要去下得去 教师ID和说添加索引。
现在，如果我们点击这里， 请注意，我们有三个指标，
一个主要的，因为我 意一个用于每个
这些外键。
我把它叫做外来因为 在此表中的地图，课程编号
到现场，刚需 清除，在另一个表中。
名为ID的主键， 在所谓的课程​​表，
与同样处理的其它之一。
但现在，是一个有趣的 欺骗，真正的技术。
我只是一往直前，让我 做到这一点更慢。
在同一屏幕上，通知 它说关系查看这里。
点击这里，现在通知我 拿去做一些限制。
因此，有利的一面一人还
不仅使用概念 外键与其它表
就像我们刚刚上是 通过定义一个索引
对他们，你可以有 数据库帮助你更
保证诚信 那场。
具体地讲，我现在可以 通过这种下降指定
减的过程中ID字段
在此表中实际 地图上courses.id。
同样，教师下划线 ID映射到instructors.id。
现在，这是为什么有用吗？
好了，请注意，在右边 右手边现在是什么会出现。
我现在可以教 数据库，如果亨利
比如永远退休 和他行消失
从教师的表 共从而为
删除，我可以通过这个 级联的方式确保
他教的任何课程 不再与他有关。
我可以教数据库 删除行
在这个所谓的连接表 如果亨利自动或一个
他的课程中消失。
现在，这是为什么引人注目？
是吗？
[无声备注]
您只需做一次 和长期的，对不对？
这很容易，如果排序 人们来来去去，课程来
去，你的数据库可以 一下就散落着课程
并与教师是无 长相关的数据集。
您的信息开始得到 很脏乱和陈旧，
所以在这里我们可以进行排序
的执行部分 这些限制。
是吗？
[无声备注]
它知道通过这种方式。
这是屏幕的地方 我们指定一个联动
外键之间 和主键。
因此，所有的命名 约定提到我
早期只是约定。
有没有内在的含义。
这是在屏幕 这是唯一有用的
您指定的索引后 每个这些领域，因为我们做到了。
而对于这个下拉列表，我们有 比如几件事情
如果一门课程被删除，您可以 实际上阻​​止删除
情况发生，如果有 在这个表中的一行
由刚说，限制。
换句话说亨利 不能退休
直到我们去耦他 从CS51和CS1。
所以这是一件好事。
但它可能引发 在你的代码中的错误
如果你不预期， 或者我们可以有一个级联，
类似的级联喜欢 级联样式表
和级联 瀑布意味着，如果一个 -
如果亨利退休等等 - 通过得到删除
所以在这里将他排 被删除。
无动作意味着什么或者为null 是一种有用的，如果你有种
的想一些历史记录 亨利被教CS51，
但你只是想这一领域的 为null，以便有行
但它不是任何时间 与他有关。
因此，这些都是非常强大 技术，您可以
并应使用，即使 在特别的兴趣
节约你自己。
因此，让我提一 情侣在这里最后的细节，
成分与 可能有帮助
作为我们规划数据库设计。
您还可以选择 在数据库引擎
您在您的代码中使用。
如果你熟悉 CS161你可能 -
甚至是61，你可能一般 熟悉文件系统。
这里面的东西 像，NTFS和HFS +
和X2FS4 [拼音] 和3，等等。
有不同的方法 的存储桌面上的数据。
同样在那里 存储数据的方式不同
在默认情况下，数据库 至少在电器
与最新的版本 MySQL的。
我们一直在使用 所谓，NoDB数据库引擎，
它支持 一些不错的功能。
但另一种常见的是还 所谓MyISAM和另一
，可以使用的是记忆， 这意味着不要放任何东西
在磁盘上，只是不停 留作回忆。
在大多数情况下，你可能 不会出问题才刚刚开始
与NoDB，但对于任何项目 这往往涉及高利率
插入的实例， 像很多快速测井，
每秒几百的东西 或者几千的东西。
任何时候你有一个 很多东西要去
对数据库中的 那么这两种
较低层次决策 开始涉足。
对全文的功能 例如仅在MyISAM表
因此，有一个含义。
但是，你可能还记得这一点，让我们 至少激励我们为什么关心
关于NoDB尤其如此。
比赛条件 通常指的是什么？
好吧，这是一个 暗指的一些例子
你可能听说过的 过去几年无论161或50
在那里你有一个室友， 你们俩真的很喜欢牛奶，
一个你回家先打开 冰箱里有没有奶，
关闭冰箱走过 街道CVS和获得
在网上买了一些牛奶。
同时，你的室友 回来这里。
她也喜欢喝牛奶。
打开冰箱， 实现无乳。
在这里，她然后去 存储，也许是其他的CVS。
快进几分钟 以后你再回来，现在这两个
您所购买的牛奶。
其中之一是现在要 破坏，因为你不
像牛奶一样的多， 这是一个问题，对不对？
因为你们两个检查 一些变量的状态
并提出基于决策 就可以了，即使状态
该变量的本质是 在被改变的过程中，
都将是缓慢的 它需要一定的时间量
去和从CVS。
那么，什么是一种愚蠢的真实 世界解决这一问题？
留下一张纸条，对不对？
这是发生最后一次。
总是留下的注释，或 挂锁的东西从字面上。
我说挂锁，因为 如果你采取或采取CS161，
锁定是一个基本 想法是什么样的世界。
所以竞争条件可能会出现 同时在数据库中世界
你也许会记得从 CS50资助，如果你花了50，
这段代码，我们居然给 你们在规格
在当时，这样你 操作是所谓的原子。
如果你想，在这 情况下，买的股票份额
和股票有 一些特殊的符号。
我们告诉你要使用如下代码 这样，因为通过这种方式
对重复键更新 语法，这是建
到MySQL你有效 这样无论是在插入
或在更新后 做一个选择，看看
如果一只股票已经在那里。
换言之，在模拟 购买股票的世界
牛奶和冰箱 可能是，第一，
才买的份额 谷歌你可能想选择
从数据库中所有的 谷歌大卫拥有股份
看他是否拥有零个或多个。
一旦你看到他是否拥有 零个或多个有
到然后执行以下操作。
你要么做一个插入
如果他拥有零“的原因 有没有排大卫然而，
或者你必须做一个更新 如果至少在理论上你想
让每个用户一行。
问题是选择 该股份数目
然后更新或 插入可能会被中断
别人在另一 计算机终端试图购买
或出售部分大卫的 股股份是否
良好的目的或排序 恶意目的。
这就像去商店 当你的室友回来
并检查状态 变量。
所以这个语法的时候 这是适当的排序
为CS50，避免了 问题完全。
它只是做了这一切 魔术锁定你的，
但现在这些种类 对于这门课程项目
其中最有可能将 涉及更复杂的数据集，
你不能达到 总是原子性。
一切都发生 一次或根本不
不中断 如此优雅。
因此MySQL的，另一 数据库引擎，
支持东西叫做锁，
据此，你可以说这锁 表，以便只有一个治疗
一般只有一个用户可以 在任何时间点触摸
读取或写入和 那么你就可以解锁。
这是从1的示例 ，MySQL的自身引用
在那里，如果你有一个像银行 帐户，你试图
从扣钱 然后加钱。
你可能想 确保两个
这些事情一起发生
因此，有没有 数学错误
没有人的损失 钱，不知何故。
有锁的问题 尽管在一个数据库
它通常是指 整个表被锁定，
这意味着，如果你有 百人试图
做企业与银行 线上在相同的量
只是时间的一个 他们可以去的时间。
这是愚蠢的，尤其是 在当今的服务器
具有八个当然，16 当然，有一个巨大的数额
内存，有没有 理由全部连载
您的交易如果这些 客户只打算
用自己的行交互。
所以NoDB让你做 事情变得更加智能化
这通常会 你把代码中的方法，
如您使用的东西 所谓的交易。
而你这样做一般 在PHP代码中，
Ruby代码，Python的，不管。
但SQL代码的 最终用的是这个，
通常。
启动事务，那么你 指定两个或多个查询
要 完全执行
不中断 或根本没有。
甚至可以有一些 在选择报表
或某些删除或更新。
但好处是， 数据库将足够聪明
以确保它只会 锁定它们实际上的行
参与这一更新 或选择或删除。
所以，如果你有几千行 而你只触及3
其中，仅该子集 表中的将被锁定
这意味着与其他99 客户可以触摸他们的行
不被序列化 和你放慢。
同时，这是最好的 方面的事务。
他们是在一个交易 感觉像161上的文件系统，
他们交易
这意味着你可以滚 他们回来，你可以撤消他们。
这就好比命令 或控制的F数据库。
如果您发现部分 一路过关斩将所有
你的各种数据操作， 拍摄时，事情错了。
你从字面上执行 不同的SQL查询回滚
而所有这些趋势 - 所有 你执行的语句
说开始后 交易消失
仿佛他们从来没有发生过，
这是一个令人惊讶 强大的东西。
而这些都是种 东西肯定是在我们50排序
的扫到地毯下和 你只是一种假设
这一切都会好起来。
但是，一旦你开始 想真正的项目
和真正的用户和 你的数据库的完整性，
这些是种 设计决策
这将是很重要的。