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.
Do people actually use domains in their database designs?
Semakin kecil kemungkinan, karena cakupan yang luas diperlukan (mempertimbangkan operator, indeks, dll.)
If so to what extent?
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?
How useful are they?
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.
What pitfalls have you encountered?
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.