SQL server database Design Problem / Herausforderung

Ich habe eine database, die Knoten & nodetype Tabellen hat.

Nodes Tisch

NodeID ParentNodeID NodeTypeID NodeName ... 

NodeType-Tabelle

 NodeTypeID ParentNodeTypeID NodeTypeName ..... 

Beide Tabellen haben eine Beziehung zu sich selbst.

Es gibt verschiedene Arten von Knoten, dh Node Site Building Office

Diese sind hierarchisch, so dass Informationen (Attribute), die angewendet werden, dh Knoten der Art Site, sollte sich zu verbreiten und von seinen Kindern überschreibbar sein.

Was ist der beste path, dies zu erreichen? Oder bin ich auf der search nach viel in SQL und sollte dies in Code behandelt werden?

AKTUALISIEREN

 NodeID ParentNodeID NodeName Address1 Address2 Address3 NodeType NodeTypeID 1 null Top null null MyTown Site 7 2 1 Level1 null HeadOffice MyTown Building 8 3 2 Level2 SalesFloor HeadOffice MyTown Floor 9 

Ich würde folgendes machen

NodeTypes

 NodeTypeId as INT ParentNodeTypeId as INT NodeDescription as VarChar (100) 
  • ParentNodeTypeId bindet an NodeTypeId für eine Selbstverknüpfung

Nodes

 NodeId as INT ParentNodeId as INT NodeTypeId as INT /* This field must be NULLABLE */ NodeDetails as VarChar (100) 
  • ParentNodeId bindet an NodeId für eine Selbstverknüpfung
  • NodeTypeId bindet an NodeTypeId von NodeTypes Tabelle, ist aber Nullable (read on)

Ich hätte eine rekursive function namens GetNodeTypeForNodeId (@NodeId as Integer) , um den Knotentyp herauszufinden. Wenn die aktuelle Zeile eine Nicht-Null-Rückgabe des aktuellen Wertes hat, dann gehen Sie die übergeordnete Knotenkette hoch, bis Sie ein übergeordnetes Element finden, das einen Nicht-Nullwert hat.

Beachten Sie, dass dies bei großen datamengen extrem teuer werden würde. Ich würde vermeiden, die function zu verwenden, bis meine Ergebnismenge vollständig definiert wurde – mit anderen Worten, verwenden Sie Unterabfragen oder CTEs, um die Basisfilterung zu erhalten, und verwenden Sie dann die function, um den NodeType zu erhalten.

Ich würde davon ausgehen, dass die Node-Tabelle auch eine NodeTypeID auf sie hat? Ansonsten denke ich, wie du die data gespeichert hast, ist gut.

Die größte Herausforderung, die Sie ausführen werden, wird herausfinden, was die "effektiven" properties eines Knoten / Knoten-Typs sind durch Abfrage seiner properties, seine Eltern properties, etc. Alles, was mit SQL wäre wahrscheinlich ein Albtraum und ist wahrscheinlich besser links auf den datazugriff oder die Geschäftsschicht Ihrer Anwendung, wo es viel einfacher zu implementieren wäre.

Ich hätte die NodeTypes gehabt, die für den Knoten in der database spezifisch sind und das Roll-up von nodetypes in der Business Layer behandeln. Auf diese Weise, wenn sich etwas auf einem übergeordneten Element ändert, müssen Sie nur 1 datasatz in der database aktualisieren, nicht eine große Zahl (mit allen zugehörigen Unter-Updates, um die Hierarchie zu bohren).