Frage

Ich bin der Gestaltung dieser Sammlung von Klassen und abstrakte (MustInherit) Klassen ...

Klassendiagramm

Dies ist die Datenbanktabelle, wo ich das alles speichern werde ...

Datenbank-Tabelle

Was die Microsoft SQL Server-Datenbank kennt, das sind alle NULL-Werte zulässt ( "NULL zulassen") Spalten.

Aber wirklich, die auf der Klasse hängt dort gespeichert. LinkNode, HtmlPageNode oder CodePageNode

Regeln könnte wie folgt aussehen ...

Regeln Tabelle

Wie kann ich eine solche Datenintegrität Regeln in meiner Datenbank erzwingen?


UPDATE: In Bezug auf diese Single-Table-Design ...

Ich bin immer noch auf eine endgültige Architektur auf Null zu versuchen.

ich mit vielen kleinen Tischen mit fast Null nullalbe Feldern anfänglich gestartet.
Welches ist das beste Datenbankschema für meine Navigation ist?

Und ich lernte über die LINQ to SQL IsDiscriminator Eigenschaft.
Was ist der beste Weg zu handhaben ein- zu-eins-Beziehungen in SQL?

Aber dann erfuhr ich, dass LINQ to SQL unterstützt nur einzelne Tabelle Vererbung.
Kann eine LINQ to SQL IsDiscriminator Spalte nicht erben?

Jetzt versuche ich es mit einer Sammlung von Klassen und abstrakten Klassen zu behandeln.
Bitte helfen Sie mir mit meinen .NET abstrakten Klassen.

War es hilfreich?

Lösung

Mit CHECK-Einschränkungen auf dem Tisch. Diese ermöglichen es Ihnen, jede Art von Booleschen Logik zu verwenden (auch auf andere Werte in der Tabelle) erlauben / ablehnen die Daten.

Von der Books Online Website:

  

Sie können eine CHECK-Einschränkung mit erstellen   jeder logischer (Boolean) Ausdruck,   TRUE oder FALSE zurückgibt, basierend auf der   logische Operatoren. Für die vorherige   Beispielsweise ist der logische Ausdruck:   Gehalt> = 15000 und Gehalt <= 100000.

Andere Tipps

Es sieht aus wie Sie die Single Table Inheritance Muster versuchen, dies ist ein Muster bedeckt von der Object-Relational Strukturmuster Abschnitt des Buches Patterns of Enterprise Application Architecture .

Ich würde empfehlen, den Class Table Inheritance oder Concrete Table Inheritance Muster, wenn Sie möchten die Datenintegrität über SQL-Tabellen-Constraints erzwingen.

Obwohl es wäre nicht mein erster Vorschlag sein, haben Sie noch Single Table Inheritance verwenden könnten und Durchsetzung nur die Einschränkungen über eine Stored Procedure.

Sie können einige insert / update-Trigger einrichten . Genau prüfen, ob diese Felder null oder notnull , und lehnt insert / update Operation, wenn nötig. Dies ist eine gute Lösung, wenn Sie alle Daten in derselben Tabelle gespeichert werden sollen.

können Sie erstellen auch eine eindeutige Tabelle erstellen für jede Klassen als auch.

Haben Sie eine eindeutige Tabelle für jede Art von Knoten.

Warum nicht einfach die Klasse machen Sie bauen die Datenintegrität für seine eigene Art erzwingen?


Bearbeiten

In diesem Fall können Sie entweder a) verwenden logische Einschränkungen (siehe unten) oder b) gespeicherten Prozeduren Einsätze / Bearbeitungen zu tun (eine gute Idee unabhängig) oder c) wieder, machen nur die Klasse der Datenintegrität erzwingen.

Eine Mischung aus C & B wäre der Verlauf der Ereignisse sein, die ich nehme. Ich würde für Add / Änderungen für jeden Knotentyp einzigartige gespeicherte Prozeduren haben (das heißt Insert_Update_NodeType) sowie die Klasse machen die Datenüberprüfung durchführen, bevor Daten zu speichern.

