Ketika merancang skema basis data relasional untuk aplikasi web, saya sering menemukan kasus di mana saya akhirnya membuat tabel hanya berisi satu baris, dan hanya satu baris. Rasanya itu adalah cara yang salah untuk mendesainnya, tetapi saya tidak dapat menemukan sesuatu yang jauh lebih baik, atau itu jelas "cara yang tepat untuk melakukannya."
Contoh terbaru adalah situs yang memungkinkan pengguna mengontrol konten secara manual di beranda. Yah, hanya ada satu halaman rumah. Saya membuat tabel yang memiliki semua bidang yang diperlukan untuk membangun beranda, seperti bidang teks untuk area yang berisi teks deskriptif. Bidang untuk menyimpan nama file gambar besar. Beberapa kunci asing yang menunjuk ke artikel yang akan ditampilkan di beranda, dll. Berhasil, tetapi rasanya salah memiliki meja hanya dengan satu baris.
Di masa lalu saya sudah mencoba banyak desain lain, seperti memungkinkan beberapa baris di tabel beranda dan memilih satu secara acak. Saya sudah mencoba menambahkan bidang boolean bernama "aktif" dan memilih salah satu homepage aktif secara acak. Saya sudah mencoba memaksa hanya satu baris untuk aktif pada waktu tertentu dalam logika aplikasi. Saya sudah mencoba bahkan tidak membuat tabel beranda dan memiliki semua item lainnya, seperti artikel, memiliki bidang boolean dengan nama-nama seperti Featured_on_homepage.
Dalam kebanyakan kasus, saya dapat membangun beranda dengan sekelompok konstanta dalam file pengaturan. Masalah utama dengan file pengaturan adalah bahwa itu di bawah kendali pengembang. Karena sesuatu seperti isi beranda adalah sesuatu yang harus diedit oleh pengguna, itu harus masuk dalam database.
Di banyak situs, saya tidak memiliki masalah ini karena saya dapat membangun hal-hal seperti beranda dengan kueri seperti memilih lima artikel terbaru. Tetapi ketika saya memiliki halaman yang dikuratori secara manual dengan persyaratan yang ketat, menjadi sulit untuk memodelkannya dalam database. Tapi bayangkan Anda punya meja foto dan meja artikel. Syaratnya adalah bahwa beranda akan menampilkan tepat lima foto, tepat tiga artikel, dan dua blok teks sewenang-wenang yang dikontrol secara manual oleh pengguna. Bagaimana Anda memodelkan itu dalam database dengan cara yang benar?
Juga, saya memiliki masalah pemodelan ini dalam banyak kasus lain selain hanya beranda. Itu hanya contoh termudah dan paling umum berlaku yang bisa saya buat.
Jawaban:
Satu pendekatan sederhana adalah menyimpan properti Halaman Beranda dalam tabel Properti (atau menyebutnya sesuatu yang lain) yang terdiri dari kolom Nama & Nilai.
HomePageProperty1 - UserValue1
HomePageProperty2 - UserValue2
Ini mungkin bukan solusi yang ideal, tetapi sederhana dan fleksibel. Ini juga menghilangkan tabel dengan skenario satu baris.
sumber
Tidak jelas bagi saya bahwa Anda memiliki masalah yang harus Anda selesaikan.
Tabel baris tunggal sama sekali tidak menjadi masalah bagi database itu sendiri, dan memungkinkan Anda untuk menerapkan tipe data dan kendala ke data.
Saya tidak yakin Anda mencoba memecahkan masalah nyata, jujur saja.
sumber
Sepertinya saya menggunakan database untuk sesuatu yang sebenarnya harus disimpan sebagai file.
Deskripsi Anda mengingatkan saya pada banyak halaman Wiki, di mana pengguna dapat mengedit konten. Di Wikis, atau setidaknya dalam implementasi yang saya lihat, halaman-halaman tersebut tetap sebagai file.
Ini membantu Anda dengan perincian web lainnya seperti memungkinkan pengguna Anda untuk me-cache halaman rumah Anda, yang praktis praktis gratis jika Anda menyimpan halaman sebagai file, tetapi Anda harus secara manual menerapkan logika untuk pembatalan cache jika Anda sedang membangun halaman pada setiap permintaan berdasarkan konten yang disimpan di database.
Bagaimanapun, saya hanya ingin memperjelas bahwa meskipun sebagian besar data persisten suatu aplikasi disimpan dalam database, itu tidak berarti bahwa kita harus menyimpan semua yang ada di sana. Database hanyalah salah satu alat perdagangan kami. Kita harus belajar memanfaatkan sebanyak mungkin alat yang berbeda.
sumber
Sama sekali tidak ada yang salah dengan tabel dengan satu baris.
Jika ini adalah bagian dari desain Anda, Anda harus menegakkannya. Beri tabel kolom identitas, berikan kendala keunikan, lalu tambahkan kendala kolom untuk hanya mengizinkan nilai tunggal. Ini akan memastikan bahwa tidak ada yang akan dapat menambahkan baris kedua, yang bisa menjadi bencana jika pernyataan SQL yang membaca tabel (dimengerti) tidak memiliki klausa where.
Jika Anda mulai mendapatkan sejumlah besar kolom, Anda mungkin tergoda untuk mempersempit tabel dan alih-alih memiliki satu baris per item konfigurasi. Ini bukan ide terbaik karena Anda kehilangan keamanan dan validasi tipe. Selain itu, Anda akan kehilangan kepuasan dengan multitenancy , yang mungkin penting bagi Anda. Solusi yang lebih baik adalah memikirkan kembali apa sebenarnya entitas Anda dan memiliki tabel baris tunggal terpisah untuk entitas yang berbeda.
Ya, saya tidak hanya mengatakan tabel baris tunggal OK, tapi saya sarankan Anda ingin lebih dari satu.
sumber
Anda dapat membuat tabel yang disebut STATIC_CONTENT dan memiliki kolom untuk kunci serta konten, pelacak aktif / tidak aktif, dll. Kemudian, buat baris dengan kunci "HomePage" dan di beranda Anda, muat konten statis untuk kunci itu dan tampilkan. Dengan begitu, ketika Anda memiliki konten statis lainnya (tentang halaman, halaman kontak, dll.), Anda dapat menambahkan baris ke tabel itu.
sumber
Tidak ada yang salah per se dalam memiliki meja hanya dengan satu baris. Jika Anda hanya memiliki satu contoh entitas tertentu, maka itu mungkin cara yang paling alami untuk mewakili hal ini.
Tetapi memilih satu baris secara acak adalah salah dan buruk. Jika logika domain Anda hanya mengharapkan satu baris, itu jelas merupakan kesalahan dalam data jika sebenarnya ada lebih banyak. Jadi, Anda harus mencari tahu siapa atau apa yang menulis data tidak valid ke database dan mencegah mereka melakukannya! Bergantung pada basis data, Anda mungkin bisa menambahkan batasan pada tabel untuk mencegah hal ini terjadi, misalnya, membiarkan hanya nilai tertentu sebagai kunci utama.
sumber
Hanya untuk menambah ke Walter ..
Struktur tabel properti harus memungkinkan beberapa tipe data.
sumber
Menurut saya, Anda bisa mengabstraksi satu tingkat lagi. Pada akhirnya "HomePage" adalah "Halaman". Anda dapat memiliki berbagai jenis halaman dengan properti yang Anda butuhkan. Jika Anda memiliki bagian di situs Anda, Anda mungkin perlu "SectionHomePage", yang dapat berfungsi sama dengan "Halaman Utama".
Mari kita coba seperti ini. Saya menambahkan tabel ArticlePage sehingga Anda melihat bagaimana Anda dapat memisahkan properti yang sesuai.
Itu akan bekerja dengan baik untuk saya, bahkan akan bekerja dengan baik untuk situs besar.
sumber