Was ist das beste Datenbankdesign für diese Situation?

8

Ich arbeite daran, eine Geschäftsanwendung für mein Unternehmen zu erstellen, und habe Probleme, das für eine bestimmte Situation am besten geeignete Datenbankdesign auszuwählen. Angenommen, ich habe die folgenden Entitäten:

Die Genehmigung

  • Ich würde
  • Status
  • ...

ApprovalComment

  • Ich würde
  • ApprovalId
  • Kommentar

Auftrag

  • Ich würde
  • ...

Rechnung

  • Ich würde
  • ...

Es kann offensichtlich mehrere Arten von Genehmigungen und mehrere Objekte geben, für die Genehmigungen erforderlich sind. Welche der folgenden Optionen eignet sich am besten zum Entwerfen der Tabellen:

OPTION 1

Haben Sie eine Genehmigungstabelle mit Null-Fremdschlüsseln:

Zulassungen

  • Id PK
  • Status
  • OrderId FK NULL
  • InvoiceId FK NULL

Genehmigungskommentare

  • Id PK
  • ApprovalId FK
  • Kommentar

In diesem Fall müsste ich für jedes Objekt, das eine Genehmigung benötigt, eine Spalte hinzufügen

OPTION 2

Haben Sie eine übergeordnete Genehmigungstabelle mit gemeinsamen Feldern und eine untergeordnete Tabelle für jedes Objekt, das eine Genehmigung benötigt:

Zulassungen

  • Id PK
  • Status

Genehmigungskommentare

  • Id PK
  • ApprovalId FK
  • Kommentar

OrderApprovals

  • ApprovalId PK FK
  • OrderId FK

InvoiceApprovals

  • ApprovalId PK FK
  • InvoiceId FK

OPTION 3

Haben Sie eine Genehmigungstabelle für jedes Objekt:

OrderApprovals

  • Id PK
  • OrderId FK
  • Status

OrderApprovalComments

  • Id PK
  • OrderApprovalId FK
  • Kommentar

InvoiceApprovals

  • Id PK
  • InvoiceId FK
  • Status

InvoiceApprovalComments

  • Id PK
  • InvoiceApprovalId FK
  • Kommentar

Ich weiß, dass dies alles gültige Lösungen sind, aber ich kann mich nicht entscheiden, welche am besten geeignet ist, um in Zukunft verschiedene Arten von Genehmigungen hinzuzufügen. Irgendwelche Gedanken?

user1384977
quelle

Antworten:

10

Als Faustregel verwende ich, dass es ein schlechtes Datenbankdesign ist, eine Tabelle ändern zu müssen, um eine Codeänderung oder eine neue Funktion aufzunehmen, wenn dies in Zukunft geplant werden kann.

Trotzdem würde ich eine Variante von Option 1 verwenden

Approvals
    Id PK
    ApprovalTypeID FK
    Status


ApprovalComments
    ID PK
    ApprovalId FK
    Comment

ApprovalTypes
    ID PK
    Name

Wenn Sie jetzt neue Objekttypen hinzufügen, für die eine Genehmigung erforderlich ist, müssen Sie nur noch eine Zeile in ApprovalTypes einfügen, anstatt eine Tabelle zu ändern, um eine Spalte hinzuzufügen.

sreimer
quelle
Wohin würde die ID-Beziehung zu einer bestimmten Bestellung / Rechnung in dieser Situation gehen? Angenommen, eine Bestellung erfordert eine "Kreditgenehmigung", daher wäre die Genehmigungsart "Kredit". Wie wird sie jedoch mit der Bestellung (oder einer anderen Entität) verknüpft? Wohin würden zusätzliche Spalten gehen, die nur für eine Kreditgenehmigung spezifisch sind?
user1384977
Das erhöht die Komplexität. Sie könnten eine CreditApprovalDetails-Tabelle haben. Wenn Sie Genehmigungen mit Bestellungen verknüpfen müssen, benötigen Sie eine Join-Tabelle, sofern diese nicht 1: 1 ist. Ohne ein umfassendes Verständnis Ihrer Bewerbung kann ich jedoch keinen informierten Vorschlag machen.
Sreimer
2

