>> Baiklah.
Jadi, tanpa basa-basi, SQL, Structured Query Language.
Jadi, Anda mungkin menggunakan ini pada setidaknya dalam CS50, mungkin di CS165,
mungkin di Anda sendiri proyek-proyek pribadi.
Dan apa SQL membiarkan Anda melakukan, dalam SQL Server lebih umum?
Ya?
[Tak terdengar Keterangan]
OK, itu sangat cara aman untuk mengatakan itu.
Ya. Jadi memungkinkan Anda untuk menyimpan data
dan yang lebih penting memungkinkan Anda untuk query untuk data.
Dan ini merupakan langkah maju
dari menggunakan sesuatu sederhana seperti CSV, benar.
Comma Separated Variabel.
Nilai yang sama.
Demikian pula membiarkan Anda menyimpan informasi satu baris
dalam sebuah file teks.
Tapi apa kelemahan dari CSV file untuk menyimpan data Anda,
meskipun Anda secara efektif mendapatkan baris dan kolom dari itu?
Ya.
>> Anda tidak 'memiliki organisasi yang sama
efisiensi [tidak terdengar].
>> Anda tidak perlu sama efisiensi organisasi.
Apa maksudmu?
>> Nah, seperti [tidak terdengar] punya seperti primer [tidak terdengar].
>> OK. Ya.
>> Ini adalah database relasional Anda dapat memiliki beberapa database
terkait satu sama lain dengan cara yang sangat spesifik.
>> OK. Baik.
>> Ini [tidak terdengar] untuk menetapkan CSV.
>> Dan biarkan aku men-tweak terminologi sedikit.
Jadi beberapa tabel dalam database, yakin,
dan yang melampaui apa dapat Anda lakukan dengan hanya satu CSV.
Tapi benar-benar pembatasan dengan CSV Saya berpendapat adalah
bahwa inefisiensi dari semua itu.
Ini sangat mudah untuk tata letak.
Tetapi jika Anda ingin melakukan query, apa waktu berjalan
dari setiap query pilih pada file CSV?
Maksudku itu besar tua [tidak terdengar], benar, karena dalam kasus terburuk,
mereka naik di bagian paling bawah.
Bahkan jika Anda telah diurutkan keseluruhan File CSV, jika Anda tidak tahu
yang dimuka, baik, Anda masih akan memiliki
untuk mencari semuanya.
Jadi, di antara hal-hal kita akan mendapatkan
dari menggunakan aktual database menggunakan bahasa
seperti SQL adalah kita dapat query dan kita bisa di muka
sebagai desainer database menentukan apa bidang
yang kemungkinan besar akan memiliki pertanyaan tentang sehingga orang
di MySQL atau Microsoft atau Oracle,
siapapun yang membuat database Anda menggunakan dapat melakukan semua
dari kerja keras mencari tahu, OK,
diberikan satu juta dari IDS ini.
Bagaimana kita dapat layout - mereka dalam memori?
Beberapa jenis pohon struktur mungkin,
sehingga ketika Anda melakukan benar-benar melaksanakan Select,
itu sesuatu yang logaritmik atau logaritmik
dari logaritma dalam waktu yang agak daripada benar-benar mengalihkan
menjadi sesuatu yang linear.
Jadi kita punya banyak kinerja seperti itu.
Dan kita juga dapat menyimpan lebih banyak Data lebih mudah 'menyebabkan SQL
Server biasanya disimpan di RAM meskipun bagian
itu akan disimpan pada disk dan Anda mungkin tahu sekarang
RAM yang umumnya lebih cepat dari disk,
jadi itu hal yang baik.
Dan kita juga dapat menangani concurrency jauh lebih baik.
Jika Anda telah mengambil 165 atau 161, Anda tahu bahwa jika dua orang mencoba
untuk melakukan hal yang sama sekaligus pada sebuah sistem,
hal-hal buruk bisa terjadi pada umumnya.
Jadi di antara fitur-fitur lain yang kami bisa jika kita merancang meja kami
dengan cara yang benar adalah dukungan dan keamanan yang lebih baik
ketika datang ke konkurensi.
Jadi, dua orang dalam dua bagian
dunia menggunakan yang sama website, jika mereka berdua mencoba
untuk membeli sesuatu pada saat yang sama waktu, agar tidak akan
untuk masuk secara bersamaan.
Entah bagaimana mereka akan serial oleh orang lain selain kita sendiri -
orang lain selain diri kita sendiri.
Database akan melakukannya untuk kita.
Jadi ketika itu bentuk yang paling sederhana,
SQL memungkinkan kita query database relasional.
Sebuah database relasional adalah salah satu yang memiliki satu
tabel atau lebih di dalamnya biasanya.
Dan jika ini adalah sedikit asing,
Anda dapat benar-benar hanya berpikir ini sebagai Excel atau angka
atau Google spreadsheet.
Itu hanya memiliki baris dan kolom dan biasanya bagian atas setiap
orang-orang baris memiliki nama untuk itu.
Jadi ini mungkin ID kolom, kolom nama,
kolom alamat dan sebagainya.
Dan kemudian Anda dapat memiliki beberapa tabel seperti jika Anda ingin
untuk mulai meletakkan berbagai jenis data.
Tapi Anda mungkin ingat setidaknya dari CS50 yang kami mencoba
untuk memberikan berbasis GUI tool [tidak terdengar]
untuk mengelola database Anda.
Itu disebut phpMyAdmin.
Jadi itu hanya kebetulan bahwa itu ditulis dalam PHP, benar-benar,
tapi itu hanya berbasis web front end ke database.
Dan melalui berbagai tab dan link, bisa Anda mulai
untuk mengkonfigurasi database untuk diri sendiri.
Tapi alat yang baik untuk mulai mendapatkan sedikit lebih nyaman
dengan juga klien baris perintah.
Jadi, jika menggunakan Appliance CS50 atau benar-benar menggunakan PC makro
yang memiliki MySQL baris perintah klien, Anda juga dapat melakukannya semacam
sekolah tua, seperti ini.
Sebagai samping proyek MySQL, setidaknya versi open source
dari sekarang disebut MariaDB untuk berbagai alasan Anda dapat membaca
di Wikipedia, tetapi itu adalah perangkat lunak yang sama,
itu sintaks yang sama dan sebagainya,
cukup banyak basis kode yang sama.
Dan ketika aku di ini meminta saya sekarang dapat berinteraksi
dengan database saya jauh lebih manual.
Jadi kasus di titik, biarkan aku pergi ke depan
dan hanya membuka jendela terminal.
Saya kebetulan menggunakan CS50 Appliance tetapi Anda dapat melakukan hal ini
pada hampir semua sistem di yang Anda punya hak
perangkat lunak yang diinstal.
Dan aku akan melakukan MySQL-u username John Harvard
pada sistem tertentu,-p untuk password yang akan saya ketik
dalam sedikit lebih aman dengan menekan Enter.
Sekarang aku diminta.
Aku akan mengetik merah dalam Appliance CS50
dan sekarang saya melihat pada dasarnya bahwa layar yang sama.
Tapi ada perintah sekarang bahwa kita dapat mulai mengetik
seperti menunjukkan database, dan itu akan menunjukkan semua
dari database yang saya miliki sudah dibuat dalam sistem,
cukup banyak daftar yang sama Anda akan melihat di phpMyAdmin.
Ada beberapa orang lain seperti informasi skema dan tes,
yang jika Anda aduk sekitar CS50 Appliance, kami menyembunyikan beberapa
tabel tingkat yang lebih rendah ini
tetapi mereka telah ada selama ini.
MySQL sebenarnya memiliki tingkat rendah sifat seperti username
dan password untuk database sendiri, bukan untuk aplikasi Anda
Anda mungkin berjalan di atasnya.
Jadi di muka, hari ini, saya menciptakan beberapa database,
salah satunya disebut courses50.
Kemungkinannya beberapa dari Anda telah menggunakan Alat belanja saja CS50,
yang merupakan antarmuka besar untuk Katalog kursus registrar.
Dan ini benar-benar bagus dataset untuk berbicara tentang 'penyebab,
satu, kami semacam semua jelas akrab dengan program
dan instruktur dan pertemuan lokasi dan semua jenis yang
hal biasa universitas,
tapi itu juga punya beberapa peluang menarik
untuk desain.
Jadi kami pikir kami akan menggunakan gagasan katalog saja
dan alat belanja sebagai contoh sepanjang hari untuk menyortir
dari bingkai beberapa desain keputusan yang harus kita buat.
Jadi mari kita mulai dari sana.
Misalkan bahwa saya benar-benar ingin untuk mewakili super sederhana
tentu saja belanja alat.
Dan dunia yang paling sederhana Saya bisa membayangkan dan satu adalah
di mana ada program dan ada instruktur.
Dan mari kita misalkan untuk kepentingan diskusi
bahwa setiap kursus memiliki setidaknya nama.
Jadi mari kita mulai sketsa ini.
Aku akan menggunakan phpMyAdmin seperti kenyamanan,
jadi kita tidak perlu mengetikkan semua pertanyaan secara manual.
Tapi di sini aku di saya Database courses50.
Jika tidak terbiasa dengan hal ini, itu akan sangat mudah setelah Anda menyelam
untuk proyek Anda sendiri jika Anda ingin menggunakannya.
Aku akan membuat tabel yang disebut Program
dan aku hanya bisa berpikir dari satu bidang
untuk saat ini, nama kursus.
Aku akan pergi ke depan dan katakanlah beri aku satu kolom.
Sekarang, seperti yang Anda ingat Anda mendapatkan sebuah antarmuka yang sedikit
seperti ini.
Dan upside lain terus terang dari phpMyAdmin adalah bahwa itu semacam
diri yang memerintahkan dan melalui dropdown, Anda bisa menyortir
dari melihat apa yang mungkin Anda keputusan desain.
Jadi aku akan memberikan setiap kursus nama.
Itulah nama kolom ini.
Dan bagaimana tentang jenis datanya?
Sebagian besar dari Anda harus tahu di setidaknya beberapa dari tipe data ini
dari pengalaman sebelumnya.
Apa yang tepat nama saja?
Sharon?
>> Varchar.
>> OK, varchar yang Variabel adalah Char.
Dan apa yang berarti lebih teknis?
[Tak terdengar Keterangan]
OK. Jadi string.
Dan aspek var itu berarti apa?
Variabel. Tapi apa artinya?
Ya?
[Tak terdengar Keterangan]
Tepat. Jadi variabel jumlah karakter
dalam merangkai beberapa maksimal.
Jadi, inilah pertama kami keputusan desain.
Kami benar-benar harus memutuskan berapa banyak byte maksimal
untuk mengalokasikan ke setiap string tersebut.
Secara umum, Anda ingin semacam tidak membuatnya terlalu kecil,
tidak membuatnya terlalu besar 'Menyebabkan jelas
jika terlalu kecil Anda hanya akan mulai memotong data yang
dan Anda akan kehilangan informasi.
Dan jika terlalu besar, Anda hanya semacam memberitahu database
yang diharapkan dan untuk mengoptimalkan untuk lebih banyak data
daripada yang mungkin sebenarnya pernah mendapatkan.
Jadi apa perasaan yang wajar nomor untuk nama kursus?
60? OK, jadi 60.
Yang tampaknya cukup masuk akal
selama ini tidak ada pengecualian untuk itu.
Ada benar-benar ada keras, aturan cepat.
Jujur, untuk alasan historis banyak
orang akan memilih 255 'Menyebabkan selama bertahun-tahun itu semacam
dari maksimum default menggunakan 8 byte - 8 bit sebagai counter.
Saya akan lebih [tidak terdengar] mungkin menggunakan kekuatan dari 2
tapi itu semacam tidak relevan.
Jadi kita bisa pergi dengan 60.
Itu tampaknya masuk akal begitu lama
karena kami akhirnya tidak menyesal 'Menyebabkan yang merupakan batas atas.
Sekarang, misalkan sebaliknya Keputusan telah dibuat,
chars tidak bervariasi tetapi hanya bidang arang.
Jadi tidak seperti C dan C + +, char tidak berarti satu arang
dan database yang umumnya berarti nomor tetap
karakter dalam string.
Apa yang akan menjadi terbalik dan / atau Kelemahan saya memilih 60
untuk bidang char, bukan varchar?
Ini adalah persis jenis pertama keputusan Anda harus membuat
ketika memeriksa [fonetik] keluar dari proyek dengan mitra Anda.
Ya, Sharon lagi.
[Tak terdengar Keterangan]
Baik. Jadi, jika nama adalah sedikit
dari 60 maka Anda membuang-buang apapun delta yang
antara 60 dan panjang sebenarnya.
Sehingga hanya terasa boros, lebih byte dari yang Anda butuhkan.
Tapi mengapa tidak ada?
Tentunya ada beberapa terbalik.
Ya?
[Tak terdengar Keterangan]
Tentu. Jadi kadang-kadang Anda mungkin tahu nomor terprogram
karakter seperti 10 digit untuk nomor telepon misalnya.
Tapi siapa yang peduli, seperti mengapa tidak hanya mengatakan 11 pula
atau mengapa tidak mengatakan 60 pula dengan varchar?
Apa keuntungan yang kita dapatkan dengan mengetahui dan merancang
untuk tetap jumlah karakter?
[Tak terdengar Keterangan]
Anda berada di jalur yang benar.
Jadi optimasi tapi itu benar-benar dari - ya?
[Tak terdengar Keterangan]
OK. Baik. Mari kita fokus pada bagian terakhir.
Jadi pengindeksan.
Jadi ternyata jika Anda tahu sebelumnya bahwa semua
bidang Anda akan menjadi 60 karakter,
Anda dapat benar-benar berpikir ini kolom dalam database Excel
sebagai memiliki sangat lurus, kiri dibenarkan
dan tepi kanan dibenarkan
karena setiap kolom adalah 60 karakter lebar.
Itu berarti bahwa ini string 60 karakter jauhnya
dari string ini, 60 karakter jauh dari satu ini
dan yang satu ini dan yang satu ini.
Jadi seperti kembali ketika Anda belajar C, Anda memiliki akses random
dalam dunia array, ide yang sama di sini.
Jika kolom Anda diwakili menggunakan panjang karakter tetap saja,
Anda dapat secara efektif indeks acak 60 atau 120 atau 180
dan Anda bisa mendapatkan secara individual string jauh lebih cepat.
Kemudian jika sebaliknya, kolom Anda memiliki tepi kiri lurus sehingga untuk berbicara
tetapi hak yang sangat kasar tepi ke kolom
karena Anda mungkin memiliki 10 karakter,
15 karakter, 5 karakter.
Jadi ini juga merupakan tradeoff.
Dan kadang-kadang hanya melalui trial and error
dan eksperimentasi Anda dapat mengetahui
keluar benar-benar panggilan yang tepat apa adalah tetapi ini adalah jenis
pertanyaan yang harus pergi
melalui pikiran Anda dan / atau tabel ketika tiba saatnya
merancang database Anda.
Jadi, belum tentu benar menjawab, tetapi Anda harus
setidaknya memiliki beberapa atau dua kalimat dalam pikiran
untuk cadangan apapun keputusan yang Anda buat.
Baik.
Jadi mari kita tetap bergulir di petunjuknya di sini
yang phpMyAdmin UI.
Jadi, nilai default untuk nama, harus saya tentukan
bahwa itu harus memiliki nilai default dari nol?
Apa yang Anda pikirkan?
Dapatkah kursus memiliki nama nol?
Hanya terasa aneh, kan?
Aku tidak bisa memikirkan apa pun program yang tidak disebutkan namanya di Harvard.
Dan mungkin ada beberapa kasus sudut jelas
di mana kursus diberikan nomor
dan profesor belum memilih nama untuk itu, tapi -
Maksudku, persetan dengan itu,
seperti mari kita bahkan tidak mengganggu mendukung itu.
Aku akan mengatakan demi kepentingan dari database bersih yang bagus,
mari kita menentukan bahwa Anda tidak bisa memiliki nilai default null.
Atau, kita bisa melakukan sesuatu seperti kursus untitled
yang tidak berbeda dengan Mac OS dan Windows melakukan
ketika Anda membuat folder misalnya,
tapi ada yang membuat sedikit lebih masuk akal
sehingga manusia melihat sesuatu.
Kita bicara tentang database back-end mungkin
untuk katalog saja.
Jadi saya tidak benar-benar bahkan menyukai ide memberikan
dalam nama saja untitled
karena itu tidak benar-benar akan membantu siapa pun.
Jadi mari kita meninggalkan ini karena tidak ada, yang berarti bahwa ketika Anda memasukkan
ke dalam database ini, Anda harus untuk memberikan setiap tentu saja nama
yang terasa sedikit bersih untuk saya.
Baik.
Jadi bergulir lanjut, pemeriksaan.
Ini hanya berkaitan dengan rangkaian karakter dan yang lainnya
jika Anda pernah melihat menyebutkan dari Swedia
di phpMyAdmin itu 'Menyebabkan orang
yang menulis phpMyAdmin adalah Swedia.
Apakah itu PHP atau itu MySQL?
Salah satu dari dua, saya lupa begitu saja.
Tapi untuk alasan historis
tetapi Anda dapat mengekspresikan setiap karakter dalam bahasa Inggris
Anda bisa dengan Swedia sehingga sebagian besar non-isu.
The CS50 Appliance meskipun adalah digunakan - dikonfigurasi untuk menggunakan UTF-8,
sehingga umumnya harus tidak muncul bagi Anda.
Atribut.
Jadi tak satu pun dari ini adalah benar-benar relevan di sini.
Saya melihat Binary, Unsigned, ZEROFILL Unsigned,
dan on update timestamp saat ini.
Bidang itu hanya berlaku untuk beberapa bidang numerik
atau beberapa bidang waktu.
Jadi kita akan melewatkan yang seluruhnya.
Null. Dapatkah bidang ini menjadi nol?
Jadi tidak ada. Kita sudah memiliki semacam percakapan.
Jadi kita tidak ingin nilai default.
Kami tidak ingin menjadi null.
Bagaimana dengan indeks?
Ada empat pilihan di sini.
Apa artinya jika kita tentukan
bahwa baris ini akan menjadi primary key?
Berpikir kembali ke CS50 atau CS165 jika Anda telah mengambil itu.
[Tak terdengar Keterangan]
Tepat. Jadi kunci primer menurut definisi adalah lapangan
yang secara unik mengidentifikasi setiap baris dalam tabel ini.
Dan Anda dapat mengandalkan untuk melakukan bahwa identifikasi yang unik.
Jadi, apa artinya kemudian hanya menjadi unik?
Yah, semacam kedua memiliki semacam
di bawah implikasi di bawah tenda.
Tapi pada umumnya, kunci utama adalah semacam kontrak yang Anda buat
dengan hal basis data.
Ketika saya melakukan query mencari kursus,
Aku akan menggunakan ini bidang tertentu.
Dan kita akan kembali ke mengapa kita mungkin memiliki dua
pilihan seperti di sini, primer atau unik.
Unik hanya mengatakan, ini lapangan akan menjadi unik
tapi aku tidak benar-benar membuat setiap jenis komitmen lisan sini
untuk menggunakan lapangan yang untuk melakukan pencarian saya
untuk alasan kita akan lihat hanya dalam beberapa saat.
Jika kita tentukan bukan indeks, apa artinya untuk menentukan
bahwa lapangan memiliki indeks di atasnya?
Ya?
[Tak terdengar Keterangan]
Tepat. Sudah dioptimalkan untuk query.
Jadi Anda - database server, Oracle, MySQL, apa pun,
umumnya akan bekerja dengan sihir di balik layar setelah Anda klik
bahwa pilihan dan kemudian klik Simpan dan akan membangun
up biasanya struktur pohon, B-pohon jika Anda pernah melihat
atau mendengar off yang merupakan pohon yang sangat pendek-cari
yang memberikan Anda sangat bagus sifat logaritmik
ketika mencari data.
Jika Anda tidak menentukan indeks di lapangan, apa yang terjadi
menjadi running waktu mencari
untuk sewenang-wenang [Fonetik] nama kursus?
Apa itu?
[Tak terdengar Keterangan]
Oh, [tidak terdengar], linear, kan?
Jika tidak ada optimasi diberikan ke database
dan Anda belum memikirkan database apa
data yang diharapkan.
Yang terbaik yang dapat Anda lakukan adalah memeriksa segalanya ketika Anda sedang mencari
untuk beberapa nilai, terutama jika ada bisa
pada kenyataannya menjadi duplikat.
Full-text sementara itu, kita akan gelombang tangan kami untuk saat ini.
Tapi pada umumnya, ini adalah jenis indeks yang memungkinkan Anda
untuk mengoptimalkan kata kunci pencarian di lapangan.
Jadi ini mungkin calon yang baik
untuk seperti deskripsi saja di mana Anda mungkin memiliki beberapa
paragraf dan Anda mungkin ingin melakukan pertandingan substring.
Full-teks umumnya akan membiarkan Anda melakukan itu cukup efisien.
AI, ini adalah semacam mengerikan penjelasan tetapi jika kita membawa
di atasnya Anda akan melihat Auto Increment.
Tidak berlaku baik di sini tapi kenaikan otomatis berguna
untuk seperti bidang int karena database akan mengurus
dari proses ditambah plusing setiap kali Anda melakukan insert.
Sehingga bahkan jika dua orang harfiah klik Submit
pada saat yang sama dan mencoba untuk membuat baris entah bagaimana
dalam database, salah satu mereka akan mendapatkan nomor I,
yang lain akan mendapatkan nomor saya ditambah 1.
Anda tidak perlu khawatir
sekitar dua nomor yang ditugaskan identik jika Anda
untuk melakukan hal ini sendiri dalam kode.
Baik.
Jadi aku agak suka di mana kita punya nama untuk menjadi.
Jadi mari kita klik Save.
Apakah ini desain yang baik untuk tabel database?
Dan sebagai samping jika berkarat pada SQL atau Anda menyortir
hanya selalu berpaling buta mata untuk apa yang sedang terjadi,
Saya bisa mengetik persis seperti itu -
tiga baris pada saat itu cepat hitam dan putih
pada command line klien atau aku bisa melakukan
bahwa dalam kode pemrograman.
Jadi semua phpMyAdmin lakukan untuk saya, hanya menyelamatkan saya upaya
mengingat kadang-kadang sintaks dan mengetik untuk
seperti perintah membosankan.
Baik.
Jadi ini tidak merasa seperti desain yang terbaik, satu meja lapangan.
Sekarang kita bisa memiliki hal-hal seperti profesor
dan lokasi dan deskripsi.
Tetapi bahkan kemudian, dengan menggunakan nama saja
untuk mengidentifikasi program tidak merasa ideal.
Apa umumnya memiliki kita lakukan di masa lalu
jika Anda telah menggunakan database untuk secara unik baris?
Tidak menggunakan varchars biasanya.
Ya?
[Tak terdengar Keterangan]
Ya. Jadi biasanya ID saja.
Jadi, yang paling umum pendekatan di sini terutama
bila menggunakan framework sebenarnya hanya
menggunakan nomor seperti integer.
Jadi biarkan aku pergi ke depan dan melakukan hal ini.
Dan kita dapat melakukan hal ini dalam beberapa cara, tapi pemberitahuan jika saya tampilannya
di di bawah sini.
Aku akan mengatakan menambahkan satu kolom di ujung meja,
umumnya hanya untuk visual yang kenyamanan Anda menempatkan ID
pada awal tabel meskipun ini tidak nyata
dampak fungsional.
Jadi aku akan mengatakan menambahkan satu kolom
pada awal tabel.
Aku akan klik Go, yang memberi saya kembali UI ini di sini.
Mari kita sebut ID ini.
Jika kita berpikir kita akan memiliki tidak lebih dilakukan 4 juta program
bidang int adalah baik-baik saja.
Kita bahkan bisa menyusut ke bawah
tapi ruang yang murah jadi siapa yang benar-benar peduli.
Tapi, kami berusaha untuk menulis Facebook sekarang,
mungkin bukan hal yang buruk untuk mengantisipasi ints besar
yang akan memberi kita 64-bit ints
tapi kemudian Anda benar-benar dua kali lipat jumlah bit
yang Anda gunakan, tradeoff begitu kecil
tetapi sesuatu yang perlu dipertimbangkan.
Sekarang, ini adalah membingungkan warisan hal.
Anda mungkin ingat menggunakan MySQL
bahwa kapan saja Anda mendeklarasikan int lapangan Anda akan sering melihat nomor
sebelahnya seperti nomor 10.
Ini tidak ada hubungannya dengan ukuran nomor
atau jumlah bit.
Yang ada hubungannya dengan nomor karakter yang digunakan
untuk secara visual display bahwa field int
bila menggunakan jendela terminal.
Jadi kita dapat melihat bahwa dalam sekejap.
Jadi, jangan disesatkan dengan mengetikkan nomor
di sana meskipun itu efektif meminta kami
untuk satu di sini.
Di sini, aku akan pergi ke depan dan mengatakan unsigned.
Tidak ada alasan untuk limbah semua angka negatif kami
karena database umumnya akan
untuk menganggap positif nilai-nilai atau null.
ID pasti tidak boleh null.
Dan apa yang Anda pikirkan tentang indeks untuk ID bidang ini?
Mari kita membuatnya primer.
Jadi, bagaimana jika, meskipun, seperti saya bisa hanya memikirkan satu saja CS164
di Harvard dan hanya satu Tentu saja CS50 di Harvard
dan itu cukup keseluruhan banyak benar
itu mungkin ada pengecualian [Tidak terdengar] kedua semester
atau sesuatu yang aneh seperti itu.
Tapi yang lebih mendasar, mengapa lebih baik
menggunakan terpisahkan ID numerik untuk unik mengidentifikasi program yang agak
dari sekedar string unik?
Ya?
[Tak terdengar Keterangan]
OK, menarik.
Jadi jika kita memiliki semacam program lintas terdaftar.
Jadi itu contoh yang baik.
Saya tidak yakin saya akan memecahkan bahwa meskipun
dengan memberi mereka sama Nomor ID jika itu
di mana Anda akan dengan itu.
Tidak ada? OK. Tapi pasti sudut kasus untuk dipertimbangkan.
Jika ada semacam - kita memerlukan beberapa jenis
aliasing berpotensi.
[Tak terdengar Keterangan]
Tentu.
[Tak terdengar Keterangan]
Itu contoh yang baik.
Nama mungkin berubah seiring waktu, benar-benar masuk akal.
Apa lagi?
[Tak terdengar Keterangan]
Maaf, berkata lagi.
[Tak terdengar Keterangan]
Ya, persis.
Jadi benar-benar, itu yg menentukan sebenarnya adalah
bahwa menggunakan int 32-bit adalah mungkin akan lebih cepat
dari beberapa variabel bidang arang panjang.
Dalam kasus pertama, kaleng harfiah cocok di register,
belum lagi banyak jejak memori yang lebih kecil.
Dalam kasus terakhir, Anda akan harus melakukan resort [fonetik]
untuk perbandingan string yang dalam diri mereka sendiri dengan linear
dalam ukuran string yang berpotensi.
Jadi, itu hanya bagus optimasi,
dan khususnya itu akan
untuk membiarkan kita melakukan apa yang disebut Bergabung lebih efisien
hanya dalam beberapa saat.
Jadi mari kita lakukan itu.
Kami akan menentukan bahwa ini adalah yang utama
karena saya tidak terlalu ingin peduli atau berpikir
tentang apa nomor ini tentu saja.
Biarkan mereka mengambil nilai-nilai apapun yang mereka inginkan.
Aku akan mengatakan kenaikan otomatis jadi saya bisa memasang iklan detail yang.
Seperti di samping Anda mungkin tahu bahwa Harvard
setidaknya memang memiliki unik nomor untuk kursus.
Aku tak ingat apa program ini.
Aku tahu bahwa CS50 ini nomor katalog adalah 4949,
benar-benar sewenang-wenang.
Tapi ada yang aneh kasus sudut yang bahkan
di dump registrarial tentu saja Data katalog,
kadang-kadang program, tua program memiliki nomor seperti 4.
Tapi secara teknis yang lapangan adalah bidang arang
yang hanya dimulai dengan 0004.
Jadi di sini juga, Anda harus berhati-hati membedakan
antara hal-hal seperti Tentu saja nomor katalog
yang mungkin memiliki beberapa manusia gagasan panjang tetap, 0004,
dan Anda tidak perlu menyimpan bahwa misalnya dalam sebuah int.
Semacam itu lapangan harus disimpan di tempat lain.
Jadi di Harvard, jika kita benar-benar membuat kursus
alat belanja, itu mungkin tidak cukup
Program nomor dengan hanya 1, 2, 3, 4.
Kita mungkin akan memiliki
untuk memiliki bidang lain disebut nomor katalog,
yang juga seharusnya menjadi unik berdasarkan
pada konvensi manusia di sini tapi itu bukan pilihan terbaik
untuk identifier unik karena mungkin variabel panjang.
Ini mungkin tidak empat chars, mungkin lima.
Bahkan, saya pikir beberapa tahun yang lalu mereka bergerak
lima karakter karena ada lebih dari 999 program
total atau sesuatu seperti itu, atau 9.999 kursus.
Jadi, yang mungkin menjadi contoh mana lapangan tidak utama
tetapi harus unik.
Dan alamat email adalah satu.
Anda mungkin ingin untuk menjadi unik
tetapi belum tentu kunci utama Anda.
Baik.
Jadi biarkan aku bang keluar lain tabel jauh lebih cepat dari satu ini.
Jadi aku akan menyebutnya salah satu instruktur dan aku akan
untuk memberikan ini total jumlah kolom dua.
Aku akan belajar saya Pelajaran dari terakhir kali.
Aku akan memanggil ID kolom pertama.
Aku akan memanggil Nama kedua kolom.
Saya juga akan melakukan Varchar.
Aku akan mengasumsikan bahwa tidak ada profesor memiliki nama panjang
dari 60 karakter, meskipun sekarang ini mungkin mendorongnya
dengan beberapa nama yang panjang, khusus orang dengan nama tengah.
Itu bagus untuk hari ini.
Jadi mari kita gulir di sini.
Mari kita membuat ini unsigned lagi.
Mari kita membuat primer ini.
Dan kita akan mengijinkan duplikasi nama
jika ada dua John Smith atau sesuatu seperti itu.
Dan sekarang kita memiliki dua tabel.
Jadi sekarang, ini menimbulkan pertanyaan bagaimana cara bergaul
di instruktur dengan kursus?
Aku merasa seperti aku jenis mendapat terburu-buru
karena jika seorang instruktur mengajarkan kursus,
insting pertama saya akan sebenarnya untuk kembali
Program menyadari, ini itu bukan ide yang baik.
Biarkan aku benar-benar menambahkan satu kolom di ujung meja,
klik Go, dan aku akan sebut Instruktur ini.
Dan aku akan membuat varchar ini dan Aku akan membuat ini 60.
Dan mungkin aku akan meninggalkannya nol sekarang
dalam kasus kursus belum telah unsigned di instruktur
yang kadang-kadang terjadi sebelum Istilah dimulai dan klik Save.
Manakah dari desain ini apa yang Anda inginkan?
Pertama di mana kita memiliki tabel instruktur terpisah
atau kedua di mana kita hanya menambahkan field ke kursus?
Jadi itu adalah mengaitkan instruktur dengan kursus.
[Tak terdengar Keterangan]
OK. Baik. Tapi biarkan aku mendorong kembali.
Ini hanya begitu sederhana seperti saya bisa cukup ketik nama orang tersebut
ke dalam tabel ini, seperti pasti yang memiliki beberapa nilai atau -?
[Tak terdengar Keterangan]
Baik.
Nah, biarkan aku menjadi sulit di sini.
Jadi saya katakan bahwa Tentu saja ini adalah CS51
dan saya tahu itu diajarkan tahun ini oleh dua orang.
Jadi, Henry Leitner dan Jesse Tov tapi -
jadi aku hanya akan menempatkan koma antara keduanya, benar.
Aku benar-benar baik CSV dari masa lampau.
[Tak terdengar Keterangan]
Tepat, benar.
Segera setelah Anda resor untuk sesuatu seperti ini,
yang mungkin merasa wajar dan Anda mungkin merasa
seperti ini adalah jenis pintar.
Aku semacam meminjam satu Ide yang bekerja dengan baik,
meminjam ide baru dan semacam menggabungkan mereka.
Kau benar-benar mengalahkan jenis titik menggunakan database
di tempat pertama karena jika salah satu dari nilai-nilai
menggunakannya adalah pencarian lebih cepat karena berbagai indeks
dan tabel yang dapat dibangun untuk Anda
oleh mesin database itu sendiri.
Sekarang, jika Anda ingin mencari untuk semua program
bahwa Jesse mengajarkan, sekarang Anda memiliki untuk melakukan pencocokan substring pada semua
bidang instruktur,
yang secara efektif berarti linear mencari lagi karena Anda memiliki
untuk menemukan set sewenang-wenang ini dari tiga karakter mana saja
di bidang instruktur didahului
dalam mungkin diikuti dengan koma.
Jadi ini pasti bukan pertanda baik.
Jadi biarkan aku kembali ke meja.
Biarkan aku pergi ke depan untuk kursus, membatalkan itu.
Aku akan hanya pergi depan dan drop bidang tersebut.
Dan jika Anda ingin melakukannya secara manual,
sintaks adalah ALTER TABLE kursus DROP instruktur.
Jadi mari kita pergi ke depan dan mengatakan ya untuk itu.
Dan kembali ke ide awal ini
di mana saya memiliki terpisah meja untuk instruktur.
Tapi sekarang ini terasa sedikit seperti saya dapat menempatkan kursus
dalam tabel kursus ini dan instruktur
dalam tabel instruktur tapi aku entah bagaimana perlu untuk menghubungkan keduanya.
Dan bagaimana Anda akan mengusulkan kita melakukan itu?
[Tak terdengar Keterangan]
Baik. Jadi mari kita lakukan itu.
Dan Anda bisa menyebutnya tabel dalam teori apapun.
Aku akan sengaja sebut saja apa yang banyak
kerangka akan menyebutnya, di antara mereka,
Laravel seperti yang Anda akan melihat dalam sedikit.
Aku akan menyebutnya saja menggarisbawahi instruktur.
Menggunakan tunggal dalam hal ini kasus untuk masing-masing kata
dan semua huruf kecil lagi, dan juga dengan -
kemudian abjad diurutkan dari kiri ke kanan.
Ini benar-benar sewenang-wenang tapi cenderung konvensi
dalam banyak kerangka kerja ini PHP dalam bahasa lain.
Berapa banyak kolom yang saya butuhkan di ini apa yang kita sebut tabel join,
untuk bergabung dengan dua lainnya tabel bersama-sama?
Tiga kolom?
Yang satu - apa yang mereka akan?
[Tak terdengar Keterangan]
OK. Baik. Yang bekerja.
Dan kita bisa secara teknis memotong sudut di sini tapi banyak
kerangka kerja khususnya masih akan memberikan bahkan baris ini
ID unik meskipun semantik baris
bahwa kita benar-benar peduli atau kolom yang kita benar-benar peduli
tentang adalah dua terakhir dari apa yang Anda katakan, tentu saja ID
dan ID instruktur.
Jadi mari kita lakukan ini.
Aku akan menelepon baris ini hanya ID, seperti yang kami lakukan sebelumnya.
Tapi yang satu ini saya akan untuk memanggil program ID.
Yang satu ini saya akan memanggil instruktur ID.
Dan aku akan menentukan bahwa semua
dari mereka adalah unsigned 'Menyebabkan saya ingin
untuk memaksimalkan 4 saya miliar int jangkauan.
Tak satu pun dari mereka harus nol.
Aku akan menentukan bahwa ID masih harus primer.
Dan lagi, ini adalah hanya konvensi,
banyak kerangka bahkan jika Anda tidak mengurutkan
dari dasarnya membutuhkan identifikasi unik untuk baris,
ternyata itu lebih mudah untuk kode, SQL yang akan
untuk secara otomatis dihasilkan bagi kita.
Jadi aku akan meninggalkan bahwa sebagai primer.
Tapi sekarang, aku agak memiliki keputusan desain,
Tentu ID dan instruktur ID.
Indeks Bagaimana jika setiap harus mereka dapatkan?
Jika saya akan meninggalkan indeks, apa implikasinya?
Apa implikasi?
Kinerja seperti sebelumnya, kan?
Jika tidak ada indeks, terbaik yang dapat Anda lakukan adalah jenis
dari [tak terdengar] melalui Semuanya mencari angka.
Jadi yang tidak merasa pintar.
Harus itu primer?
Jadi mengapa tidak?
Mengapa tidak primer?
[Tak terdengar Keterangan]
Sempurna. Jadi kita roll out [fonetik] primer.
Kita sudah memilih itu.
Jadi, harus itu unik?
[Tak terdengar Keterangan]
Baik. Jadi, jika Anda menganggap satu instruktur per saja,
benar-benar baik-baik saja.
Dan itu pasti kasus umum
tapi kita sudah menunda satu contoh mungkin familiar.
CS51 punya dua instruktur jadi kita jenis
sekarang kacau dalam kasus itu.
Jika kita lakukan hanya mengijinkan satu instruktur,
kita benar-benar bisa melakukan cara dengan join tabel sama sekali,
kembali ke pendekatan sebelumnya
dan menempatkan bukan nama orang mungkin tapi ID instruktur.
Jika Anda tahu setiap kursus hanya sebagai satu instruktur Anda dapat memiliki hanya
satu kolom.
Tapi variabilitas adalah apa yang membawa kita ke dalam kesulitan.
Baik.
Jadi, harus itu unik?
Nomor teks lengkap tidak merasa berlaku.
Seperti yang kita katakan sebelumnya itu
untuk seperti substring cocok untuk deskripsi.
Jadi bagaimana dengan indeks?
Nah, indeks mungkin kandidat terbaik kami
yang memberitahu MySQL mengoptimalkan untuk pencarian ini
atau biarkan saya menjelaskan, mengoptimalkan untuk pencarian atau bergabung
seperti yang akan kita lihat hanya dalam beberapa saat
sehingga mereka seorang sedikit lebih efisien
dari apa murni linear.
Apakah saya ingin auto akan menambahkan bidang ini?
Jadi tidak ada, karena benar elemen induk ada
dalam tabel kursus '.
Di situlah itu akan mendapatkan ditambah,
plus ketika itu sebenarnya dimasukkan.
Di sini, ini semua akan untuk dimasukkan secara manual
oleh kami mungkin dalam kode.
Jadi mari kita hanya menentukan bahwa baik saja ID
dan instruktur ID memiliki index.
Sekarang kita akan pergi ke depan dan menyimpan.
Dan sekarang, hanya untuk menunjukkan Anda korespondensi
antara apa yang bagus Friendly interface GUI
dan antarmuka baris perintah.
Biarkan aku pergi ke depan dan melakukan berikut pada prompt MySQL ini.
Aku akan mengatakan menggunakan courses50
yang merupakan nama sewenang-wenang Saya berikan ke database ini.
Dan sekarang, aku bahkan tidak ingat apa yang kita lakukan.
Jadi biarkan saya ketik menampilkan tabel
dan umumnya titik koma akan menjadi teman Anda di sini
untuk menyelesaikan query.
Dan ada itu.
Jadi di sini adalah baris atau lebih tepatnya tabel yang kita miliki di sini.
Sekarang, aku lupa apa kursus seperti,
jadi biar tidak menggambarkan program dan sekarang saya melihat semacam ASCII
atau versi apa phpMyAdmin melakukan
dan saya melihat bahwa ID adalah int.
Ada yang 10.
Apa artinya?
Itu hanya berarti bahwa ketika itu ditampilkan itu akan mengambil
naik 10 karakter di jendela terminal.
Apakah itu nullable?
Nomor ini adalah kunci utama.
Bisakah itu memiliki nilai default?
No Dan tambahan yang khusus bendera seperti kenaikan otomatis.
Jadi mari kita hanya melakukan beberapa sisipan dari cepat di sini.
Aku akan naik untuk - katakan saja.
Mari kita mengubah negara ke slide
di mana saya semacam pra-mempersiapkan ini.
Ini adalah ringkasan kemudian dari ketiga dari meja tersebut.
Aku sudah hanya secara manual mengetik perintah pertama.
Dan di sini, aku pergi ke depan dan ketik lain untuk Anda.
Ini hanya hal gaya.
Umumnya, banyak orang ketik pernyataan SQL dalam semua topi
dan kemudian nama tabel dan nama field dalam huruf kecil,
jika hanya karena jenis tegakan
tahu apa terminologi Anda dan apa sintaks basis data.
Jadi di sini kita memiliki tiga tabel, kursus, instruktur,
dan kursus instruktur.
Dalam slide saya dilakukan di muka, Saya tidak memiliki field ID
tapi itu tidak benar-benar hal yang buruk sama sekali.
Kami hanya akan melihat kolom ketiga di sana.
Yang telah saya lakukan itu di sini?
Jadi sekarang biarkan aku mengusulkan bahwa kita melakukan banyak sisipan.
Jadi, inilah beberapa data, Aku akan zoom in
Jadi aku akan mengusulkan bahwa dalam kursus,
kita hanya berurusan dengan tiga kursus.
Dan saya memilih ketiga Karena mereka mewakili
beberapa yang bagus - mereka memiliki beberapa sifat yang bagus.
CS1, CS50, CS51, mereka memiliki peningkatan ID
tapi apa ID apa sama sekali tidak relevan.
Itu hanya urutan di mana mereka otomatis dimasukkan oleh saya.
Bagaimana instruktur?
Jadi sekarang, karena Henry Leitner mengajarkan baik CS1 dan CS51,
ini adalah jenis yang tepat Implikasi untuk desain kami.
Dan Jesse mengajarkan CS51 dan Malan mengajarkan CS50.
Jadi sekarang - atau lebih tepatnya ini hanya ID unik orang-orang tersebut.
Dan kursus dan instruktur, - instruktur kursus, perhatikan di sini.
ID1 Course, yang adalah CS1 diajarkan
oleh instruktur ID1 yang Henry.
ID2 saja, yang saya berpikir itu CS50 diajarkan
oleh instruktur ID2, yang Malan.
Dan kemudian terakhir, CS51, dan melihat kita memiliki dua baris.
Dan sekarang ini adalah mengapa bergabung tabel kuat diajarkan
oleh Henry dan Jesse.
Jadi ini semua baik dan bagus,
tapi aku hampir tidak bisa ingat dari atas
kepala saya siapa adalah siapa di sini.
Bagaimana mungkin Anda berurusan dengan itu dalam kode,
tanpa harus kode keras hal?
Nah, di sinilah SQL itu sendiri mulai menjadi teman kita.
Dan aku akan mengusulkan bahwa kita dapat mengetik berikut ini.
Saya akan melakukan hal ini di dalam cepat sebenarnya.
Biarkan aku pergi ke depan dan memasukkan hal-hal ini.
Jadi, ke dalam tabel program mari kita lakukan apa yang kita punya
saat lalu.
Aku akan ke depan dan berkata, mari kita masukkan CS1 dan CS50.
Mari kita masukkan beberapa baris sekaligus, CS51.
Sekarang, biarkan aku pergi ke depan dan menyimpan.
Baiklah, jadi aku hanya menciptakan secepat
yang saya bisa hubungan kita hanya melihat pada layar.
Jadi di sini kita memiliki Leitner, di sini kita memiliki Malan.
Mari kita memberikan diri kita baris lain, dan Tov.
Sekarang biarkan aku simpan ini.
Dan aku melakukannya dengan sengaja ke dalam urutan yang sama.
Tidak, saya lupa untuk memberikan kenaikan otomatis ini.
Biar cepat memperbaikinya.
Saya akan memperbaiki hal ini di kode online.
Yang gagal sebagai samping.
Fakta bahwa saya tidak bisa masukkan Leitner dan Malan
dan Tov gagal, karena saya tidak menentukan nomor ID meskipun
itu mengharapkan satu dan saya lupa untuk memeriksa kenaikan otomatis,
yang berarti mereka semua secara default mendapatkan nol.
Tapi itu kemudian kontradiksi yang properti yang telah kita tentukan.
Kunci primer melanggar sehingga bahkan tidak membiarkan saya melakukannya.
Jadi biarkan saya memperbaiki ini.
Sekarang, biarkan aku kembali ke Masukkan tab di sini dan tentukan
bahwa saya ingin Leitner, Malan dan, satu baris lagi, Tov.
Dan sekarang yang terakhir, satu-satunya satu yang agak sulit
yang perlu diingat adalah program instruktur.
Mari kita masukkan sekarang Tentu saja ID1 adalah instruktur ID1
jadi itu CS1 dan Henry.
ID2 Course adalah instruktur ID2 yang CS50 dan Malan.
Dan kemudian yang terakhir yang kita miliki khawatirkan adalah program ID3
yang CS51, diajarkan
oleh kursus instruktur 1, yaitu Henry.
Dan tiga seperti juga diajarkan oleh 3, yaitu Tov.
Jadi mudah-mudahan sekarang kami telah diciptakan ini -
sialan, saya melakukan hal yang sama.
Instruktur kursus membutuhkan kenaikan otomatis.
Baik.
Saya akan melakukan hal ini lebih cepat kali ini, 1 program, 1 program, 2, 2.
Dan sekarang yang terakhir, kita lakukan CS51 yang memiliki program ID3 dan Henry.
Dan tentu saja ID3 dan Jesse.
Yang terlihat baik.
OK. Jadi sekarang, mari kita kembali ke jendela terminal.
Jadi jika saya menjelaskan kursus kami akan melihat ini.
Jika saya ingin melihat program saya bisa sekarang lakukan pilih star dari kursus,
titik koma, dan sekarang kita melihat nilai-nilai tersebut.
Dan sekarang, apa lagi yang ingin saya lakukan?
Pilih star dari instruktur, itu seperti yang saya harapkan,
dan pilih star dari program - Tentu saja garis bawah instruktur.
Jadi bagaimana saya sekarang bergabung tabel ini?
Jadi keindahan telah memilih nilai ID dengan cara ini adalah
bahwa jika Anda berpikir tentang mengambil tabel saja
dan instruktur meja dan kemudian memasukkan
di antara kedua di Anda pikiran instruktur kursus
table Anda dapat jenis garis semua kolom ID ini
sehingga Anda menggabungkan mereka ke satu kolom besar yang memiliki semua
informasi kami peduli.
Sintaks SQL untuk ini belum tentu jelas,
tapi mari kita lihat apakah kita bisa melakukannya.
Jadi pilih star dari kursus,
dan ada beberapa cara seperti yang bisa kita lakukan ini.
Aku akan tekan Enter hanya untuk jenis format hal baik,
tapi panah yang hanya gejala alat sisi klien,
itu tidak ada lakukan dengan SQL itu sendiri.
Jadi pilih star dari kursus.
Aku akan bergabung sekarang tabel program
di meja kursus instruktur.
Bagaimana? Di lapangan yang disebut courses.id menyamai saja
menggarisbawahi instruktur dot apa nama
dari bidang yang sesuai di sini bahwa saya ingin beberapa.
Ini bukan ID.
Nomornya - apa, maaf?
>> ID Course.
OK, biarkan aku zoom out.
Tapi aku ingin mengambil ini satu langkah lebih jauh.
Saya sekarang sudah melakukan ini meja dan yang satu ini.
Sekarang saya ingin menarik orang ini dalam juga.
Jadi, biarkan aku lanjut bergabung semua ini
pada instruktur tabel pada apa?
Underscore Course instructor.instructor id
setara instructors.id.
Jadi kita bisa menulis query ini dalam beberapa cara.
Urutan di mana saya melakukan ini tidak semua yang penting.
Aku hanya jenis melakukannya di pikiran saya dari kiri ke kanan.
Kita bisa melakukan ini dalam beberapa cara yang berbeda
tetapi jika aku sekarang memiliki titik koma dan tekan Enter,
pemberitahuan aku kembali baru tabel sementara, hasil set
sehingga untuk berbicara dalam database berbicara.
Dan apa yang harus saya dalam hal ini?
Saya miliki di ID, nama, lain ID, yang agak membingungkan
untuk saya pada saat ini, ID saja,
instruktur ID, ID, dan nama.
Jadi, pada akhir hari kita memiliki data sekarang.
Saya dapat melihat bahwa CS1 diajarkan by Leitner, CS51 diajarkan
by Leitner dan Tov, dan CS50 diajarkan oleh Malan.
Tapi aku sedikit gugup tentang ambiguitas ini saya buat.
Apa ambiguitas Saya menyinggung?
Ya?
[Tak terdengar Keterangan]
Ada tiga kolom ID.
Jadi kita benar-benar dapat memperbaiki hal ini dan kita akan benar-benar pergi
untuk tunduk kepada kerangka kerja kami akhirnya untuk membantu kami dengan ini,
tapi ternyata ada kata kunci di SQL disebut S,
di mana Anda dapat menentukan alias, nama baru untuk lapangan
sehingga kita dapat menghindari hal ini ambiguitas sama sekali.
Tapi menyadari bahwa jika kita tidak mengatasi entah bagaimana halnya dengan
kata kunci atau kerangka kerja,
ada berpotensi ini ambiguitas jika Anda mencoba
untuk mengakses lapangan ID karena jelas ada yang
dengan duplikat nama di sana.
Jadi ini adalah bergabung dan saya pikir dalam mata pikiran Anda cara terbaik
untuk berpikir tentang hal itu benar-benar adalah untuk mengambil dua tabel,
garis mereka dalam cara yang Anda inginkan.
Dan ini adalah apa yang disebut inner join dalam arti
bahwa kita menggabungkan tabel di sini.
Ada jenis lain bergabung bahwa kita mungkin menemukan
dari waktu ke waktu seperti luar bergabung,
tetapi untuk sebagian besar ini mungkin yang paling umum
untuk merekonstruksi data.
Apa yang kami lakukan sekarang adalah umumnya apa yang disebut
normalisasi data Anda, sehingga tidak ada duplikasi di mana saja
dalam tabel Anda.
Dan dengan duplikasi, saya akan berarti bahwa pendekatan pertama.
Jika kita telah disebutkan Leitner dan Tov di banyak tempat
dalam database Anda, itu bukan umumnya keputusan terbaik
terutama jika nama sekuat tenaga mengubah lembur atau dalam kasus
pernikahan, nama gadis kekuatan perubahan itu sendiri Anda hanya ingin satu
Tempat kanonik untuk beberapa value data seperti nama.
Baik.
Jadi, untuk rekap, kami telah memiliki beberapa keputusan desain untuk membuat
dan yang paling penting mungkin dikurangi menjadi beberapa
pilihan ini indeks.
Tapi biarkan saya menunjukkan satu hal lain juga.
Jika saya kembali ke phpMyAdmin,
satu fitur Anda mungkin tidak temui sebelumnya adalah
berikut.
Jika saya pergi ke kursus instruktur, Aku sudah tidak menentukan bahwa beberapa
hal ini memiliki index.
Tapi biarkan aku pergi ke struktur tab tentu saja instruktur.
Mari saya klik sekarang Indexes dan perhatikan berikut ini.
Saya telah ditentukan di sini bahwa ada primary key
pada kolom yang disebut ID.
Ini adalah agak rumit cara menentukan kardinalitas
dan sebagainya sebagai mengacu pada ukuran lapangan dalam bytes.
Tapi sekarang saya juga memiliki lain lapangan, tentu saja ID, yang -
ID saja yang dilakukan di muka dan unik, OK.
Saya melakukan ini di maju bagi kita.
Jadi, mengapa ini - biarkan aku jatuh ini untuk kepentingan diskusi.
Oh, Anda tahu apa yang saya lakukan?
OK. Jadi, sebelumnya, salah satu bahaya menggunakan alat GUI
seperti ini, ketika kami penciptakan ini bergabung tabel,
tabel instruktur kursus, ingat bahwa saya ditentukan
bahwa saya ingin indeks di bidang ini
dan indeks ini bidang lain.
Efek samping dari memeriksa kedua kotak-kotak
pada layar yang sama adalah bahwa phpMyAdmin disimpulkan dari itu,
bahwa saya ingin tidak dua indeks terpisah,
bahwa saya ingin bergabung indeks yang umumnya hanya membantu
atau paling membantu ketika Anda mencari di satu bidang tidak
namun kedua bidang tersebut.
Dan itulah mengapa kita harus mereka menggabungkan diri di sana
jadi saya menjatuhkannya karena yang tidak apa yang saya dimaksudkan.
Sebaliknya, aku akan untuk mengulang ini di sini.
Aku akan pergi ke ID saja
dan di bawah lebih aku hanya akan mengatakan menambahkan indeks.
Dan aku akan pergi di bawah instruktur ID dan berkata menambahkan indeks.
Dan jika kita klik di sini, pemberitahuan kami memiliki tiga indeks,
satu primer dan seperti yang saya dimaksudkan satu untuk setiap
orang-orang kunci asing.
Dan aku menyebutnya asing karena Tentu ID dalam peta tabel ini
ke lapangan yang, hanya untuk menjadi jelas, di meja lain.
Kunci utama yang disebut ID, dalam tabel yang disebut kursus,
dan kesepakatan yang sama untuk yang lain.
Tapi sekarang, adalah menarik trik dan benar-benar teknik.
Aku hanya pergi ke depan dan biarkan aku melakukan itu sedikit lebih lambat.
Pada layar yang sama, pemberitahuan ia mengatakan pandangan Relation di sini.
Saya klik ini dan sekarang saya melihat bisa melakukan beberapa kendala.
Jadi, salah satu upsides juga
tidak hanya menggunakan konseptual kunci asing dan meja lainnya
seperti kita baru saja di adalah bahwa dengan mendefinisikan indeks
pada mereka Anda dapat memiliki Database membantu Anda bahkan lebih
menjamin integritas dari bidang itu.
Secara khusus, sekarang saya bisa tentukan melalui penurunan ini
turun bahwa bidang kursus ID
dalam tabel ini benar-benar peta untuk courses.id.
Demikian pula, instruktur garis bawah ID dipetakan ke instructors.id.
Sekarang, mengapa ini berguna?
Nah, perhatikan, di sebelah kanan sisi apa yang muncul sekarang.
Saya sekarang bisa mengajarkan database yang jika Henry
misalnya pernah pensiun dan baris-nya menghilang
dari meja instruktur sama sekali sehingga menjadi
dihapus, aku bisa melalui ini Cascading pendekatan memastikan
bahwa setiap program yang ia ajarkan adalah tidak lagi berhubungan dengan dia.
Saya bisa mengajarkan database untuk menghapus baris
dalam apa yang disebut join tabel ini secara otomatis jika Henry atau jika salah satu
kursus nya menghilang.
Sekarang, mengapa ini menarik?
Ya?
[Tak terdengar Keterangan]
Anda hanya perlu melakukannya sekali dan jangka panjang, kan?
Ini sangat mudah jika semacam orang datang dan pergi, kursus datang
dan pergi, database Anda bisa hanya bisa dikotori dengan program
dan dengan fakultas yang tidak relevan lagi dengan kumpulan data.
Dan data Anda mulai mendapatkan sangat berantakan dan kotor dan basi,
dan jadi di sini kita dapat menyusun
dari menegakkan beberapa kendala ini.
Ya?
[Tak terdengar Keterangan]
Ia tahu dengan cara ini.
Ini adalah layar di mana kita menentukan sebuah hubungan
antara kunci asing dan primary key.
Jadi semua penamaan konvensi saya singgung
dengan sebelumnya hanya konvensi.
Tidak ada makna yang melekat.
Ini adalah layar yang hanya berguna
setelah Anda tentukan indeks pada masing-masing bidang tersebut seperti yang kita lakukan.
Dan untuk dropdown ini kita memiliki beberapa hal misalnya
jika program dihapus Anda dapat benar-benar mencegah penghapusan yang
terjadi jika ada adalah baris dalam tabel ini
dengan hanya mengatakan, Pembatasan.
Dengan kata lain Henry tidak bisa pensiun
sampai kita memisahkan dia dari CS51 dan CS1.
Jadi itu hal yang baik.
Tapi bisa memicu kesalahan dalam kode Anda
jika Anda tidak mengantisipasi bahwa, atau kita dapat memiliki kaskade,
riam yang sama seperti cascading style sheet
dan Cascading yang air terjun berarti bahwa jika -
jika Henry pensiun begitu - dengan mendapatkan dihapus
sehingga akan row nya di sini bisa dihapus.
Tidak ada Aksi berarti apa-apa atau null adalah jenis berguna jika Anda jenis
dari ingin beberapa catatan sejarah Henry telah diajarkan CS51,
tetapi Anda hanya ingin bidang tersebut untuk null sehingga baris ada
tapi itu tidak lagi berhubungan dengan dia.
Jadi ini sangat kuat teknik yang Anda dapat
dan harus menggunakan meskipun kepentingan khususnya
menyelamatkan Anda dari diri Anda sendiri.
Jadi biarkan saya membuat menyebutkan dari beberapa rincian akhir di sini,
bahan dengan yang yang mungkin bisa membantu
seperti yang kita rencanakan untuk desain database.
Anda juga memiliki pilihan atas mesin database
yang Anda gunakan dalam kode Anda.
Jika Anda akrab CS161 dari Anda mungkin -
atau bahkan 61, Anda mungkin umumnya akrab dengan file sistem.
Dan ada hal-hal seperti, NTFS dan HFS +
dan X2FS4 [fonetik] dan 3 dan sebagainya.
Ada cara yang berbeda menyimpan data di meja.
Demikian pula ada cara yang berbeda untuk menyimpan data
dalam database secara default setidaknya dalam Appliance
dengan versi terbaru MySQL.
Kami telah menggunakan mesin database disebut, NoDB,
yang mendukung beberapa fitur bagus.
Tapi satu umum lainnya juga disebut MyISAM dan lagi
yang dapat digunakan adalah Memory, yang berarti tidak memasukkan apa pun
pada disk, terus hal dalam memori.
Untuk sebagian besar Anda mungkin tidak akan salah baru mulai
dengan NoDB, tetapi untuk setiap proyek yang cenderung melibatkan tingkat tinggi
penyisipan misalnya, seperti banyak penebangan cepat,
ratusan hal per detik atau ribuan hal.
Setiap kali Anda memiliki banyak hal yang terjadi
di dalam database maka jenis ini
keputusan tingkat yang lebih rendah mulai terlibat.
Fitur teks lengkap untuk Misalnya hanya berfungsi di MyISAM
sehingga memiliki implikasi.
Tapi Anda mungkin ingat ini, mari kita setidaknya memotivasi mengapa kita peduli
tentang NoDB pada khususnya.
Sebuah kondisi ras umumnya mengacu pada apa?
Baiklah, ini adalah kiasan untuk contoh beberapa
Anda mungkin telah mendengar di tahun terakhir apakah 161 atau 50
di mana Anda memiliki teman sekamar, Anda berdua benar-benar seperti susu,
salah satu dari Anda mendapatkan rumah pertama terbuka kulkas tidak ada susu,
menutup kulkas berjalan di jalan-jalan ke CVS dan mendapatkan
dalam antrean untuk membeli susu.
Sementara itu, teman sekamar Anda datang kembali ke sini.
Dia juga suka susu.
Buka lemari es dan menyadari tidak ada susu.
Di sini ia kemudian pergi ke menyimpan, mungkin lain CVS.
Fast forward beberapa menit kemudian Anda datang kembali dan sekarang kedua
Anda telah membeli susu.
Salah satunya sekarang akan merusak karena Anda tidak
seperti susu yang banyak dan ini adalah masalah, kan?
Karena Anda berdua diperiksa keadaan beberapa variabel
dan membuat keputusan berdasarkan di atasnya meskipun negara
variabel tersebut pada dasarnya dalam proses yang berubah,
semua akan hal itu perlahan-lahan di atas jumlah waktu yang dibutuhkan
untuk mendapatkan ke dan dari CVS.
Jadi apa adalah semacam nyata bodoh solusi dunia untuk masalah itu?
Tinggalkan catatan, kan?
Ini terjadi terakhir kali.
Selalu meninggalkan catatan atau padlock hal secara harfiah.
Dan saya katakan gembok, karena jika Anda mengambil atau mengambil CS161,
penguncian adalah mendasar ide dalam dunia semacam itu.
Jadi kondisi ras bisa timbul juga dalam dunia database
dan Anda mungkin ingat mungkin dari CS50 membiayai jika Anda mengambil 50,
kode ini bahwa kita benar-benar memberi kalian dalam spesifikasi
pada saat itu sehingga Anda operasi yang disebut atom.
Jika Anda ingin, dalam hal ini kasus, membeli saham dari saham
dan saham yang memiliki beberapa simbol tertentu.
Kami mengatakan Anda untuk menggunakan kode seperti ini, karena dengan cara ini
pada duplikat key update sintaks, yang dibangun
ke MySQL Anda secara efektif melakukan baik dalam insert
atau update setelah melakukan pilih untuk melihat
jika suatu saham sudah di sana.
Dalam kata lain, analog di dunia membeli saham
susu dan kulkas mungkin, pertama,
sebelum membeli saham Google Anda mungkin ingin memilih
dari database semua saham Google yang memiliki David
untuk melihat apakah ia memiliki nol atau lebih.
Setelah Anda melihat apakah ia memiliki nol atau lebih yang Anda miliki
untuk kemudian melakukan hal berikut.
Anda juga harus melakukan insert
jika ia memiliki penyebab zero ' tidak ada baris untuk David belum,
atau Anda harus melakukan update jika setidaknya dalam teori Anda inginkan
untuk memiliki satu baris per pengguna.
Masalahnya adalah memilih bahwa jumlah saham
dan kemudian memperbarui atau menyisipkan dapat terganggu
oleh orang lain di lain terminal komputer mencoba untuk membeli
atau menjual beberapa dari David Saham saham apakah
untuk tujuan baik atau semacam tujuan jahat.
Ini seperti pergi ke toko ketika teman sekamar Anda akan kembali
dan memeriksa negara variabel.
Jadi sintaks ini pada saat itu yang semacam sesuai
untuk CS50, menghindari bahwa masalah sama sekali.
Dan itu hanya melakukan semua itu sihir penguncian untuk Anda,
tapi sekarang dengan jenis proyek untuk kursus ini
yang kemungkinan besar akan melibatkan set data yang lebih kompleks,
Anda tidak dapat mencapai selalu atomicity ini.
Segala sesuatu terjadi sekaligus atau tidak sama sekali
tanpa gangguan begitu elegan.
Dan MySQL, lain mesin database,
hal dukungan yang disebut kunci,
dimana Anda dapat mengatakan kunci ini tabel sehingga hanya satu memperlakukan
dan umumnya hanya satu pengguna dapat menyentuhnya di setiap titik waktu
untuk membaca atau menulis dan maka Anda dapat membukanya.
Ini adalah contoh dari satu referensi MySQL sendiri,
di mana jika Anda memiliki seperti bank account yang Anda mencoba
untuk memotong uang dari dan kemudian menambahkan uang ke.
Anda mungkin ingin memastikan bahwa kedua
dari hal-hal yang terjadi bersama-sama
sehingga tidak ada kesalahan matematis
dan tidak ada kerugian satu uang, entah bagaimana.
Masalah dengan kunci meskipun dalam database adalah
yang umumnya berarti seluruh tabel terkunci,
yang berarti jika Anda memiliki seratus orang yang mencoba
untuk melakukan bisnis dengan bank Anda online pada jumlah yang sama
waktu hanya satu dari mereka bisa pergi pada satu waktu.
Yang bodoh, terutama pada server saat ini
yang memiliki delapan saja, 16 Tentu saja, memiliki sejumlah besar
memori, tidak ada alasan untuk serial semua
transaksi Anda jika mereka pelanggan hanya akan
untuk berinteraksi dengan baris mereka sendiri.
Jadi NoDB memungkinkan Anda untuk melakukan hal yang lebih cerdas
dan ini umumnya akan pendekatan yang Anda ambil dalam kode,
Anda menggunakan sesuatu disebut transaksi.
Dan Anda melakukan ini pada umumnya dalam kode PHP,
Kode Ruby, Python, apa pun.
Tapi kode SQL yang akhirnya digunakan adalah ini,
biasanya.
Mulai transaksi maka Anda menentukan dua atau lebih query
bahwa Anda ingin mengeksekusi sama sekali
tanpa gangguan atau tidak sama sekali.
Ada bahkan bisa menjadi beberapa pilih pernyataan dalam
atau menghapus atau update.
Tapi hal yang menyenangkan adalah bahwa Database akan cukup pintar
memastikan bahwa hal itu hanya akan mengunci baris mereka benar-benar
terlibat dalam update ini atau memilih atau menghapus.
Jadi jika Anda punya ribuan baris dan Anda hanya menyentuh tiga
dari mereka, hanya sebagian yang tabel akan dikunci
yang berarti orang lain 99 pelanggan dapat menyentuh baris mereka
tanpa serial dan diperlambat oleh Anda.
Sementara itu, ini adalah paling baik aspek transaksi.
Mereka adalah transaksi dalam merasakan seperti 161 pada sistem file,
mereka transaksional
yang berarti Anda dapat menggulung mereka kembali, Anda dapat membatalkan mereka.
Ini seperti perintah atau mengontrol F database.
Jika Anda menemukan bagian jalan melalui semua
berbagai operasi data Anda, menembak, sesuatu yang tidak beres.
Anda benar-benar melaksanakan berbeda query SQL gulungan kembali
dan semua tren ini - semua dari laporan Anda dieksekusi
setelah mengatakan start transaksi menghilang
seolah-olah mereka tidak pernah terjadi,
yang merupakan luar biasa hal yang sangat kuat.
Dan ini adalah jenis hal tentu dalam 50 kita semacam
dari menyapu di bawah karpet dan Anda hanya semacam berasumsi
bahwa semua akan baik-baik.
Tapi begitu Anda mulai berpikir tentang proyek-proyek nyata
dan pengguna yang sebenarnya dan integritas database Anda,
ini adalah jenis keputusan desain
yang akan menjadi penting.