Zu Domain oder nicht zu Domain

15

Die SQL92- und SQL99-Standards definieren DDL- Konstrukte. Dies wird nicht von allen Datenbanken unterstützt oder sie haben einen anderen Namen (SQL Server verfügt beispielsweise über benutzerdefinierte Typen ).CREATE DOMAIN

Diese ermöglichen es, einen eingeschränkten Datentyp zu definieren, der in ihrer Datenbank verwendet werden soll, um Regeln zu vereinfachen und durchzusetzen, die sich auf die zulässigen Werte beziehen. Ein solcher Datentyp könnte in Spaltendeklarationen, in Eingaben und Ausgaben für gespeicherte Prozeduren und Funktionen usw. verwendet werden.

Ich würde gerne wissen:

  • Verwenden die Benutzer Domänen in ihren Datenbankentwürfen?
  • Wenn ja in welchem ​​Umfang?
  • Wie nützlich sind sie?
  • Welche Fallstricke sind Ihnen begegnet?

Ich versuche, die Realisierbarkeit der Verwendung dieser in der zukünftigen Datenbankentwicklung zu bewerten.

Oded
quelle
1
Das würde ich auch gerne wissen ... Ich bin interessiert zu hören, was die Leute zu sagen haben.
maple_shaft

Antworten:

2

Wie gewöhnlich...

Es hängt davon ab, ob

Haben Sie eine Domain-Entität, die an mehr als einem Ort verwendet wird und deren Unterstützung ansonsten erheblichen Aufwand und / oder redundante Einschränkungen und Verhaltensweisen erfordert ?

Wenn ja, Domain entfernt. Wenn nicht, kümmere dich nicht darum.

Ich fand es notwendig, einen benutzerdefinierten Typ in SQL Server genau einmal zu erstellen, basierend auf der obigen Heuristik. Ich erinnere mich nicht einmal mehr, was es war - aber es sparte mehr Arbeit, als es verursachte.

Steven A. Lowe
quelle
5

Als Benutzer von SQL Server und C # habe ich in der Datenbank keine benutzerdefinierten Typen verwendet, da ich auf der Anwendungsseite ziemlich mächtiger bin. Nach ORMs wie LINQ to SQL und Entity Framework hat sich mein Einsatz von Serverfunktionen erheblich verringert.

Ich habe zum Beispiel die CLR-Integration verwendet, um einige DateTime-Konvertierungsfunktionen in SQL Server zu laden und gregorianische Datumsangaben in andere Formate zu übertragen, basierend auf der Globalisierungsstärke von .NET. Aber jetzt sind die Dinge anders, und das mache ich nicht mehr. Ich lade einfach die Daten und mache die Transformation direkt in meiner Anwendungsebene.

Nach fast vier Jahren Programmier- und Inspektionszeit für alle Teams, die mir in den Sinn kommen, habe ich kein Beispiel für die Verwendung von benutzerdefinierten Typen gefunden. Ich habe es auch in vielen .NET-Blogs nicht in Aktion gesehen.

Dies bedeutet zwar nicht, dass Benutzer keine Datenbankdomäne verwenden , aber es bedeutet sicherlich, dass zumindest die Verwendung der Datenbankdomäne nicht so häufig ist.

Saeed Neamati
quelle
"Ich habe keine benutzerdefinierten Typen in der Datenbank verwendet, da ich auf der Anwendungsseite viel leistungsfähiger bin" : Verwenden Sie stattdessen Einschränkungen? Ich verstehe nicht, wie unterscheidet es sich vom Anwendungsgesichtspunkt?
Arseni Mourzenko
@MainMa, zum Beispiel, ich erstelle keine Student- Klasse in der Datenbankebene. Ich erstelle einfach eine Schülertabelle mit allen primitiven Datentypen wie Integer und String und ordne dann mit ORM einen beliebigen Datensatz einem Objekt in der Anwendung zu.
Saeed Neamati
Verstanden. Du hast recht.
Arseni Mourzenko
3

Auf Stack Overflow gibt es bereits eine ausführliche Antwort . Ich stimme dem größtenteils zu, aber nicht dem angegebenen Beispiel, ich zitiere:

"Zum Beispiel definiere ich einen" GenderType "(char (1), nicht nullable, mit" M "oder" F "), der sicherstellt, dass nur die entsprechenden Daten im Feld" Geschlecht "zulässig sind."

Persönlich fühle ich mich wohler, wenn ich den char(1)Typ festlege und eine Einschränkung für die Spalte definiere. Wenn die Bedingung verletzt wird, weiß ich genau, wo ich suchen muss, um herauszufinden, was ich falsch gemacht habe. Es ist auch bekannter als benutzerdefinierte Typen, so dass die Datenbank, die nur Einschränkungen verwendet, für einen Anfänger leichter zu verstehen ist.

Natürlich ist nur eine persönliche Meinung. Andere Leute würden sagen, dass eine in ('M', 'F')Einschränkung nicht selbstdokumentierend ist und für einen neuen Entwickler, der die Datenbank entdeckt, sehr undurchsichtig sein kann.

IMO: Verwenden Sie benutzerdefinierte Typen für kompliziertere Typen und Einschränkungen für etwas Grundlegendes. Wenn Sie einen expliziten Namen für einen Typ nicht leicht finden können, besteht die Möglichkeit, dass eine Einschränkung besser passt.

