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?
quelle
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:
quelle
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.
quelle
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.
quelle
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.
quelle
Sie könnten so etwas versuchen:
Die
approved_objects
Tabelle zeigt Ihnen, welche Genehmigung zu welchem genehmigten Objekt gehört. Das zugelassene Objekt konnte in seininvoices
,orders
sonst, oder so etwas. Sie bestimmen anhand welcher Tabelle nachgeschlagen werden sollapproved_object_type_id
. Dies wird flexibel sein, könnte jedoch die Berichterstattung etwas schwierig machen.quelle