Fremdschlüsselverknüpfungen in Tabelle

Stellen Sie sich ein Schema als solches vor.

NOTE TABLE: NoteID, Note, DetailedTaskID, ..... DETAILED TASK TABLE: DetailedTaskID, WorkOrderID, ..... WORKORDER TABLE: WorkOrderID, ProjectID, ..... PROJECT TABLE: ProjectID, ..... 

Jetzt, da ich mit diesem Schema sagen kann, dass ich alle Notizen abrufen möchte, die mit einem bestimmten Projekt verknüpft sind, habe ich eine recht große Anzahl von Joins.

 IE: Note JOIN DetailedTask JOIN WorkOrder JOIN Project 

Also meine Frage ist dies, wenn es (wenn überhaupt) angebracht ist, eine "Shortcut" -Spalte für eine Tabelle (in diesem Fall ProjectID) hinzuzufügen?

Ändern Sie im Grunde die Notiz-Tabelle zu: NoteID, Note, DetailTaskID, ProjectID

Kurze Antwort: Niemals, niemals.

Längere Antwort: Nur wenn:

  1. Sie haben festgestellt, dass die performance der JOINs inakzeptabel ist (was selten der Fall ist).

  2. Sie haben wirklich alle weniger gefährlichen Alternativen ausgeschöpft.

  3. Sie sind bereit, die zusätzliche Arbeit zu absorbieren, die damit verbunden ist, die redundanten, de-normalisierten Informationen synchron zu halten

  4. Sie sind bereit, die Tatsache zu akzeptieren, dass es dann technisch möglich wird, dass Ihre database falsche Ergebnisse zurückgibt, wenn Sie es versäumen, die Synchronisierung aufrechtzuerhalten.

Worüber du sprichst, nennt man eine Fremdschlüsselbeziehung. Es ist die Grundlage für die datanormalisierung . Kurz gesagt, Sie würden Ihrer Notentabelle eine Fremdschlüsselbeziehung (ProjectID) hinzufügen, wenn eine Notiz (dh NoteID) zu einem Projekt gehört.

Die Vorteile dabei sind, dass Sie diese relationalen data wie folgt abfragen können:

 select Note.*, Project.* from Note left join Project on Note.ProjectId = Project.ProjectId 

Diese Abfrage würde alle Notizen und Projektdaten ergeben (wenn sie Teil eines Projekts sind), die damit in Beziehung stehen.