Materi
Data berbentuk pohon, seperti kategori dan subkategori atau atasan dan bawahan, disimpan di satu tabel dengan kunci asing ke tabelnya sendiri. Dokumentasi PostgreSQL menyebutnya self-referential foreign key dan memberi contoh tabel tree dengan kolom parent_id: simpul teratas ber-parent_id NULL, simpul lain wajib merujuk baris yang ada. Dokumentasi SQLite memakai pola yang sama untuk tabel org dengan kolom boss. SQLite bisa menelusuri pohon sedalam apa pun dengan WITH RECURSIVE, tetapi mesin latihan di situs ini tidak menerimanya, jadi latihan memakai self-join: setiap tingkat ke atas adalah satu JOIN lagi ke tabel yang sama dengan alias berbeda. Batasnya, kedalaman yang ditelusuri harus diketahui saat kueri ditulis.
SELECT a.nama, b.nama AS atasan, c.nama AS atasan_dari_atasan
FROM pegawai a
LEFT JOIN pegawai b ON b.id = a.atasan_id
LEFT JOIN pegawai c ON c.id = b.atasan_id;Data yang berubah dari waktu ke waktu, seperti harga sewa, tidak ditimpa bila riwayatnya perlu dijawab. Setiap versi menjadi satu baris dengan kolom berlaku_dari dan berlaku_sampai. MariaDB menyediakan pola ini sebagai application-time period: dua kolom tanggal dinyatakan sebagai periode, dan WITHOUT OVERLAPS menolak periode yang tumpang tindih, misalnya pemesanan kamar ganda. Rentang di PostgreSQL berbatas bawaan [), awal termasuk dan akhir tidak termasuk, sehingga versi lama berakhir tepat di tanggal versi baru mulai. SQLite tidak punya keduanya, jadi aturannya ditulis di kueri: versi yang berlaku pada tanggal X adalah baris dengan berlaku_dari ≤ X dan berlaku_sampai kosong atau lebih besar dari X.
Pola entity-attribute-value (EAV) menyimpan setiap atribut sebagai baris (entitas, atribut, nilai). Dokumentasi MariaDB mengakui daya tariknya, yaitu daftar atribut yang tidak diketahui saat pengembangan dan terus bertambah, lalu menyebut tabel tiga kolom itu solusi buruk: SELECT menjadi berantakan karena butuh banyak JOIN, angka yang disimpan sebagai teks tidak dibandingkan dengan benar terutama untuk uji rentang, dan tabelnya besar. Alternatif dari MariaDB: kolom sungguhan untuk atribut yang dicari dan diurutkan, sisanya dalam satu kolom JSON. Atribut bernilai banyak dengan arti tetap, seperti nomor telepon, tetap menjadi tabel anak seperti di modul 4.