Arseni Mourzenko
quelle
Was ist mit Hermaphroditen?
Wyatt Barnett
Oder intersexuell? Oder Transpeople?
Broam
1

Ich habe diese Funktion selbst nicht verwendet, aber ich denke, Sie müssen Folgendes sicherstellen:

  1. Wenn Ihre Datenbank von einem einzelnen System verwendet wird, ist es möglicherweise sinnvoll, diese Funktion nicht zu verwenden und die Prüflogik in Ihrer Business-Schicht oder einer entsprechenden Ebene hinzuzufügen. Dies gibt Ihnen mehr Flexibilität bei der Validierung (z. B. bei der Verwendung regulärer Ausdrücke) und ermöglicht es, die gesamte Validierungslogik an einem Ort zu kapseln. Wenn Ihre Datenbank von mehreren Systemen gemeinsam genutzt wird, können Sie stattdessen Trigger verwenden, die für diese Aufgabe gut geeignet sind.

  2. Ich bin nicht sicher, ob Sie mit UDT die Fehlermeldungen anpassen können, die beim Auftreten eines Überprüfungsfehlers an den Client zurückgegeben werden.

  3. UDTs sind sehr nützlich, wenn dieselbe Validierungsregel für mehrere Spalten gilt. Meiner Meinung nach ist dies in Geschäftsanwendungen mit normalisiertem Datenbankdesign kein alltäglicher Fall.

Möglicherweise möchten Sie die Option "Was ist der Sinn von benutzerdefinierten [SQL Server] -Typen?" Blog-Artikel.

Keine Chance
quelle
1
+1 für den dritten Punkt. Es ist nicht empfehlenswert, immer wieder dieselbe Einschränkung wie ich zu schreiben, insbesondere dann, wenn sich die Einschränkung im Laufe der Zeit ändern kann und an mehreren Stellen geändert werden muss.
Arseni Mourzenko
0

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.

Morg.
quelle
Die spezifische Funktion (DOMAINs) wird nicht von allen Datenbanken unterstützt. Ja, mit Triggern, Einschränkungen und Funktionen können Sie es emulieren , aber das macht es nicht zu einer unterstützten Funktion.
Oded
Alle wichtigen Datenbanken unterstützen dies, da sie Trigger, Funktionen und andere erweiterte Funktionen umfassend unterstützen. Einige wirklich lichtstarke / beschissene tun dies nicht, und niemand, der sie benutzt, kümmert sich darum, da ihre Einschränkungen weit über die benutzerspezifischen Typen
hinausgehen
0

Auf dem Papier sind UDTs ein großartiges Konzept. Sie ermöglichen es Ihnen, Ihre Datenbank wirklich zu normalisieren (z. B. wenn Sie zwei voneinander abhängige Spalten haben) und auch jede Logik zu kapseln, die mit Ihrem neuen Typ zusammenhängt.

In der Praxis ist der Preis, den Sie (heute) zahlen, zu hoch. Natürlich entsteht Entwicklungsaufwand, aber abgesehen davon verlieren Sie die Unterstützung durch eine Vielzahl von ORM- und Berichterstellungstools und erhöhen die Gesamtkomplexität der Lösung erheblich. Es gibt nicht allzu viele Entwickler, die mit UDTs vertraut sind, und ich habe noch nie gemanagte UDTs gesehen, die außerhalb von Beispielen verwendet wurden.

Eines der besten Beispiele für einen Typ, der sich am besten als UDT eignet (falls es ihn noch nicht gibt), wäre hierarchyid( MSDN-Link ). Um effizient zu bleiben, speichert es seinen Wert in einem Binärformat (im Gegensatz zu den üblichen benutzerdefinierten varchar-Implementierungen), dessen Pflege ohne die Funktionen des Typs umständlich wäre. Die ungefähr 10 Methoden, die der Typ bereitstellt, werden im Gegensatz zu externen Funktionen am besten als Teil des Typs bereitgestellt. Ich würde die Verwendung von benutzerdefiniertem verwaltetem UDT in solchen Fällen in Betracht ziehen - wo es einen erheblichen Gewinn gibt, wenn eine effiziente und saubere Implementierung als separater Typ bereitgestellt wird.

Daniel B
quelle
0

Eine praktischere Frage / Antwort. Erlaubt Ihr Unternehmen die Nutzung?

Arbeiten Sie mit mehreren DBSQL-Marken zusammen, die unterschiedliche DDLs verarbeiten?

Jede Datenbankmarke bietet möglicherweise gute zusätzliche Funktionen, z. B. benutzerdefinierte Typen. Wenn Ihr Unternehmen jedoch mehrere Datenbanken verwendet, können Probleme mit den nicht standardmäßigen Funktionen auftreten.

Wenn das Unternehmen nur Sie ist oder Sie entscheiden können, welche Datenbanken und Funktionen Sie verwenden möchten, können Sie DDL verwenden

Ich habe mit mehreren Projekten gearbeitet, in denen ein benutzerdefinierter Typ nützlich sein könnte, aber ich sollte mich an mehr Standardfunktionen halten, da wir uns mit mehreren DBs befassen mussten. (s).

umlcat
quelle