"Tüm veritabanları bunu desteklemiyor" derseniz, daha iyi bir şekilde koymanın aşağıdaki gibi olduğunu düşünüyorum:
Tetikleyicileri, işlevleri ve diğer gelişmiş özellikleri kapsamlı bir şekilde destekledikleri için her büyük veritabanı bunu destekler.
Bu bizi bunun gelişmiş SQL'in bir parçası olduğu ve bir noktada mantıklı olduğu sonucuna götürüyor.
Do people actually use domains in their database designs?
Gereken kapsamlı kapsam nedeniyle (operatörler, dizinler vb. Dikkate alındığında) daha az mümkün
If so to what extent?
Yine, olabildiğince sınırlı, mevcut bir tür biraz ek tanımlı mantık (yani kontroller vb.) İle birleştiğinde hile yapabilirse, neden bu kadar ileri gidebiliriz?
How useful are they?
Bir sürü. Bir saniye boyunca bu örnek için bir nedenden dolayı seçtiğim MySQL gibi çok iyi olmayan bir DBMS'yi düşünelim: inet (IP adresi) türü için iyi bir destek yok.
Şimdi çoğunlukla aralıklar gibi IP verilerine odaklanan bir uygulama yazmak istiyorsunuz ve varsayılan tür ve sınırlı işlevselliği ile sıkışmış durumdasınız, ya ek işlevler ve işleçler yazacaksınız (postgreSQL için yerel olarak desteklenenler gibi) örneğin) veya ihtiyacınız olan her işlevsellik için çok daha karmaşık sorgular yazın.
Bu, kendi işlevlerinizi tanımlamak için harcanan zamanı kolayca gerekçelendirebileceğiniz bir durumdur (PostgreSQL'de inet >> inet: aralık operatörünün kapsama alanı).
Bu noktada, genişletilmiş veri türü desteğini haklı gösterdiniz, yeni bir veri türü tanımlamanın yalnızca bir adımı daha var.
Şimdi gerçekten güzel tip desteği olan ancak ihtiyacınız olmayan imzasız int .. olan PostgreSQL'e geri dönün, çünkü depolama / performans (kim bilir ...) hakkında gerçekten endişelisiniz, operatörler - tabii ki bu çoğunlukla mevcut int operatörlerinden türemiştir.
What pitfalls have you encountered?
Şimdiye kadar bununla oynamıyorum, bunun için gereken zamanı hem gerektiren hem de haklı gösteren bir projem yoktu.
Bununla birlikte görebildiğim en büyük sorunlar, tekerleği yeniden icat etmek, "güvenli" katmana (db) hatalar getirmek, sadece aylar sonra CONCAT (cast * AS varchar) başarısız olduğunda fark edeceğiniz eksik tip desteği sunmak olacaktır. oyuncu kadrosu (varchar olarak newtype) tanımlamamıştır.
"Yaygın olmayan" vb. Hakkında cevaplar vardır. Kesinlikle bunlar nadirdir ve nadir olmalıdır (aksi takdirde dbms'in birçok önemli türü olmadığı anlamına gelir), ancak öte yandan, bir (iyi) db'nin ACID uyumlu ( bir uygulamadan farklı olarak) ve tutarlılıkla ilgili her şeyin orada daha iyi tutulması.
İş mantığının yazılım katmanında işlendiği ve daha güvenli olduğu SQL'de yapılabileceği birçok durum vardır. Uygulama geliştiricileri uygulama katmanı içinde daha rahat hissetme eğilimindedir ve genellikle SQL'de uygulanan daha iyi çözümlerden kaçınırlar, bu iyi bir uygulama olarak düşünülmemelidir.
UDT'ler optimizasyon için iyi bir çözüm olabilir, char (1) kullanılarak m / f tipi hakkında başka bir cevapta iyi bir örnek verilir. Bir UDT olsaydı, bunun yerine bir boolean olabilir (üçüncü ve dördüncü seçenekleri sunmak istemedikçe). Tabii ki hepimiz bunun sütun yükü nedeniyle gerçekten bir optimizasyon olmadığını biliyoruz, ancak olasılık var.