Persönlich bestehe ich immer auf die Datenintegrität Code setzen auf den Tisch selbst entweder über einen Trigger oder eine Check-Einschränkung. Der Grund dafür ist, dass Sie nicht garantieren können, dass nur die Benutzeroberfläche einfügen aktualisieren oder Datensätze löschen. Ebenso wenig können Sie garantieren, dass jemand keine zweite sp schreibt um die Beschränkungen in der ursprünglichen sp zu erhalten, ohne die tatsächliche Datenintegrität Regeln zu verstehen oder sogar zu schreiben, weil er oder sie keine Kenntnis von der Existenz der sp mit den Regeln. Die Tabellen werden oft von DTS oder SSIS-Paketen, dynamischen Abfragen von der Benutzeroberfläche oder durch Query Analyzer oder das Abfragefenster, oder sogar von geplanten Aufträgen betroffen, den Code ausführen. Wenn Sie nicht die Datenintegrität Code auf Tabellenebene setzen Sie früher oder später Ihre Daten werden nicht Integrität haben.

Es ist wahrscheinlich nicht die Antwort, die Sie hören wollen, aber der beste Weg logische Inkonsistenzen zu vermeiden, Sie wirklich wollen, sehen Sie Datenbank Normalisierung

Stephens ist die beste. Aber wenn Sie müssen, könnten Sie eine Check-Einschränkung der HtmlOrCode Spalte und die anderen Spalten hinzufügen, die sich ändern müssen.

Ich bin nicht mit SQL Server vertraut, aber ich weiß, mit Oracle Sie Einschränkungen angeben, die Sie zu tun, verwenden könnte, was Sie suchen. Ich bin mir ziemlich sicher, dass Sie Einschränkungen in SQL Server definieren können auch though.

EDIT: Ich fand diese link , die eine Menge Informationen, Art der lange kann zu haben scheint, aber ein Lese.

wert sein

Erzwingen von Datenintegrität in Datenbanken Grundsätzlich gibt es vier Haupttypen von Datenintegrität. Einheit, Domain, referentielle und benutzerdefinierte

Entity Integrität gilt auf Zeilenebene; Domain Integrität gilt auf Spaltenebene, auf Integrität und gilt auf Tabellenebene.

  1. Entity Integrität gewährleistet eine Tabelle keine doppelten Zeilen hat und eindeutig identifiziert.

  2. Domain Integrität erfordert, dass ein Satz von Datenwerten fällt in einem bestimmten Bereich (Domäne), um gültig zu sein. Mit anderen Worten definiert Domain Integrität der zulässigen Einträge für eine bestimmte Spalte durch den Datentyp zu beschränken, das Format oder den Bereich der möglichen Werte.

  3. referentielle Integrität befasst sich mit den Beziehungen zwischen Tabellen synchronisiert zu halten.

@Zack: Sie können auch diesen Blog überprüfen, um mehr Details über die Datenintegrität Durchsetzung zu lesen, hier- https://www.bugraptors.com/what-is-data-integrity/

SQL Server nicht weiß nichts über Ihre Klassen. Ich denke, dass Sie dies erzwingen werden müssen durch eine Factory-Klasse verwenden, die Konstrukte / dekonstruiert diese alle für Sie und sorgt dafür, dass Sie die richtigen Werte vorbei sind von der Art abhängig.

Technisch wird dies nicht „Durchsetzung der Regeln in der Datenbank“ aber ich glaube nicht, dass dies in einer einzigen Tabelle durchgeführt werden. Felder entweder akzeptieren nulls oder sie es nicht tun.

könnte eine andere Idee, um SQL-Funktionen und Stored Procedures zu untersuchen, die das gleiche tun. Sie können jedoch kein Feld als NOT NULL für einen Datensatz und NULL für die nächsten erzwingen. Das ist Ihre Business Layer / Fabrik Job.

Haben Sie versucht, NHibernate ? Es ist viel mehr Produkt als Entity Framework gereift. Es ist kostenlos.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top