Wenn Sie sagen, dass dies nicht von allen Datenbanken unterstützt wird, ist dies meiner Meinung nach besser ausgedrückt:
Jede Hauptdatenbank unterstützt dies, da sie Trigger, Funktionen und andere erweiterte Funktionen ausführlich unterstützt.
Dies bringt uns zu dem Schluss, dass dies Teil von Advanced SQL ist und irgendwann Sinn macht.
Do people actually use domains in their database designs?
Je weniger möglich, da eine umfassende Abdeckung erforderlich ist (unter Berücksichtigung von Operatoren, Indizes usw.)
If so to what extent?
Auch hier gilt: Wenn ein vorhandener Typ in Kombination mit einer kleinen zusätzlichen definierten Logik (dh Prüfungen usw.) den Trick ausführen kann, warum sollte das so weit gehen?
How useful are they?
Eine ganze Menge. Betrachten wir für eine Sekunde ein nicht so gutes DBMS wie MySQL, das ich aus einem Grund für dieses Beispiel ausgewählt habe: Es fehlt eine gute Unterstützung für den Typ inet (IP-Adresse).
Jetzt möchten Sie eine Anwendung schreiben, die sich hauptsächlich auf IP-Daten wie Bereiche und all das konzentriert. Wenn Sie an den Standardtyp und dessen eingeschränkten Funktionen gebunden sind, werden Sie entweder zusätzliche Funktionen und Operatoren schreiben (wie diejenigen, die von Haus aus in postgreSQL für unterstützt werden) Beispiel) oder schreiben Sie viel komplexere Abfragen für jede Funktionalität, die Sie benötigen.
In diesem Fall können Sie den Zeitaufwand für die Definition Ihrer eigenen Funktionen leicht rechtfertigen (inet >> inet in PostgreSQL: Bereich im Bereichsoperator enthalten).
Zu diesem Zeitpunkt haben Sie bereits die Erweiterung der Datentypunterstützung gerechtfertigt. Es gibt nur einen weiteren Schritt, um einen neuen Datentyp zu definieren.
Nun zurück zu PostgreSQL, das sehr gute Typunterstützung bietet, aber kein vorzeichenloses Int .. was Sie brauchen, da Sie sich wirklich Gedanken über Speicher / Leistung machen (wer weiß ...), müssen Sie es auch hinzufügen Operatoren - obwohl dies natürlich hauptsächlich auf bestehende int-Operatoren zurückzuführen ist.
What pitfalls have you encountered?
Ich spiele damit nicht herum, da ich bisher kein Projekt hatte, das die dafür erforderliche Zeit sowohl erforderte als auch rechtfertigte.
Die größten Probleme, die ich dabei sehen kann, sind, das Rad neu zu erfinden, Fehler in der "sicheren" Ebene (db) einzuführen, unvollständige Typunterstützung, die Sie erst Monate später bemerken werden, wenn Ihr CONCAT (cast * AS varchar) ausfällt, weil Sie hat keine Besetzung definiert (newtype als varchar), etc.
Es gibt Antworten, die über "ungewöhnlich" usw. sprechen. Definitiv sind und sollten diese ungewöhnlich sein (andernfalls bedeutet dies, dass dem DBMS viele wichtige Typen fehlen). im Gegensatz zu einer Anwendung) und dass alles, was mit Konsistenz zu tun hat, dort besser aufbewahrt wird.
Es gibt viele Fälle, in denen Geschäftslogik in der Softwareschicht gehandhabt wird, und dies könnte in SQL erfolgen, wo es sicherer ist. App-Entwickler fühlen sich in der Anwendungsschicht in der Regel wohler und vermeiden häufig bessere Lösungen, die in SQL implementiert sind. Dies sollte nicht als bewährte Methode angesehen werden.
UDTs können eine gute Lösung für die Optimierung sein. Ein gutes Beispiel ist in einer anderen Antwort zum m / f-Typ mit char (1) angegeben. Wenn es ein UDT gewesen wäre, könnte es stattdessen ein Boolescher Wert sein (es sei denn, wir möchten die dritte und vierte Option anbieten). Natürlich wissen wir alle, dass dies aufgrund des Spaltenaufwands keine wirkliche Optimierung ist, aber die Möglichkeit besteht.