Ich habe eine einzige Tabelle zum Speichern von 'Aufgaben'. Eine Aufgabe kann ein Elternteil und / oder ein Kind sein. Ich verwende die ' ParentID ' als FK, die auf die PK in derselben Tabelle verweist. Es ist NULLABLE. Wenn es also NULL ist, hat es keine übergeordnete Aufgabe.
Beispiel ist der Screenshot unten ...
In meinem Team wurde argumentiert, dass es (für Normalisierung / Best Practices) viel besser wäre, eine separate Tabelle zum Speichern der ParentIDs zu erstellen, um NULL-Werte in der Tabelle zu vermeiden und zu einem besseren Normalisierungsdesign zu führen.
Wäre dies eine bessere Option? Oder wird es schwieriger, Abfragen durchzuführen und Leistungsprobleme zu verursachen?
Wir wollen nur das Design von Anfang an richtig machen, anstatt später Probleme zu finden.
SQL-DDL-Code für die vorhandene Tabelle:
CREATE TABLE [Tasks].[TaskDetail]
(
[TaskDetailID] [int] IDENTITY(1,1) NOT NULL,
[TaskName] [varchar](50) NOT NULL,
[TaskDescription] [varchar](250) NULL,
[IsActive] [bit] NOT NULL CONSTRAINT [DF_TaskDetail_IsActive] DEFAULT ((1)),
[ParentID] [int] NULL,
CONSTRAINT [PK_TaskDetail_TaskDetailID] PRIMARY KEY CLUSTERED ([TaskDetailID] ASC),
CONSTRAINT [FK_TaskDetail_ParentID] FOREIGN KEY([ParentID]) REFERENCES [Tasks].[TaskDetail]([TaskDetailID])
);
Antworten:
Die Technik, die Sie zur Darstellung der Aufgabenhierarchie beschreiben, wird als "Adjazenzliste" bezeichnet. Obwohl es für Menschen am intuitivsten ist, eignet es sich nicht für sehr effiziente Abfragen in SQL. Andere Techniken umfassen Pfadaufzählung (auch als materialisierte Pfade bezeichnet) und verschachtelte Mengen. Um mehr über andere Techniken zu erfahren, lesen Sie diesen Beitrag oder durchsuchen Sie das Internet nach zahlreichen Artikeln zu diesen Techniken.
SQL Server bietet eine native Hierarchiedarstellung für die Pfadaufzählung. Dies ist höchstwahrscheinlich Ihre beste Wahl ...
quelle
Es gibt keine Normalisierungsregel, die Nullwerte verbietet oder das Speichern der Adjazenzliste in einer separaten Tabelle erfordern würde. Beide Ansätze sind üblich, und Ihre Wahl hat keine wesentlichen Auswirkungen auf die Leistung.
Unabhängig vom gewählten Design müssen alle Fremdschlüsselspalten von einem Index unterstützt werden. Sie benötigen also einen Index für ParentID, um ein effizientes Durchlaufen der Hierarchie zu unterstützen.
quelle
Ab SQL Server 2017 und Azure SQL DB können Sie die neuen Diagrammdatenbankfunktionen und die neue MATCH-Klausel verwenden, um diese Art von Beziehung zu modellieren. Schau keine Nullen! Ein Beispielskript:
Meine Ergebnisse:
quelle