>> Добре.
Отже, без подальших церемоній, SQL, Мова структурованих запитів.
Таким чином, ви, ймовірно, використовували це у мере в CS50, може бути, в CS165,
може бути, у вашій власній особисті проекти.
І що SQL дозволяють вам робити, в SQL Server більш загальному?
Так?
[Нерозбірливість Зауваження]
Добре, що це було дуже забезпечений спосіб сказати це.
Так. Так він дозволяє зберігати дані
і що більш важливо дозволяє Ви для запиту даних.
І це є кроком вперед
від використання щось простіше як CSV, правильно.
Розділені комами змінних.
Подібні значення.
Аналогічно дозволяють зберігати Інформація один рядок
в текстовому файлі.
Але те, що зворотний бік CSV файл для зберігання даних,
навіть якщо ви ефективно отримати рядки і стовпці з нього?
Так.
>> Вам не 'мають та ж організація
Ефективність [нерозбірливо].
>> Вам не доведеться те ж саме Ефективність організації.
Що ти маєш на увазі?
>> Ну, як [нерозбірливо] є як первинна [нерозбірливо].
>> ОК. Так.
>> Це реляційна база даних Ви можете мати кілька баз даних
пов'язані один з одним в дуже специфічних способів.
>> ОК. Добре.
>> Це [нерозбірливо] встановити CSV.
>> І дозвольте мені налаштувати трохи термінології.
Так кілька таблиць в базі даних, звичайно,
і що виходить за рамки ви можете зробити за допомогою тільки одного CSV.
Але насправді обмеження з CSV я б сказав, є
що неефективність усього цього.
Це дуже легко макета.
Але якщо ви хочете зробити запит, що час роботи
будь-якого запиту на вибірку на файлі CSV?
Я маю на увазі, що це великий старий [нерозбірливо], Добре, тому що в гіршому випадку,
вони виросли на самому дні.
Навіть якщо ви сортували всю CSV файл, якщо ви не знаєте,
що авансом, а, ви все ще будете мати
шукати все це.
Таким чином, серед речей ми збираємося, щоб отримати
використовувати фактичне база даних, що використовує мову
як SQL є ми можемо запросити це і ми можемо заздалегідь
як дизайнери баз даних вказати які поля,
, Які були, ймовірно, буде мати питання про так, щоб люди
в MySQL або Microsoft або Oracle,
хто зробив базу даних Ви використовуєте може зробити все
з важкій роботі з'ясувати, в порядку,
враховуючи мільйонів цих IDS.
Як ми можемо макет - їх у пам'яті?
Якийсь дерева структурувати, можливо,
так що, коли ви робите насправді виконати Select,
це те, що це логарифмічна або логарифмічна
логарифмічною в часі, а чим насправді покладених
в щось лінійною.
Таким чином, ми отримали багато продуктивність таким чином.
І ми можемо також зберігати набагато більше Дані з більшою готовністю "викликати SQL
Сервер зазвичай зберігається в оперативній пам'яті, хоча частини
з його можуть зберігатися на диску і ви, ймовірно, вже знаєте,
що ОЗУ, як правило, швидше, ніж диски,
так що це хороша річ.
І ми можемо також обробляти паралелізм набагато краще.
Якщо ви взяли 165 або 161, Ви знаєте, що якщо дві людини намагаються
щоб зробити те ж саме відразу в системі,
погані речі можуть взагалі відбудеться.
Так серед інших функцій, які ми можна отримати, якщо ми проектуємо наші столи
в правильний шлях поліпшена підтримка і безпека
коли справа доходить до паралелізму.
Так, дві людини в двох частинах
світу, використовуючи те ж саме сайт, якщо вони обидва намагаються
щось купити в той же Час, що порядок не збирається
йти в одночасно.
Так чи інакше вони були б по частинах кимось іншим, ніж наш власний -
хтось інший, ніж ми самі.
Воля бази даних зробити це для нас.
Тому, коли його найпростішій формі,
SQL дозволяє нам запитувати реляційна база даних.
Реляційна база даних це той, який має одну
або більше таблиць в ньому звичайно.
І якщо це трохи знайомі,
ви дійсно можете просто думаю, про це, як Excel або номера
або електронні таблиці Google.
У нього є тільки рядки і стовпці і, як правило у верхній частині кожної
з цих рядків має назву для нього.
Так що це може бути ідентифікатор колонка, колонка ім'я,
колонка адресу і так далі.
І тоді ви можете мати кілька такі таблиці, якщо ви хочете
почати з викладенням різні типи даних.
Але ви, напевно, пам'ятаєте, принаймні від CS50, що ми намагалися
щоб дати вам з графічним інтерфейсом інструмент [нерозбірливо]
для управління базою даних.
Вона називалася PHPMyAdmin.
Так що це просто збіг, що вона була написана в PHP, дійсно,
але це був всього лише веб- інтерфейс до бази даних.
І через різних вкладках і посилання, не могли б ви почати
налаштувати базу даних для себе.
Але хороший інструмент, щоб почати отримати трохи більш комфортно
з також командного рядка клієнта.
Так що, якщо за допомогою CS50 Appliance або дійсно за допомогою будь-якого макросу ПК
що має командного рядка MySQL клієнт, ви також можете зробити це свого роду
зі старої школи, як це.
Як осторонь проекту MySQL, принаймні, з відкритим вихідним кодом версія
з його зараз називають MariaDB для різні причини ви можете прочитати
на Вікіпедії, але це те ж саме програмне забезпечення,
це той же синтаксис і так далі,
майже те ж базовий код.
І тому, коли я на це підкажіть тепер я можу взаємодіяти
з моєї базі даних набагато більш вручну.
Так мова, дозвольте мені йти вперед
і просто відкрити вікно терміналу.
Мені довелося бути за допомогою CS50 Appliance, але ви можете зробити це
на більшості будь-якої системи в які ви отримали право
встановлене програмне забезпечення.
І я збираюся зробити MySQL-U для імені користувача Джона Гарварда
на даній системі,-п ввести пароль, що я буду введіть
в трохи більше надійно, натиснувши Enter.
Тепер я запропоновано.
Я збираюся ввести малиновий в CS50 Appliance
і тепер я бачу, по суті що ж екран.
Але є команди зараз що ми можемо почати друкувати
як показати баз даних, і що збирається показати мені все
з баз даних, які у мене є вже створений в системі,
в значній мірі той же список ви б побачили в PHPMyAdmin.
Там в пару таких же, як відомості про схему та випробувань,
який, якщо ви копатися CS50 Appliance, ми приховати деякі
з цих таблиць нижчого рівня
але вони були там весь цей час.
MySQL насправді має низький рівень властивості, як імена користувачів
і паролі для бази даних Сам, не для вашої програми
що ви могли б бути працює на ньому.
Так заздалегідь, сьогодні, я створено пару баз даних,
один з яких називається courses50.
Коефіцієнти деякі з вас використовували CS50 Звичайно торговий інструмент,
який є великим інтерфейс для Звичайно Каталог Реєстратора.
І це насправді хороший набір даних, щоб говорити про 'причини,
один, ми ніби все очевидно, знайомі з курсів
та інструктори і зустріч місця і все начебто
звичайних речей університету,
але він також отримав деякі цікаві можливості
для дизайну.
Таким чином, ми думали, що ми використовуємо Поняття каталог курсів
і торговий інструмент, як приклад усій сьогодні для сортування
з кадру деякі конструкції Рішення, які ми повинні зробити.
Отже, давайте почнемо там.
Припустимо, що я насправді хотів представляти супер найпростіших
Звичайно покупки інструментів.
І найпростіший світ Я можу собі уявити і один
в якому викладаються курси і є інструктори.
І давайте припустимо заради обговорення
що кожен курс має принаймні ім'я.
Так давайте почнемо ескіз це.
Я збираюся використовувати PHPMyAdmin просто для зручності,
таким чином, ми не повинні вдрукувати всі запити вручну.
Але от я в моєму courses50 бази даних.
Якщо не знайомі з цим, воно буде бути дуже легко, якщо ви упірнаєте
і власного проекту якщо ви хочете його використовувати.
Я збираюся створити таблиця називається Курси
і я можу тільки думати, одного поля
на даний момент, назва курсу.
Я збираюся йти вперед і скажімо дати мені один стовпець.
Тепер, як ви пам'ятаєте, ви отримуєте інтерфейс, який трохи
як це.
А інший з ніг відверто з PhpMyAdmin є те, що він начебто
само-інструктаж, і що через що випадають, ви можете сортувати
з дізнатися, що ваш можна проектні рішення є.
Так що я збираюся дати кожен курс ім'я.
Ця назва цієї колонки.
А як щодо його типу даних?
Більшість з вас повинні знати в міру деякі з цих типів даних
від попереднього досвіду.
Що доречно для назви курсу?
Шарон?
>> Varchar.
>> ОК, VARCHAR, які є змінною Char.
А що значить, що означає більш технічно?
[Нерозбірливість Зауваження]
ОК. Так що це рядок.
І вар аспект з це означає, що?
Мінлива. Але те, що це означає?
Так?
[Нерозбірливість Зауваження]
Саме так. Так що це змінна Кількість символів
в рядку вгору до деякої максимальної.
Отже, ось наш перший дизайнерське рішення.
Ми фактично повинні вирішити скільки байт максимально
виділити кожному такому рядка.
Взагалі кажучи, ви хочете така не робіть це занадто мало,
Не робіть це занадто великий Тому очевидно
якщо занадто мало, ви просто збирається почати усічення даних
і ви будете втрачати інформацію.
І якщо він занадто великий, ти просто роду говорить базу даних
очікувати і оптимізації для отримання додаткової інформації
ніж це може насправді коли-небудь.
Так в чому ж розумний почуття число для імені курсі?
60? Отже, 60.
Це здається досить розумним
як довго це немає ніяких виключення, що.
Там насправді немає важко, швидкий правило.
Якщо чесно, для історичні причини багато
з людей виберуть 255 Тому протягом багатьох років, який був свого роду
максимуму за замовчуванням з використанням 8 байт - 8 біт, як ваш лічильник.
Я б більше [нерозбірливо] може використовувати ступеня числа 2,
але це свого роду не має значення.
Так що ми можемо піти з 60 років.
Це здається розумним, поки
як ми в кінцевому рахунку не шкодую про це Тому, що є верхньою межею.
Тепер, припустимо противне були зроблені рішення,
НЕ змінні символи, але просто поле символ.
Так на відміну від C і C + +, символ не означає один символ
і бази даних, як правило, означає фіксований число
символів в рядку.
Що було б з ніг і / або недолік мого вибору 60
для поля CHAR, замість VARCHAR?
Це саме те, перший вид рішення ви будете мати, щоб зробити
при перевірці [фонетичні] з проекту зі своїми партнерами.
Так, Шарон знову.
[Нерозбірливість Зауваження]
Добре. Так що, якщо звуть менше
ніж 60, то ви даремно що б це не дельта
від 60 до фактична довжина.
Так що просто відчуває себе марнотратно, більше байт, ніж потрібно.
Але чому воно існує?
Напевно є деякі вгору.
Так?
[Нерозбірливість Зауваження]
Звичайно. Так що іноді ви могли б знати фіксоване число
символів, як 10 цифр для телефонного номера, наприклад.
Але кого це хвилює, як і чому Не просто сказати 11 в будь-якому випадку
або чому б не сказати 60 в будь-якому випадку з VARCHAR?
Отож, що має ми отримуємо знаючи і проектування
на фіксовану кількість символів?
[Нерозбірливість Зауваження]
Ви знаходитесь на правильному шляху.
Так що це оптимізація, але це дійсно з - так?
[Нерозбірливість Зауваження]
ОК. Добре. Давайте зосередимося на цій останній частині.
Так індексації.
Ось і виходить, якщо ви знати заздалегідь, що всі
з ваших полів збираються бути 60 символів,
ви дійсно можете думати про це стовпець в базі даних Excel
як мають дуже прямо, лівому краю
і правий обгрунтовані краю
тому що кожен стовпець 60 символів в ширину.
Це означає, що цей рядок 60 символів їзди
з цього рядка, 60 персонажі далеко від цієї
і цей і цей.
Так що просто хотів повернутися, коли ви дізнався C, потрібно було довільний доступ
у світі масивів, Та ж ідея тут.
Якщо ваші колонки представлена використовуючи тільки фіксовані символів довжиною,
Ви можете ефективно індекс випадково до 60 або 120 або 180
і ви можете отримати в індивідуальному порядку Рядки набагато швидше.
Тоді, якщо замість цього, ваша колонка була прямий лівий край так сказати
але дуже міцний право краю в колону
тому що ви можете є 10 символів,
15 символів, 5 символів.
Так що це теж компроміс.
А іноді тільки шляхом проб і помилок
та експерименти Чи можете ви зрозуміти
, Що дійсно правильним кроком це але ці види
питань, які повинні йти
через ваші уми і / або столи, коли приходить час
проектувати бази даних.
Таким чином, не обов'язково прямо відповісти, але ви повинні
принаймні, деякі одне або два речення на увазі
для резервного копіювання все, що Ваше рішення.
Добре.
Так що давайте тримати прокрутки в підказок тут
які є UI PHPMyAdmin автора.
Так, значення за замовчуванням для ім'я, я повинен вказати
що вона повинна бути у значення за замовчуванням нуль?
Що ви думаєте?
Чи може курс мати нульовий ім'я?
Просто відчуває себе дивно, чи не так?
Я не можу думати ні про неназвані курси в Гарварді.
А може бути, є якась темному кутку випадок
де курс присвоюється номер
і професор не має вибрали ім'я для нього, але -
Я маю на увазі, до біса з цим,
як давайте навіть не турбувати підтримки, що.
Я б сказав, в інтересах з хорошої чистої бази даних,
давайте уточнимо, що ви не можете мати значення за замовчуванням NULL.
З іншого боку, ми могли б зробити щось на зразок безіменного звичайно
який не в відміну від Mac OS і Windows, зробити
при створенні папку, наприклад,
але, що робить трохи більше сенсу
так що людський побачити щось.
Ми говоримо про серверної бази даних, імовірно
для каталогу курсу.
Так що я дійсно не навіть подобається ідея віддати його
в іменах безіменних курсу
так що насправді не допоможе нікому.
Так давайте залишимо це, як ніхто, Це означає, що коли ви вставляєте
в цю базу даних, у вас є дати кожен курс ім'я
який відчуває себе трохи Очищувач для мене.
Добре.
Так прокрутки далі, сортування.
Це просто потрібно зробити з набори символів і ще багато чого
якщо ви ще не бачили згадки про шведському
в PhpMyAdmin це Тому народ
хто написав PHPMyAdmin були шведська.
Це PHP або це MySQL?
Один з двох, я забув навскидку.
Але це з історичних причин
але ви можете висловити кожен характер англійською мовою
що ви могли б з шведському так що це в значній мірі не представляє собою проблему.
CS50 Appliance хоча використовується - налаштований на використання UTF-8,
так що в цілому повинно не спливав для вас.
Атрибути.
І ніхто з них не є дійсно актуальні тут.
Я бачу Binary, знака, Без підпису ZEROFILL,
і на оновлення поточний час.
Це поле застосовується тільки протягом деякого числового поля
або деякі поля часу.
Таким чином ми будемо пропускати що повністю.
Null. Може це поле бути порожнім?
Так немає. У нас вже є такого роду розмов.
Таким чином, ми не хочемо, значення за замовчуванням.
Ми не хочемо, щоб це було нульовим.
А як щодо індексу?
Там в чотири варіанти тут.
Що це означає, якщо ми вказуємо
що цей рядок буде щоб бути первинним ключем?
Згадуючи CS50 або CS165, якщо ви взяли його.
[Нерозбірливість Зауваження]
Саме так. Так первинний ключ за визначенням є полем
, Який однозначно ідентифікує кожен рядок в цій таблиці.
І ви можете розраховувати на те, щоб зробити що унікальний ідентифікаційний.
Так, що це означає потім, щоб просто бути унікальним?
Ну, ніби цих двох є свого роду
з під наслідків під капотом.
Але в цілому, первинний ключ роду договору ви робите
з річчю бази даних.
Коли я роблю запити Шукаю звичайно,
Я збираюся використовувати це Зокрема поле.
І ми повернемося до Тому ми, можливо, доведеться два
такий вибір тут, первинного або унікального.
Унікальна просто говорить, це поле буде унікальним
але я насправді не робить будь-яка вид словесного прихильності тут
використовувати це поле зробити мої пошуки
з причин, ми см. в мить.
Якщо вказати замість індексу, що це означає вказати
що поле має індекс на ньому?
Так?
[Нерозбірливість Зауваження]
Саме так. Це було оптимізований для запиту.
Таким чином, ви - сервер бази даних, Oracle, MySQL, що завгодно,
, Як правило, працювати своє чарівництво за лаштунками, як тільки ви натисніть
цей варіант, а потім натисніть Зберегти і він буде будувати
до зазвичай деревоподібна структура, B-дерева, якщо ви бачили
або чули від якого є дуже короткого дивлячись дерево
що дає дуже хороший логарифмічні властивості
при пошуку за даними.
Якщо ви не вкажете індекс на поле, що відбувається
бути біг Час пошуку
для довільного [Фонетичні] назва курсу?
Що це?
[Нерозбірливість Зауваження]
О, [нерозбірливо], лінійна, чи не так?
Якщо немає ніяких оптимізацій надається в базі даних
і ви не думали база даних, які
даних очікувати.
Найкраще, що ви можете зробити, це перевірка все, коли ви шукаєте
при деякому значенні, особливо якщо є міг
насправді бути дублікатами.
Повнотекстовий тим часом, ми будемо махаємо руками на даний момент.
Але в цілому, це тип індексу, який дозволяє вам
оптимізувати для пошукового запиту пошук на полі.
Так що це може бути хорошим кандидатом
для як описі курсу де у вас може бути декілька
пунктів і ви, можливо, хочу зробити подстрок.
Повнотекстовий зазвичай нехай Ви робите це досить ефективно.
А.І., це жахливо роду пояснення, але якщо ми наведемо
над ним ви побачите Автоматичне прирощення.
Не застосовується і тут, але автоматичне прирощення корисно
для як поле целочисленное, тому що база даних буде піклуватися
процесу плюс plusing кожен раз, коли ви робити вставки.
Так що навіть якщо дві людини буквально натисніть кнопку Відправити
в той же час і спробувати для створення рядка якось
в базі даних, один з їх отримає номер I,
другий отримаєте число я плюс 1.
Ви не повинні турбуватися
близько двох чисел, які є призначений однаково, якщо ви були
зробити це самостійно в коді.
Добре.
Так що я ніби як, де у нас є ім'я, щоб бути.
Так що давайте натисніть кнопку Зберегти.
Це хороший дизайн для таблиці бази даних?
І, як у бік, якщо іржавий на SQL або ви як би
просто завжди закривати очі на те, що відбувається,
Я міг би надрукувати саме це -
ці три лінії на що чорно-білий швидке
в командному рядку клієнт або я міг би зробити
що в коді програмно.
Так що все PHPMyAdmin робить для мене, просто рятуючи мене зусилля
запам'ятовування іноді Синтаксис і ввівши для
як утомливих команд.
Добре.
Так що це не відчуває, як кращий дизайн, один стіл поле.
Тепер ми могли б мати речі, як професорів
і місця і опису.
Але навіть тоді, використовуючи тільки ім'я
визначити курси не відчуває себе ідеально.
Що, як правило, ми зробили в минулому
якщо ви використовували бази даних щоб однозначно рядків?
Не використовуючи VARCHARS зазвичай.
Так?
[Нерозбірливість Зауваження]
Так. Так зазвичай курс ID.
Так, найбільш поширеними підходити тут особливо
При використанні бази насправді просто
використовувати ряд як ціле число.
Отже, дозвольте мені йти вперед і робити це.
І ми можемо зробити це в кілька способи, але повідомлення, якщо я збільшити
в на дні тут.
Я збираюся сказати, додайте один стовпці в кінці таблиці,
як правило, тільки для візуального зручність ви поклали ідентифікатори
на початку таблиці хоча це не має реального
функціональне вплив.
Так що я збираюся сказати, додати один стовпці
на початку таблиці.
Я збираюся натисніть Перейти, що дає мені назад цей інтерфейс тут.
Давайте назвемо цей ідентифікатор.
Якщо ми думаємо, що матимемо не більше робиться 4000000 курси
поле целочисленное є добре.
Ми могли б навіть зменшити його
але простір дешево так хто дійсно піклується.
Але, ми намагаємося написати Facebook зараз,
може бути не так вже погано передбачити великі цілими
яка дасть нам 64-розрядних цілих числа
але тоді ви буквально подвоєння кількості бітів
що ви використовуєте, настільки незначні компроміс
але щось розглянути.
Тепер, це збиває з пантелику Спадщина річ.
Ви можете згадати від використання MySQL
що в будь-який час ви розкажете Int полі ви часто будете бачити ряд
поруч з ним, як числа 10.
Це не має нічого спільного з Розмір з числа
або число бітів.
Це пов'язано з числом символів, які використовуються
візуально дисплей що внутр поле
при використанні вікно терміналу.
Таким чином, ми бачимо, що в один момент.
Так, не вводити в оману , Набравши цифри
там хоча це ефективно питаючи нас
для одного тут.
Сюди, я збираюся йти вперед і сказати, без знака.
Там немає підстав відходів всі наші негативних чисел
оскільки база даних , Як правило, відбувається
припустити позитивний значення або нуль.
ID виразно не повинно бути порожнім.
А що ви думаєте про індекс для цього поля ідентифікатора?
Давайте зробимо це первинно.
Так, що, якщо, тим не менш, як я можу тільки думати про одне CS164 звичайно
в Гарварді і тільки один CS50 Звичайно в Гарварді
і це досить мірі вірно в цілому
що є, може бути, виключення [Нерозбірливості] обидва семестри
або щось дивне в цьому роді.
Але що більш важливо, чому це краще
використовувати цифрову інтегральну ідентифікатор однозначно ідентифікувати курси, а
ніж просто унікальна рядок?
Так?
[Нерозбірливість Зауваження]
Добре, цікаво.
Так що, якщо у нас був свого роду крос-перерахованих курсів.
Так що це хороший приклад.
Я не впевнений, я б вирішити, що, хоча
, Даючи їм те ж саме Ідентифікатор якщо це
куди ви йшли з цим.
Ні? ОК. Але, безумовно, кут випадок розглянути.
Якщо є свого роду - нам потрібна якась
альясінга потенційно.
[Нерозбірливість Зауваження]
Звичайно.
[Нерозбірливість Зауваження]
Ось хороший приклад.
Назва може змінюватися з плином Час, повністю розумно.
Що ще?
[Нерозбірливість Зауваження]
На жаль, ще раз кажу.
[Нерозбірливість Зауваження]
Так, саме так.
Так насправді, це реальний аргумент є
що використання 32-розрядної Int є ймовірно, буде швидше
ніж небудь змінної Довжина символ поле.
У першому випадку, банку буквально вписатися до реєстру,
не кажучи вже про набагато менше обсяг пам'яті.
В останньому випадку, ви будете мати, щоб зробити курорт [фонетичні]
в порівнянні рядків, які самі по собі з лінійною
в розмірі рядок потенційно.
Таким чином, це просто хороший оптимізація,
і, зокрема, що це збирається
щоб повідомити робити те, що називають Граючи більш ефективно
через хвилину.
Так давайте зробимо це.
Ми будемо вказати, що це первинна
тому що я не особливо хочуть піклуватися або думати
про те, що число є курсу.
Нехай вони беруть на всі цінності, які вони хочуть.
Я збираюся сказати автоінкремента так що я можу аутсорсинг, що деталь.
Як і в сторону, ви могли б знаю, що Гарвард
принаймні, має унікальний номери для гольфу.
Я не пам'ятаю Що це курси є.
Я знаю, що CS50'S номер за каталогом є 4949,
абсолютно довільно.
Але є дивно кутові випадки в тому, що навіть
в registrarial звалищі звичайно даних каталогу,
іноді курси, старі курси мають ряд як 4.
Але технічно, що є полем символ
що просто починається з 0004.
Так і тут, ви повинні бути обережні розрізнення
між речами, як Звичайно номер за каталогом
які, можливо, деякі людські Поняття фіксованої довжини, 0004,
і ви не повинні зберігати що, наприклад, в якості цілих чисел.
Такого роду поля повинні зберігати в іншому місці.
Таким чином, в Гарварді, якщо б ми були насправді робить курс
торговий інструмент, це ймовірно, не достатньо
для нумерації курсів тільки з 1, 2, 3, 4.
Ми, ймовірно, будемо мати
мати інше поле називається номер за каталогом,
, Який також передбачається бути унікальним основі
на людину конвенцій тут але це не найкращий вибір
для унікального ідентифікатора, тому що це може бути змінної довжини.
Це може бути не чотири символи, це може бути п'ять.
Насправді, я думаю, що деякі з них років тому вони рухаються
до справи п'яти персонажів там були більш 999 курсів
повністю або щось в цьому роді що або 9999 курси.
Таким чином, це може бути прикладом де поле не є первинним
але він повинен бути унікальним.
І адреса електронної пошти ще один.
Можливо, ви захочете, щоб це було унікальне
але не обов'язково ваш первинний ключ.
Добре.
Отже, дозвольте мені строчити другий Таблиця набагато швидше, ніж цей.
Так що я буду називати це один Інструктори і я збираюся
дати цьому в загальній число стовпців двох.
Я збираюся дізнатися мій урок з минулого разу.
Я збираюсь подзвонити перший стовпець ID.
Я збираюсь подзвонити Другий стовпець Ім'я.
Я також збираюся робити Varchar.
Я буду вважати, немає професор має ім'я більше
ніж 60 символів, хоча Тепер це може бути натиснувши на неї
при цьому деякі довгі імена, спеціальні люди з по батькові.
Це добре для сьогоднішнього дня.
Так що давайте прокрутки тут.
Давайте зробимо це без знака знову.
Давайте зробимо цей первинний.
І ми дозволимо повторювані імена
у разі, якщо два Джон Сміт або щось на зразок цього.
І тепер у нас є дві таблиці.
Так що тепер, це напрошується питання як я можу пов'язати
в інструктора з курсом?
Я відчуваю, що я ніби отримав попереду себе
тому що, якщо інструктор викладає курс,
мій перший інстинкт буде насправді в тому, щоб повернутися
щоб курси розуміють, це не було хорошою ідеєю.
Дозвольте мені насправді додати один стовпець в кінці таблиці,
натисніть кнопку Перейти, і я буду називають цей інструктор.
І я зроблю це VARCHAR і я зроблю це 60.
А може бути, я залишу його нульовим зараз
у разі, якщо курс має не був без знака в інструктора
які іноді відбувається до Термін починається і натисніть Зберегти.
Який з цих конструкцій Ви віддаєте перевагу?
Спочатку один, де у нас є Таблиця окремий інструктора
або другий, де ми просто додати поле в ході?
Так що це тісно пов'язати Інструктор з курсу.
[Нерозбірливість Зауваження]
ОК. Добре. Але дозвольте мені відсунути.
Це просто так просто, як я можу просто введіть ім'я людини
в цій таблиці, як, безумовно, що має певну цінність або -?
[Нерозбірливість Зауваження]
Добре.
Ну, дозвольте мені бути важко тут.
Отже, дозвольте мені сказати, що цей курс CS51
і я знаю, що це вчив в цьому році двоє людей.
Так, Генрі Лейтнер і Джессі Тов але -
так що я просто поставити кому між ними, в порядку.
Я дуже добре CSV від минулих років.
[Нерозбірливість Зауваження]
Точно, точно.
Як тільки ви вдаєтеся щось на зразок цього,
які могли б почувати себе розумні, і ви могли б почувати себе
як це начебто розумний.
Я свого роду запозичення один ідея, яка працює добре,
запозичувати нові ідеї та роду об'єднати їх.
Ти начебто повністю перемогти точка з використанням бази даних
у справу першу чергу ' якщо одне із значень
використання це швидше результати за різних індексів
і таблиць, які можуть бути побудована для вас
самим ядром бази даних.
Тепер, якщо ви хочете знайти для всіх курсів
що Джессі вчить, тепер у вас є щоб у знайденого на всіх
полів інструктора,
який фактично означає лінійну пошук знову, тому що ти є
щоб знайти цей довільний набір з трьох персонажів у будь-якому місці
в області інструктором передує
в можливо з подальшим коми.
Так що це, безумовно, не обіцяє нічого хорошого.
Отже, дозвольте мені повернутися до столу.
Дозвольте мені йти вперед, щоб курси, скасувати це.
Я збираюся просто піти вперед і падіння це поле.
І якщо ви хочете, щоб зробити це вручну,
синтаксис ALTER TABLE курси DROP інструктора.
Так що давайте йти вперед і сказав, та до того.
І повернутися до цієї більш ранньої ідеї
де у мене є окремий стіл для викладачів.
Але тепер ця відчуває себе трохи як я можу поставити курс
в таблиці ході автора та інструктор
в таблиці інструктора, але я якось треба зв'язати два.
І як би ви пропонуємо ми це робимо?
[Нерозбірливість Зауваження]
Добре. Так давайте зробимо це.
І ви могли б назвати це Таблиця в теорії нічого.
Я збираюся навмисно називайте це як багато
рамок буде називати його, в тому числі,
Laravel як ви побачите в небагато.
Я буду називати його курс підкреслюють інструктора.
Використання єдиному в цьому місце для кожного зі слів
і в нижньому регістрі знову, а також з -
потім в алфавітному порядку упорядковано зліва направо.
Це абсолютно довільно, але він має тенденцію бути угода
у великій кількості цих структур в PHP на інших мовах.
Скільки колонки мені потрібно в Це те, що ми називаємо приєднатися стіл,
приєднатися два інших столи разом?
Три колони?
Який з них - що б вони були?
[Нерозбірливість Зауваження]
ОК. Добре. Це працює.
І ми могли б технічно скоротити кут тут, але багато
рамок, зокрема все ще дав би навіть ці рядки
унікальні ідентифікатори, навіть якщо семантично рядок
що ми дійсно дбаємо про або стовпці, що ми дійсно піклуються
про які останні два з що ви сказали, курс ID
та інструктор ID.
Так давайте зробимо це.
Я подзвоню цей рядок просто ID, так само, як ми робили раніше.
Але цей я збираюся подзвонити курсу ID.
Це один я збираюся подзвонити інструктора ID.
І я збираюся вказати, що всі
з них без знака Тому що я хочу
щоб досягти максимальної 4 млрд. внутр діапазон.
Ніхто з них не повинен бути порожнім.
Я збираюся вказати, що ID все одно повинні бути первинними.
І знову ж, це просто угода,
багато рамок навіть якщо ви не сортувати
принципово потрібно унікальний ідентифікатор для рядка,
виявляється, це зручно для код, SQL, що відбувається
бути автоматично генерується для нас.
Так що я залишу це первинний.
Але тепер, я як би є проектне рішення,
Звичайно ID та інструктор ID.
Що індекси, якщо будь-який вони повинні отримати?
Якби я не залишу жодного індекси, в чому сенс?
Що мається на увазі?
Продуктивність, як і раніше, чи не так?
Якщо ні індекс, тим Найкраще, що ви можете зробити, це свого роду
з [нерозбірливо] через Все це шукаєте чисел.
Так що не відчуває себе розумним.
Чи повинна вона бути первинним?
Так чому б і ні?
Чому б не основна?
[Нерозбірливість Зауваження]
Прекрасно. Так ми котимося з [фонетичні] первинного.
Ми вже вибрали, що.
Так, вона повинна бути унікальним?
[Нерозбірливість Зауваження]
Добре. Так що, якщо ви припускаєте, один інструктор на курс,
абсолютно нормально.
І це, безумовно, загальний випадок
але ми вже відклали один можливо, знайомий приклад.
CS51 отримав два інструкторів так ми начебто
На сьогоднішній день угвинчується в цьому випадку.
Якщо б ми зробили тільки дозволить один інструктор,
ми могли насправді спосіб з повністю приєднатися стіл,
повернутися до раніше підходу
і поставити не ім'я людини можливо, але інструктора ID.
Якщо ви знаєте, кожен курс, як тільки один інструктор ви можете мати тільки
один стовпець.
Але мінливість що втягнув нас у біді.
Добре.
Так, вона повинна бути унікальним?
Кількість Повний текст не відчуваю застосовно.
Як ми перше казали, що це
для як підрядка відповідності для опису.
Так що про індекс?
Ну, індекс, ймовірно, наш кращий кандидат
який говорить MySQL оптимізувати при пошуку за цими
або дайте мені розробити, оптимізації для пошуку або приєднується
як ми побачимо через хвилину
так, щоб вони трохи більш ефективним
ніж все чисто лінійної.
Я хочу авто Є збільшує це поле?
Так ні, тому що правда батьківський елемент існує
в таблиці курсів.
Ось де це збирається отримати плюс,
плюс, коли це насправді вставляється.
Ось, це все відбувається бути вставлений вручну
нами імовірно в коді.
Так що давайте просто вказати що обидва Звичайно ID
та інструктор ID мають індекси.
Тепер ми будемо йти вперед і зберегти.
А тепер, просто щоб показати, Ви відповідність
між тим, що хороший GUI інтерфейс
і інтерфейс командного рядка.
Дозвольте мені йти вперед і робити наступне в цьому рядку MySQL.
Я збираюся сказати, використання courses50
який є довільне ім'я Я дав до цієї бази даних.
І тепер, я навіть не пам'ятайте, що ми зробили.
Отже, дозвольте мені Показувати столи
і взагалі з комою буде вашим другом тут
завершити запит.
І там це.
Так ось рядки чи, радше, столи, які ми маємо тут.
Тепер, я забув, що Звичайно виглядає,
так зроблю, описують і тепер я бачу роду в ASCII
або версія того, що PHPMyAdmin робив
і я бачу, що ідентифікатор внутр.
Існує, що 10.
Що це означає?
Це просто означає, що, коли це відображається він збирається прийняти
до 10 символів на вікно терміналу.
Це обнуляти?
Ні, це первинний ключ.
Чи можна мати значення за замовчуванням?
Кількість І додатковий, який є спеціальним прапори, як автоматичне прирощення.
Так що давайте просто зробити пару з швидких вставки тут.
Я збираюся піти вгору до - давайте просто скажемо,.
Давайте змінимо стан до слайда
де я начебто попередньо підготувати це.
Це резюме потім всі три з цих таблиць.
Я вже просто вручну набрали першу команду.
І тут, я пішов вперед і введіть іншим для вас.
Це тільки стилістична річ.
Як правило, багато людей введіть заяви SQL заголовними буквами
а потім імена таблиць і імена полів у нижньому регістрі,
хоча б тому, вид стендів
, Що ваш термінологія а що синтаксис бази даних.
Так от у нас є три столи, курси, викладачі,
і курси інструкторів.
На слайді я зробив заздалегідь, У мене не було на полі ID
але це не насправді погано на всіх.
Ми хотіли просто подивитися Третя колонка є.
Якби я зробив, що тут?
Так що тепер дозвольте мені припустити, що ми робимо купу вставок.
Отже, ось деякі дані, Я збільшення масштабу
Так що я збираюся запропонувати що в курсах,
Ми маємо справу тільки з трьома стравами.
І я вибрав ці три Тому що вони представником
з деяких хороших - у них є деякі хороші властивості.
CS1, CS50, CS51, вони є зростаючі ідентифікатори
але те, що ID це те, що не мають ніякого значення.
Ось тільки порядок, в якому вони були авто вставлений мною.
Як щодо інструкторів?
Так що тепер, тому що Генрі Лейтнер вчить як CS1 і CS51,
це ніби як не можна до речі наслідки для нашого проекту.
І Джессі вчить CS51 і Малан вчить CS50.
Так що тепер - або, скоріше, це всього унікальні ідентифікатори тих людей.
І курси і викладачів, - курс інструкторів, помітити тут.
Курс ID1, які був CS1 викладається
інструктором ID1 хто Генрі.
Курс ID2, який я думаю було CS50 викладається
інструктором ID2, що Малан.
А потім, нарешті, CS51, і Зауважте, що ми маємо два ряди.
І тепер саме тому приєднатися таблиця є потужним викладається
обома Генрі і Джессі.
Так що це все прекрасно і чудово,
але я можу ледве пам'ятаю з верхньої
з моєї голови, хто є хто тут.
Як ви, можливо, мати справу з цим в коді,
без необхідності жорсткі код речі?
Ну, це де сам SQL починає ставати нашим другом.
І я збираюся запропонувати, щоб ми можемо ввести наступне.
Я зроблю це в в фактичне запрошення.
Дозвольте мені йти вперед і вставити ці речі.
Так, в таблицю курсів давайте робити те, що у нас було
Хвилину тому.
Я збираюся вперед і сказати, давайте вставити CS1 і CS50.
Давайте вставити ще кілька рядків відразу, CS51.
Тепер, дозвольте мені йти вперед і зберегти.
Гаразд, так що я просто відтворення так швидко,
як я можу відносини ми тільки що бачили на екрані.
І так тут ми маємо Лейтнер, тут ми маємо Malan.
Давайте дамо себе другий ряд, і Тов.
Тепер дозвольте мені зберегти це.
І я роблю їх свідомо в тому ж порядку.
Ні, я забув дати це автоматичне прирощення.
Дозвольте мені швидко це виправити.
Я виправити це в онлайн код.
Це не вдалося, як в сторону.
Той факт, що я не міг вставити Лейтнер і Malan
і Тов не вдалося, тому що я не зробив вказати ідентифікаційний номер, хоча
це чекає один, і я забув перевірити автоінкремента,
що означає, що вони були всі за замовчуванням стає рівним нулю.
Але що тоді суперечить які властивість, яке ми вказали.
Первинний ключ був порушений так що навіть не дозвольте мені зробити це.
Отже, дозвольте мені виправити це.
Тепер, дозвольте мені повернутися до На вкладці Вставлення тут і вкажіть
що я хочу Лейтнер, Malan і, що більше одного рядка, Тов.
І тепер, нарешті, тільки той, який трохи важко
пам'ятати, звичайно інструктор.
Давайте вставити тепер, Звичайно ID1 є інструктором ID1
так от CS1 і Генрі.
Курс ІД2 є інструктором ID2 який CS50 і Малан.
А потім в останню чергу ми маємо турбуватися про те, звичайно ID3
який є CS51, викладається
на курс інструктора 1, що Генрі.
І три, як учив на 3, який є Тов.
Так що, сподіваюся зараз ми відтворили цей -
чорт візьми, я зробив те ж саме.
Інструктор курсу потребує автоінкремента.
Добре.
Я зроблю це швидше на цей раз, маршрут № 1, маршрут № 1, 2, 2.
І тепер, нарешті, ми робимо CS51 який має курс ID3 і Генрі.
І звичайно ID3 і Джессі.
Це виглядає добре.
ОК. Так що тепер, давайте повернемося у вікні терміналу.
Так що, якщо я описую курси ми побачимо це.
Якщо я хочу бачити курси, що можу Тепер зробити вибір зірку з курсів,
Крапка з комою, а тепер ми бачимо ці цінності.
А тепер, що ще я хочу зробити?
Виберіть зірку з інструкторів, ось як я очікував,
і виберіть зірку з курсів - Звичайно підкреслення інструктор.
Так як же я тепер приєднатися ці таблиці?
Так краса вибравши значення ID в цьому випадку є
що якщо ви думаєте про приймаючи таблицю курсів
та інструктор стіл і потім вставити
між цими двома у вашому уми інструктор Звичайно
Таблиця ви можете роду лінія до всіх цих стовпців ID
так що ви об'єднаєте їх в однієї масивної колона, яка має всі
інформації ми дбаємо про.
Синтаксис SQL для цього не обов'язково очевидно,
але давайте подивимося, якщо ми можемо зробити це.
Так виберіть зірка з курсів,
і є кілька способів як ми можемо зробити це.
Я збираюся натисніть Введення просто вид формату речей красиво,
але, що стрілка знаходиться всього в симптом стороні клієнта інструменту,
це не має ніякого відношення робити з самого SQL.
Так виберіть зірка з курсів.
Я збираюся зараз приєднатися таблиця курси
на столі, звичайно інструктора.
Як? На полі під назвою courses.id зрівнявшись Звичайно
підкреслюють інструктора точка як називається
з відповідного поля ось що я хочу пару.
Це не ID.
It's - що, вибачте?
>> ID курсу.
Добре, давайте я зменшення.
Але я хочу, щоб взяти це ще один крок вперед.
Я тепер зробив це таблиця і цей.
Тепер я хочу, щоб витягнути цей хлопець в а.
Так, дозвольте мені далі приєднатися все це справа
на інструктора стіл на що?
Курс підкреслення instructor.instructor ID
зрівнявшись instructors.id.
Таким чином, ми могли б написати цей запит в декількох напрямках.
Порядок, в якому я зробив це не все, що важливо.
Я тільки частково зробив це в мій розум зліва направо.
Ми могли б зробити це в кілька різних способів
але якщо у мене тепер є Крапка з комою і натисніть Enter,
Зауважте, що я повернуся новий тимчасова таблиця, результуючий набір
так сказати в говорять бази даних.
І що у мене є в цій речі?
У мене є на ID, ім'я, другий ID, який начебто заплутаною
мені на даний момент, Звичайно ID,
інструктором ID, ID, і ім'я.
Так, в кінці дня у нас є потрібні дані зараз.
Я бачу, що CS1 викладається по Leitner, CS51 викладається
по Leitner і Това, і CS50 викладають Маланов.
Але я трохи стурбований ця двозначність я створив.
Що неоднозначність Я натякаючи на?
Так?
[Нерозбірливість Зауваження]
Там в три колонки ID.
Так що ми можемо насправді це виправити і ми збираємося насправді відбувається
відкласти до нашої рамках в кінцевому рахунку, щоб допомогти нам в цьому,
але виявляється, що є ключове слово в SQL називається S,
де ви можете задати псевдонім, нове ім'я для поля
так що ми можемо уникнути цього Неоднозначність в цілому.
Але зрозумів, що якщо ми не будемо її вирішення так чи інакше, як з
що ключове слово або рамки,
є потенційно це двозначність, якщо ви спробуєте
для доступу до поля ID тому що ясно є ті,
з однаковими іменами там.
Так що це приєднатися і я думаю, у вашій уяві кращий спосіб
думати про це дійсно це взяти дві таблиці,
вибудувати їх у так, що ви хочете.
І це так званий внутрішнє з'єднання в тому сенсі,
що ми поєднуючи столи тут.
Є й інші види приєднується, що ми могли б зіткнутися
з плином часу, як зовнішні з'єднання,
але здебільшого цієї Ймовірно, найбільш поширеним
для відновлення даних.
Те, що ми зробили зараз як правило, те, що називається
нормалізації даних, так що немає дублювання в будь-якому місці
в таблицях.
І дублюванням, я б призвели до того, що перший підхід.
Якщо ми згадали Лейтнер і Тов в декількох місцях
в базі даних, це не як правило, краще рішення
особливо якщо їх ім'я може змінити понаднормово або в разі
шлюбу, дівоче прізвище мощі змінити себе ви просто хочете один
канонічне місце для деяких значення даних як ім'я.
Добре.
Таким чином, щоб резюмувати, ми мали кілька дизайнерських рішень, щоб зробити
і найбільш важливі з них ймовірно, зводиться до деяких
з цих варіантів індексів.
Але дозвольте мені відзначити, одна річ, а також.
Якщо я повертаюся в PhpMyAdmin,
одна особливість ви не могли б зіткнулися перед є
наступне.
Якщо я йду в курс інструктора, Я вже зробив вказати, що деякі
ось про що індекси.
Але дозвольте мені перейти до структури Вкладка звичайно інструктора.
Дозвольте мені тепер натисніть на індексів і зверніть увагу на наступне.
Я вказав тут є первинний ключ
в стовпці під назвою ID.
Це трохи складніше спосіб завдання потужність
і так далі, як з посиланням на розмір області в байтах.
Але тепер у мене є ще один поле, звичайно ID, який є -
Звичайно ID, який робиться заздалегідь і унікальним, ОК.
Я зробив це один в просування для нас.
Отже, чому ж це - дайте мені впасти це заради обговорення.
Ой, ви знаєте, що я зробив?
ОК. Так, раніше, одним з Небезпеки використовуючи інструмент з графічним інтерфейсом
як це, коли ми були Створення цього з'єднання таблицю,
інструктор таблиці Звичайно, Нагадаємо, що я вказав
що я хочу індекс на цьому полі
та індекс на цей іншої області.
Побічний ефект перевірки обох цих коробках
на тому ж екрані в тому, що PHPMYADMIN виведені з цього,
що я хочу не два окремі індекси,
що я хочу з'єднаний індекс, який , Як правило, тільки корисно
або найбільш корисно, коли ви пошук в не одне поле
але обидва цих полів.
І саме тому ми повинні були їх з'єднати є
так що я кинув її, тому що не те, що я мав намір.
Швидше, я збираюся переробляти це тут.
Я збираюся піти в курсовій ID
і під більш я просто хочу сказати, додати індекс.
І я збираюся піти під Інструктор ID і сказати додати індекс.
І тепер, якщо ми натисніть тут, Зауважте, що ми маємо три індекси,
один первинний і, як я призначені одному для кожного
з тих зовнішніх ключів.
І я називаю це зовнішня, тому що Звичайно ID в цій таблиці карт
в якій області, аби бути очистити, в іншій таблиці.
Первинний ключ називається ID, у таблиці називається курси,
і те ж саме пропозицію на інший.
Але тепер, є цікавим обдурити і дійсно техніка.
Я просто пішов вперед, і нехай мені зробити це трохи повільніше.
У тому ж екрані, повідомлення він говорить вид зв'язок тут.
Я натискаю це і тепер зауважте, що я отримати, щоб зробити кілька обмежень.
Так, один з верху також
не тільки за допомогою концептуально зовнішні ключі та інші столи
як ми тільки що на це що шляхом визначення індексу
на них ви можете мати допомога база даних ще більше
забезпечення цілісності з цієї області.
Зокрема, я можу зараз вказати за допомогою цього падіння
вниз, що поле Звичайно ID
в цій таблиці насправді карти на courses.id.
Аналогічно, інструктором підкреслення ID відображається на instructors.id.
Тепер, чому це корисно?
Ну, зверніть увагу, праворуч сторона, що, здається зараз.
Тепер я можу навчити База даних, якщо Генрі
наприклад коли-небудь пенсію і його рядок зникає
зі столу викладача взагалі, таким чином, бути
видалений, я можу через це каскадні підхід забезпечення
що будь-які курси він вчить є більше не пов'язаний з ним.
Я можу навчити базу даних видалити рядки
в цій так званій сполучної таблиці автоматично, якщо Генрі або якщо один
з його курсів зникає.
Тепер, чому це переконливим?
Так?
[Нерозбірливість Зауваження]
Ви тільки повинні зробити це один раз і довгостроковій перспективі, чи не так?
Це дуже легко, якщо вид люди приходять і йдуть, курси приходять
і йдуть, ваша база даних може просто засмічуються курсів
не й для з викладачами, що не більше відношення до набору даних.
І ваші дані починає отримувати дуже брудний і брудний, і черствий,
і ось ми можемо сортувати
з дотримання деяких ці обмеження.
Так?
[Нерозбірливість Зауваження]
Вона знає, шляхом це.
Це екран, де ми вказавши зв'язок
між зовнішнім ключем і первинний ключ.
Так що все іменування конвенцій я посилався
раніше всього лише конвенцій.
Там немає притаманне значення.
Це екран яка має сенс тільки
після визначення індекси кожної з цих областей, як ми зробили.
І для цього у спадному вікні у нас є кілька речей, наприклад
якщо курс буде видалений ви можете фактично запобігти, що видалення
не сталося, якщо є є рядок в цій таблиці
, Просто кажучи, Обмежити.
Іншими словами Генрі не може піти у відставку
поки ми не відокремити його від CS51 і CS1.
Так що це хороша річ.
Але це може спровокувати помилки в коді
якщо ви не очікуємо, що, або ми можемо мати каскад,
каскад схожий на подобається каскадіруемие таблиці стилів
і каскадних Водоспад означає, що якщо -
якщо Генрі йде так - шляхом отримувати видалений
так буде його рядок тут видаляються.
Ніяких дій не означає нічого або нуль це свого роду корисно, якщо ви вид
від того, хочете деякий історичний рекорд Генрі вчив CS51,
але ви просто хочете це поле нульовим так, що рядки там
але це не більше пов'язаний з ним.
Так що це дуже потужний методи, які ви можете
і повинні використовувати хоча в інтерес, зокрема
з позбавляючи вас від себе.
Отже, дозвольте мені згадувати Пару останніх деталей тут,
інгредієнти, з якими що може бути корисним
як ми плануємо для проектування баз даних.
У вас також є вибір над двигуном бази даних
що ви використовуєте в коді.
Якщо ви знайомі з CS161 ви могли б -
або навіть 61, ви, можливо, як правило, бути знайомі з файловими системами.
І є речі як, NTFS і HFS +
і X2FS4 [фонетичні] і 3 і так далі.
Там в різних способів зберігання даних на столі.
Аналогічно є різні способи зберігання даних
в базі даних за замовчуванням принаймні в Appliance
з останньою версією з MySQL.
Ми використовували ядро бази даних називається, NoDB,
який підтримує кілька хороших можливостей.
Але інший поширеним є також називається MyISAM і ще один
що може бути використання пам'яті, що означає не кладіть нічого
на диску, просто продовжуйте речі в пам'яті.
Здебільшого ви, ймовірно, не помилитеся тільки починають
з NoDB, а й для будь-яких проектів що, як правило, пов'язані з високими темпами
вставки, наприклад, як багато швидкої реєстрації,
сотні речей в секунду або тисячі речей.
У будь-який час у вас є багато чого відбувається
на в базі даних то це види
вирішення більш низького рівня починають захоплюватися.
Повний текст функція для екземпляр працює тільки в MyISAM
так що має наслідки.
Але ви, напевно, пам'ятаєте це, давайте принаймні, мотивувати, чому ми піклуємося
про NoDB зокрема.
А умови гонки як правило, відноситься до чого?
Гаразд, це натяк на прикладі деяких
з вас, можливо, чули в років повз Чи 161 або 50
де у вас є сусід по кімнаті, ви обидва дійсно любите молоко,
один з вас повернеться додому спочатку відкривається холодильник немає молока,
закрити холодильник прогулянку по Вулиці в CVS і отримати
в черзі, щоб купити молока.
Тим часом, ваш сусід по кімнаті повернеться сюди.
Вона також любить молоко.
Відкрийте холодильник і не розуміє, немає молока.
Тут вона потім йде в зберігати, може бути, другий CVS.
Перенесемося на кілька хвилин пізніше ви повернетеся і тепер обидва
з ви купили молоко.
Один з них в даний час збирається зіпсувати, тому що ви не
як молоко, що багато, і це проблема, чи не так?
Тому що ви обидва перевірені стан деякої змінної
і прийняв рішення на основі на ньому навіть при тому, що держава
з цієї змінної був по суті в процесі зміни,
все бути їм повільно, протягом кількість часу, який потрібен
щоб дістатися до і з CVS.
Так що це свого роду тупий реального Світ вирішення цієї проблеми?
Залиште записку, чи не так?
Це трапилося в минулий раз.
Завжди залишити записку або Padlock річ в буквальному сенсі.
І я кажу замок, тому що якщо ви дійсно беруть або взяли CS161,
замок є одним з основних Ідея в такому світі.
Так як умови перехоплення може виникнути і в світі баз даних
і ви, можливо, пам'ятаєте, може бути, від CS50 фінансування, якщо ви взяли 50,
цей код, що ми насправді дав ви, хлопці, у специфікації
в цей час так, що ваш Операція називається так атомна.
Якщо ви хочете, в цьому випадок, купити частку акцій
і що акція має деякі зокрема символ.
Ми сказали вам використовувати код, подібний це, так як через цей
на дублікат ключа оновлення Синтаксис, який побудований
в MySQL ви ефективно робити або в вставки
або в оновлення після робити вибір, щоб побачити
якщо акція вже там.
Іншими словами, аналоговий в світ покупці акції
молока і холодильника може бути, по-перше,
перш ніж купувати частку Google ви можете вибрати
з бази даних всі акції Google, що Давид володіє
щоб побачити, якщо він володіє нуль або більше.
Як тільки ви бачите, якщо він володіє нуль або більше у вас є
щоб потім зробити наступне.
Або треба робити вставки
якщо він власником причину Zero ' немає рядка для Давида ще,
або ви повинні зробити оновлення якщо принаймні в теорії, ви хочете
мати один рядок для кожного користувача.
Проблема вибору що кількість акцій
і подальшого оновлення або вставка може бути перерваний
хтось інший в іншому комп'ютерний термінал намагається купити
або продати частину Давида акції запасів будь
для благих цілей або роду шкідливих цілей.
Це як піти в магазин коли ваш сусід по кімнаті повернеться
і перевіряє стан змінної.
Таким чином, цей синтаксис в той час який був свого роду необхідності
для CS50, уникає, що Проблема в цілому.
І це якраз робить все, що Магія блокування для вас,
але тепер з цими видами проектів для цього курсу
які, швидше за все, буде передбачають наявність більш складних наборів даних,
ви не можете досягти завжди це атомарность.
Все відбувається відразу або взагалі не
без перерви так витончено.
І так MySQL, другий ядро бази даних,
підтримки, що називається замки,
в якому ви можете сказати заблокувати цей таблиця так що тільки один задоволення
і взагалі тільки один користувач може доторкнутися до неї в будь-який момент часу
для читання або запису і то ви можете розблокувати його.
Це приклад з одного власних посилань MySQL,,
де, якщо у вас є, як банк рахунки, що ви намагаєтеся
відняти гроші з а потім внести гроші на.
Можливо, ви захочете переконатися, що обидва
з тих речей, відбудеться разом
не так, що немає ніякого математичні помилки
і без втрат один гроші, так чи інакше.
Проблема з замками хоча в базі даних є
що зазвичай означає вся таблиця блокується,
що означає, якщо у вас є сто чоловік намагаються
робити бізнес з вашим банком онлайн на ту ж суму
часу тільки один з їм може піти в той час.
Що нерозумно, особливо на серверах в даний час
що є вісім страв, 16 Звичайно, є величезна кількість
пам'яті, немає ніяких причина по частинах все
з ваших угод, якщо ті, клієнти будуть тільки
взаємодіяти зі своїми власними рядків.
Так NoDB дозволяє робити речі розумніші
і це зазвичай буде підхід ви берете в коді,
як ви використовуєте щось називають операцію.
І ви робите це зазвичай в PHP коду,
Рубі код, Python, що завгодно.
Але код SQL, що це в кінцевому рахунку, використовуватися це,
зазвичай.
Почніть угоду, то ви вказати два або більше запитів
що ви хочете виконати повністю
без перерви або немає взагалі.
Там може бути навіть деякі виберіть звітність в
або деякі видаляє або оновлення.
Але приємно те, що База даних буде досить розумний,
щоб переконатися, що це буде тільки заблокувати рядки вони насправді
участь у цій оновлень або обирає або видаляє.
Так що якщо ви отримали тисячі рядків і ви тільки торкаючись три
з них, тільки що підмножина таблиці будуть заблоковані
що означає ті інші 99 клієнти можуть торкнутися їх рядків
без сериализации і сповільнюються вас.
Між тим, це є самим хорошим аспект угод.
Вони угоди в відчуваю, як 161 у файловій системі,
вони транзакцій
а значить, ви можете згорнути їх назад, ви можете скасувати їх.
Це як команда або контролювати F баз даних.
Якщо ви виявите, участь шлях через всі
з вашої різної операції з даними, стріляти, щось іде не так.
Ви буквально виконати відрізняється рол SQL запитів назад
і всі ці тенденції - все з тверджень ви виконаних
сказавши старт угода зникають
як ніби вони ніколи не відбувалося,
яка є дивно потужна річ.
І ось види речі, звичайно, в 50 ми сортуємо
з замести під килим і Ви тільки почасти припустити
що все буде добре.
Але як тільки ви починаєте думати про реальні проекти
і реальних користувачів і цілісність бази даних,
ці види проектних рішень
, Які буде мати важливе значення.