Anda harus membuat perbedaan antara atribut dan entitas. Entitas adalah sesuatu - biasanya kata benda. Atribut lebih seperti sepotong informasi yang menggambarkan. Dalam jargon database, entitas =tabel, atribut =bidang/kolom.
Memiliki tabel terpisah untuk hal-hal tertentu, mari kita gunakan direktur, sebagai contoh, disebut normalisasi. Meskipun bisa bagus dalam beberapa keadaan, bisa jadi tidak perlu di situasi lain (karena umumnya membuat kueri lebih rumit - Anda harus menggabungkan semuanya - dan ini lebih lambat).
Dalam hal ini, memiliki tabel tahun tidak diperlukan, karena tidak ada atribut lain tentang satu tahun, selain tahun itu sendiri, yang akan Anda simpan. Lebih baik untuk mendenormalisasi ini dan menyimpan tahun di tabel film itu sendiri.
Direktur, di sisi lain, berbeda. Mungkin Anda ingin menyimpan nama depan sutradara, nama belakang, tanggal lahir, tanggal kematian (jika ada), dll. Anda tentu tidak ingin memasukkan tanggal lahir sutradara setiap kali Anda memasukkan film yang menampilkan orang ini. mengarahkan, jadi masuk akal untuk memiliki entitas terpisah untuk seorang direktur.
Bahkan jika Anda tidak ingin menyimpan semua informasi tentang direktur ini (Anda hanya ingin nama mereka), memiliki tabel terpisah untuk itu (dan menggunakan kunci pengganti - saya akan membahasnya sebentar lagi) berguna karena itu mencegah kesalahan ketik dan duplikasi - jika Anda memiliki nama seseorang yang salah dieja atau dimasukkan secara berbeda (pertama, terakhir vs terakhir, pertama), maka jika Anda mencoba menemukan film lain yang mereka sutradarai, Anda akan gagal.
Menggunakan kunci pengganti (kunci utama) untuk tabel umumnya merupakan ide yang bagus. Mencocokkan bilangan bulat jauh lebih cepat daripada mencocokkan string. Ini juga memungkinkan Anda untuk mengubah nama secara bebas, tanpa khawatir tentang kunci asing yang disimpan di tabel lain (ID tetap sama, jadi Anda tidak perlu melakukan apa pun).
Anda benar-benar dapat mengambil desain ini cukup jauh, dan ini semua tentang mencari tahu apa yang ingin Anda simpan di dalamnya.
Misalnya, daripada memiliki satu sutradara per film, beberapa film memiliki banyak sutradara.. jadi akan ada hubungan banyak-ke-banyak antara film dan sutradara, jadi Anda memerlukan tabel dengan mis:
films_directors => **filmid, directorid**
Mengambil langkah lebih jauh, terkadang sutradara juga aktor, dan sebaliknya. Jadi, daripada memiliki tabel sutradara dan aktor, Anda bisa memiliki tabel satu orang, dan bergabung dengan tabel itu menggunakan tabel peran. Tabel peran akan menampung berbagai posisi - misalnya, sutradara, produser, bintang, ekstra, pegangan, editor.. dan akan terlihat lebih seperti:
films => **filmid**, title, otherstuff...
people => **personid**, name, ....
roles => **roleid**, role name, ....
film_people => **filmid, personid, roleid**
genre => **genreid**, name, ...
film_genre => **genreid, filmid**
Anda mungkin juga memiliki bidang role_details di tabel film_people, yang dapat berisi informasi tambahan tergantung pada perannya (mis., nama bagian yang dimainkan aktor).
Saya juga menunjukkan genre sebagai hubungan banyak<>banyak, karena mungkin sebuah film ada dalam beberapa genre. Jika Anda tidak menginginkan ini, maka alih-alih tabel film_genre, film hanya akan berisi genreid.
Setelah ini diatur, mudah untuk menanyakan dan menemukan semua yang telah dilakukan orang tertentu, atau semua yang telah dilakukan seseorang sebagai sutradara, atau semua orang yang pernah mengarahkan film, atau semua orang yang terlibat dengan satu film tertentu.. Itu bisa terus dan terus.