Standar SQL92 dan SQL99 menentukan konstruksi DDL . Tidak semua database mendukung ini, atau memiliki nama yang berbeda untuk itu (SQL Server memiliki Jenis yang Ditentukan Pengguna , misalnya).CREATE DOMAIN
Ini memungkinkan seseorang untuk mendefinisikan tipe data terbatas untuk digunakan dalam database mereka, untuk menyederhanakan dan menegakkan aturan yang berkaitan dengan nilai-nilai yang diizinkan. Tipe data seperti itu dapat digunakan dalam deklarasi kolom, dalam input dan output untuk prosedur dan fungsi tersimpan dll ...
Saya ingin tahu:
- Apakah orang benar-benar menggunakan domain dalam desain basis data mereka?
- Jika demikian, sampai sejauh mana?
- Seberapa bermanfaatkah mereka?
- Perangkap apa yang Anda temui?
Saya mencoba menilai kelayakan menggunakan ini dalam pengembangan database masa depan.
sql
sql-domain
Oded
sumber
sumber
Jawaban:
Seperti biasa...
Tergantung
Apakah Anda memiliki entitas domain yang digunakan di lebih dari satu tempat yang mendukung secara native akan membutuhkan banyak upaya dan / atau kendala dan perilaku yang berlebihan ?
Jika demikian, lepas domain. Jika tidak, jangan repot-repot.
Saya merasa perlu untuk membuat tipe yang ditentukan pengguna dalam SQL Server tepat sekali, berdasarkan heuristik di atas. Saya bahkan tidak ingat apa itu lagi - tapi itu menyelamatkan lebih banyak pekerjaan daripada yang disebabkannya.
sumber
Sebagai pengguna SQL Server dan C #, saya belum pernah menggunakan Jenis yang Ditentukan Pengguna dalam database, karena saya cukup kuat di sisi aplikasi. Acara setelah ORM seperti LINQ to SQL dan Entity Framework, penggunaan kemampuan server saya telah banyak berkurang.
Sebagai contoh, saya menggunakan integrasi CLR untuk memuat beberapa fungsi konversi DateTime ke SQL Server untuk mentransfer waktu-tanggal Gregorian ke format lain, berdasarkan kekuatan Globalisasi .NET. Tetapi sekarang, segalanya berbeda, dan saya tidak melakukannya lagi. Saya hanya memuat data, dan melakukan transformasi, tepat di lapisan aplikasi saya.
Jadi, setelah hampir 4 tahun pemrograman dan memeriksa semua tim yang dapat saya pikirkan, saya tidak menemukan sampel menggunakan Jenis yang Ditentukan Pengguna. Saya juga belum melihatnya beraksi di banyak blog .NET.
Walaupun ini tidak berarti bahwa orang tidak menggunakan Domain Database , itu pasti berarti bahwa setidaknya menggunakan Domain Database tidak umum.
sumber
Sudah ada jawaban terperinci tentang Stack Overflow. Saya sebagian besar setuju dengan itu, tetapi tidak dengan contoh yang diberikan, saya kutip:
Secara pribadi, saya merasa
char(1)
tipe pengaturan lebih nyaman dan mendefinisikan batasan pada kolom. Ketika kendala dilanggar, saya tahu persis di mana harus mencari untuk menemukan kesalahan saya. Ini juga lebih dikenal daripada tipe yang ditentukan pengguna, sehingga basis data yang hanya menggunakan batasan akan lebih mudah dipahami untuk pemula.Tentu saja, itu hanya pendapat pribadi. Orang lain akan mengatakan bahwa
in ('M', 'F')
kendala bukanlah mendokumentasikan diri sendiri dan mungkin sangat tidak jelas bagi pengembang baru yang menemukan database.IMO, gunakan tipe yang ditentukan pengguna untuk tipe yang lebih rumit, dan kendala untuk sesuatu yang mendasar. Juga, ketika Anda tidak dapat dengan mudah menemukan nama eksplisit untuk suatu jenis, ada kemungkinan kendala akan lebih cocok.
sumber
Saya belum pernah menggunakan fitur ini tetapi saya kira Anda perlu memastikan bahwa:
Jika database Anda digunakan oleh satu sistem, mungkin masuk akal untuk tidak menggunakan fitur ini dan menambahkan logika cek di lapisan bisnis Anda atau yang setara. Itu akan memberi Anda lebih banyak fleksibilitas dalam validasi (katakanlah dalam menggunakan ekspresi reguler) dan akan memungkinkan untuk merangkum semua logika validasi di satu tempat. Jika database Anda dibagikan oleh beberapa sistem, Anda dapat menggunakan pemicu yang cocok untuk tugas ini.
Saya tidak yakin apakah UDT memungkinkan Anda untuk menyesuaikan pesan kesalahan yang dikembalikan ke klien ketika kesalahan validasi ditemukan.
UDT sangat berguna jika aturan validasi yang sama berlaku untuk beberapa kolom. Menurut pendapat saya, saya tidak melihat ini sebagai kasus yang sangat umum dalam aplikasi bisnis dengan desain database yang dinormalisasi.
Anda mungkin tertarik untuk memeriksa "Apa gunanya Tipe yang Ditentukan Pengguna [SQL Server]?"artikel blog.
sumber
Ketika Anda mengatakan "tidak semua database mendukung ini", saya pikir cara yang lebih baik untuk menjelaskannya adalah sebagai berikut:
Setiap basis data utama mendukung ini, karena mendukung pemicu, fungsi, dan fitur lanjutan lainnya secara luas.
Ini membawa kita pada kesimpulan bahwa ini adalah bagian dari SQL canggih dan masuk akal di beberapa titik.
Semakin kecil kemungkinan, karena cakupan yang luas diperlukan (mempertimbangkan operator, indeks, dll.)
Sekali lagi, sebatas mungkin, jika tipe yang ada dikombinasikan dengan sedikit logika tambahan yang didefinisikan (mis. Pemeriksaan, dll.) Dapat melakukan triknya, mengapa harus sejauh itu?
Banyak sekali. Mari kita pertimbangkan untuk satu detik DBMS yang tidak terlalu bagus seperti MySQL, yang saya ambil untuk contoh ini karena satu alasan: kekurangan dukungan yang baik untuk tipe inet (alamat IP).
Sekarang Anda ingin menulis aplikasi yang sebagian besar berfokus pada data IP seperti rentang dan semua itu, dan Anda terjebak dengan tipe default dan fungsionalitasnya yang terbatas, Anda akan menulis fungsi dan operator tambahan (seperti yang didukung secara native di postgreSQL untuk contoh) atau tulis pertanyaan yang jauh lebih kompleks untuk setiap fungsionalitas yang Anda butuhkan.
Ini adalah kasus di mana Anda akan dengan mudah membenarkan waktu yang dihabiskan untuk mendefinisikan fungsi Anda sendiri (inet >> inet di PostgreSQL: range yang terdapat dalam range operator).
Pada saat itu, Anda sudah dibenarkan memperluas dukungan tipe data, hanya ada satu langkah lain untuk mendefinisikan tipe data baru.
Sekarang kembali ke PostgreSQL yang memiliki dukungan tipe yang sangat bagus tapi tidak ada int unsigned .. yang Anda butuhkan, karena Anda benar-benar peduli dengan penyimpanan / kinerja (siapa tahu ...), Anda harus menambahkannya serta operator - meskipun tentu saja ini sebagian besar berasal dari operator int yang ada.
Saya tidak bermain-main dengan itu karena sejauh ini saya belum memiliki proyek yang membutuhkan dan membenarkan waktu yang diperlukan untuk ini.
Masalah terbesar yang dapat saya saksikan adalah menciptakan kembali roda, memperkenalkan bug pada lapisan "aman" (db), dukungan tipe tidak lengkap yang hanya akan Anda sadari beberapa bulan kemudian ketika CONCAT Anda (cast * AS varchar) gagal karena Anda tidak mendefinisikan pemeran (newtype as varchar), dll.
Ada jawaban yang berbicara tentang "tidak umum" dll. Jelas ini adalah dan harus tidak biasa (jika tidak berarti dbm tidak memiliki banyak jenis penting), tetapi di sisi lain, orang harus ingat bahwa (baik) db sesuai dengan ACID ( tidak seperti aplikasi) dan bahwa segala sesuatu yang berkaitan dengan konsistensi lebih baik disimpan di sana.
Ada banyak kasus di mana logika bisnis ditangani di lapisan perangkat lunak dan itu bisa dilakukan dalam SQL, di mana itu lebih aman. Pengembang aplikasi cenderung merasa lebih nyaman dalam lapisan aplikasi dan sering menghindari solusi yang lebih baik diimplementasikan dalam SQL, ini tidak boleh dianggap sebagai praktik yang baik.
UDT dapat menjadi solusi yang baik untuk optimasi, contoh yang baik diberikan dalam jawaban lain tentang tipe m / f menggunakan char (1). Jika itu adalah UDT, maka itu bisa menjadi boolean (kecuali kami ingin menawarkan opsi ketiga dan keempat). Tentu saja kita semua tahu ini bukan optimasi karena overhead kolom, tetapi kemungkinan ada.
sumber
Di atas kertas, UDT adalah konsep yang hebat. Mereka memungkinkan Anda untuk benar-benar menormalkan DB Anda (misalnya ketika Anda memiliki dua kolom yang saling bergantung), dan juga untuk merangkum semua logika yang terkait dengan tipe baru Anda.
Dalam praktiknya, harga yang Anda bayar (hari ini) terlalu tinggi. Jelas ada overhead pengembangan, tetapi selain itu Anda kehilangan dukungan dari berbagai ORM dan alat pelaporan, dan meningkatkan kompleksitas keseluruhan dari solusi ini sedikit. Tidak terlalu banyak pengembang di luar sana yang akrab dengan UDT, dan saya belum pernah melihat UDT yang dikelola digunakan di luar contoh.
Salah satu contoh terbaik dari jenis yang paling baik dilakukan sebagai UDT (jika belum ada) adalah
hierarchyid
( tautan MSDN ). Agar tetap efisien, ia menyimpan nilainya dalam format biner (sebagai lawan dari implementasi kustom varchar yang biasa), yang akan sulit untuk dipertahankan tanpa fungsi tipe itu. 10 atau lebih metode yang disediakan oleh tipe ini juga paling baik disediakan sebagai bagian dari tipe, yang bertentangan dengan fungsi eksternal. Saya akan mempertimbangkan untuk menggunakan UDT yang dikelola khusus dalam kasus-kasus seperti ini - di mana ada keuntungan signifikan yang bisa didapat dengan menyediakan implementasi yang efisien dan rapi sebagai jenis yang terpisah.sumber
Pertanyaan / jawaban yang lebih praktis. Apakah perusahaan Anda mengizinkannya?
Apakah perusahaan Anda bekerja dengan beberapa merek DBSQL yang menangani berbagai DDL?
Setiap merek basis data dapat menawarkan fitur tambahan yang bagus, seperti Jenis yang Ditentukan Pengguna, tetapi, jika perusahaan Anda menggunakan beberapa DB, Anda mungkin mengalami masalah dengan fitur-fitur yang tidak standar.
Jika perusahaan itu satu-satunya Anda, atau Anda dapat memutuskan Database & fitur mana yang akan Anda gunakan, maka Anda dapat menggunakan DDL
Saya telah bekerja dengan beberapa proyek di mana Jenis yang Ditentukan Pengguna dapat berguna, tetapi, saya harus tetap menggunakan fitur yang lebih standar, karena kami harus berurusan dengan beberapa DB. (s).
sumber