Коли ви говорите "не всі бази даних підтримують це", я вважаю, що кращим способом розміщення є наступний:
Кожна основна база даних підтримує це, оскільки вони широко підтримують тригери, функції та інші розширені функції.
Це підводить нас до висновку, що це частина вдосконаленого SQL і має сенс в якийсь момент.
Do people actually use domains in their database designs?
Менш можливий через необхідне широке охоплення (враховуючи операторів, індекси тощо)
If so to what extent?
Знову ж таки, наскільки це обмежено, якщо існуючий тип у поєднанні з трохи додатково визначеною логікою (тобто чеками тощо) може зробити трюк, навіщо йти так далеко?
How useful are they?
Ціла партія. Розглянемо на одну секунду не дуже гарну СУБД, як MySQL, яку я вибрав для цього прикладу з однієї причини: їй не вистачає хорошої підтримки для типу inet (IP-адреси).
Тепер ви хочете написати програму, яка в основному орієнтована на дані IP, такі як діапазони, і все це, і ви застрягли з типом за замовчуванням та його обмеженою функціональністю, ви будете записувати додаткові функції та оператори (як, наприклад, підтримувані в postgreSQL для приклад) або написати набагато складніші запити для кожної необхідної вам функції.
Це випадок, коли ви легко виправдаєте час, витрачений на визначення власних функцій (inet >> inet в PostgreSQL: діапазон, що міститься в операторі діапазону).
У той момент, ви вже виправдали розширення підтримки типу даних, є ще один крок до визначення нового типу даних.
Тепер повернемося до PostgreSQL, який має справжню підтримку приємного типу, але не підписаний int .. який вам потрібен, тому що ви дійсно стурбовані сховищем / продуктивністю (хто знає ...), тож вам потрібно буде додати його, а також оператори - хоча, звичайно, це в основному походить від існуючих операторів int.
What pitfalls have you encountered?
Я з цим не займаюся, тому що до цього часу у мене не було проекту, який би вимагав і виправдовував час, необхідний для цього.
Найбільші проблеми, які я можу побачити з цим, - це винахід колеса, введення помилок у "безпечний" шар (db), неповна підтримка типу, яку ви зрозумієте лише через місяці, коли ваш CONCAT (cast * AS varchar) вийде з ладу, тому що ви не визначив акторський склад (новий тип як varchar) тощо.
Є відповіді, які говорять про "нечасто" тощо. Безумовно, це є і мають бути рідкісними (інакше це означає, що dbms не має великої кількості важливих типів), але з іншого боку, слід пам'ятати, що (хороший) db сумісний із кислотою ( на відміну від програми) і що все, що стосується консистенції, краще зберігати там.
Є багато випадків, коли бізнес-логіка обробляється на програмному рівні, і це можна зробити в SQL, де це безпечніше. Розробники додатків, як правило, відчувають себе комфортніше в межах додаткового шару і часто уникають кращих рішень, реалізованих у SQL, це не слід розглядати як добру практику.
UDT можуть бути хорошим рішенням для оптимізації, хороший приклад наведено в іншій відповіді про тип m / f за допомогою char (1). Якби це був UDT, він міг би бути булевим (якщо тільки ми не хочемо запропонувати третій та четвертий варіанти). Звичайно, всі ми знаємо, що це насправді не оптимізація через накладні стовпців, але можливість є.