Es hängt von der Kardinalität Ihrer Datenbank ab und davon, welche Dinge Sie speichern möchten. Sie können beispielsweise genehmigungskommentar einfach eindeutig machen und eine 1: 1-Beziehung zwischen Genehmigung und Genehmigungskommentar herstellen, sodass Sie die Erstellung einer zusätzlichen Tabelle überspringen ... I. sah es so:

Cardinality:
Approval N ---- 1 Approval_comment.
Approval 1 ----- N Order
Order N ----- 1 Invoice

Geben Sie hier die Bildbeschreibung ein

jcho360
quelle
1

Ich stimme für die erste Alternative. Wenn Sie einem Element die erforderliche Genehmigung hinzufügen, ändern Sie möglicherweise das Verhalten dieser Elemente, sodass das Hinzufügen einer Spalte kein großes Problem darstellt. Außerdem ist dies der beste Weg, um Joins in Abfragen zu verwenden.

Die zweite enthält unbrauchbare zusätzliche Tabellen, die darauf hindeuten können, dass mehr als eine Genehmigung zu einem Element gehört.

Die dritte enthält viele redundante Tabellen und wahrscheinlich redundanten Code, um sie zu verarbeiten.

Matzi
quelle
1

Wenn Sie sich zwischen einer Ihrer drei Optionen entscheiden müssen, ist Option 2 meiner Meinung nach die beste. @sreimer ist richtig, dass das Ändern Ihrer Tabellenstruktur für vorhersehbare Ereignisse auf schlechtes Design hinweist. OrderID und InvoiceID in der Tabelle "Genehmigungen" zu haben, kommt meiner Ansicht nach einer sich wiederholenden Gruppe über Spalten hinweg sehr nahe und verstößt gegen den Geist, wenn nicht den Buchstaben, der ersten normalen Form.

Ich würde in Betracht ziehen, jeder Tabelle, die genehmigt werden muss, eine ApprovalID-Spalte hinzuzufügen. Wenn der Wert null ist, wurde er nicht genehmigt. Wenn dies keine Option ist, denke ich, dass @sreimer das richtige Design hat - einige Klarstellungen könnten helfen, dies zu bestätigen.

mdoyle
quelle
1

Ich würde vorschlagen, dass Sie nur eine Tabelle haben =>

Die Genehmigung

Ich würde

Status

Kommentar

Und haben ApprovalId in inovice oder Order Tabelle gespeichert. Auf diese Weise müssen Sie nicht für jedes Objekt eine Spalte hinzufügen, und es müssen weniger Tabellen verwaltet werden. Und wenn ich zwischen der von Ihnen angegebenen Option wählen muss, gehe ich zu Option 2 und füge den Genehmigungskommentar in die Genehmigungstabelle ein.

techExplorer
quelle
0

Sie könnten so etwas versuchen:

Zulassungen
---------
  ICH WÜRDE
  Status
  Genehmigungsname
  (andere Sachen)

Aufträge
------ ------.
  ICH WÜRDE
  (andere Sachen)

Rechnungen
--------
  ICH WÜRDE
  (andere Sachen)

genehmigte_Objekte
----------------
  ICH WÜRDE
  Approval_id (FK - bezieht sich auf die Genehmigungstabelle)
  genehmigte_Objekt_ID (FK - kann sich auf die ID von Rechnungen, Bestellungen usw. beziehen)
  genehmigte_Objekttyp_ID (FK bezieht sich auf genehmigte_ Objekttypen)

Approved_Object_types
---------------------
  ICH WÜRDE
  Name

Die approved_objectsTabelle zeigt Ihnen, welche Genehmigung zu welchem ​​genehmigten Objekt gehört. Das zugelassene Objekt konnte in sein invoices, orderssonst, oder so etwas. Sie bestimmen anhand welcher Tabelle nachgeschlagen werden soll approved_object_type_id. Dies wird flexibel sein, könnte jedoch die Berichterstattung etwas schwierig machen.

FrustratedWithFormsDesigner
quelle