>>所有權利。
因此，事不宜遲，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是一個int。
還有就是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排序
的掃到地毯下和 你只是一種假設
這一切都會好起來。
但是，一旦你開始 想真正的項目
和真正的用戶和 你的數據庫的完整性，
這些是種 設計決策
這將是很重要的。