Frage

Ich habe ein System, das einen Auftrag und die Reihenfolge erstellt, kann zu einem Hause Konto in Rechnung gestellt werden, schickte Nachnahme (COD) oder auf eine Kreditkarte abgebucht. Ich habe die folgenden Tabellen erstellt:

ORDERS
order_id
billingoption_id

BILLINGOPTIONS
billingoption_id

Ich bin nicht sicher, wie die folgende Tabelle sollte für die Abrechnungsdaten erstellt werden. Soll ich eine separate Tabelle für jede Art von Abrechnungsoption (dh. Nachnahme, Kreditkarten, und Haus-Konto) bauen? Dann würde ich habe eine andere Fremdschlüsselspalte auf der Tabelle Bestellungen, die zu einem Datensatz für die Abrechnungsdaten beziehen würden?

War es hilfreich?

Lösung

Sie können es so oder so tun: eine große Hupen billingoptions Tabelle, die Felder hat, die alle Typen, mit NULL-Werte für die Felder umfasst, die auf einen bestimmten Typ nicht anwendbar sind, oder ein Bündel von Baby-Tabellen, dass „Star off“ eine Mutter billingoptions Tabelle. Beide haben ihre Vor- und Nachteile.

Für die große Hupen Tabelle,

  • Es ist schön, dass alle Daten einfach in einer einzigen Tabelle referenziert werden.
  • Tracking Fremdschlüsselbeziehungen und Durchführung Aktualisierungen oder Einfügungen efficent ist.
  • , aber Sie müssen die Tabellenstruktur verändern, neue Abrechnungsmöglichkeiten in der Zukunft hinzuzufügen, und es gibt die Möglichkeit, ungültiger Kombinationen von Daten (beispielsweise gespeichert werden, sowohl eine Kreditkartentyp und ein COD-Flag im gleichen Datensatz gesetzt werden ).

Für die kleinen Baby-Tabellen,

  • Es ist schön, dass die Daten partitioniert und spiegelt Strukturobjekt Ihres Programms eng.
  • Es ist schön, dass Sie neue Zahlungsoptionen hinzufügen oder bestehende verändern, ohne sich Gedanken über die anderen zu beeinflussen.
  • Die Beziehungen sind sehr explizit. Sie können mit einer anderen Ablagerung nicht versehentlich eine Anzahlung verknüpfen, da der Fremdschlüssel wird verlangen, dass sie mit einer Genehmigung verknüpft werden.
  • ABER Sie viele Tabellen in das Design der Einführung am Ende, die viele Joins benötigen, kann ein Schmerz zu navigieren, und sind nicht so effizient, wenn es um Einsätze und Updates kommt.

Bei der Arbeit, am Ende haben wir gehen mit kleinen Baby-Tabellen auf. Es sieht etwa so aus:

Table Orders:
--> OrderId PK
--> (Lots of Other Fields)

Table Payments:
--> PaymentId PK
--> OrderId (FK) [There may be more than one payment per order]
--> PaymentType [Restricted field contains values like 
       'PAYPAL' or 'CREDIT', you use this to know which 
       baby table to look up that can contain additional 
       information]

Table PaymentsPayPal:
--> PaymentPayPalId PK
--> PaymentId FK points to Table Payments
--> TransactionNo
--> (Other PayPal specific fields)

Table PaymentsCheck:
--> PaymentCheckId PK
--> PaymentId FK points to Table Payments
--> RoutingNo
--> (Other e-check specific fields)

+ other tables for remaining payment types....

Alle diese Zahlungsarten teilen sich drei Transaktion in Zusammenhang stehenden Tabellen:

Table PaymentApprovals:
--> PaymentApprovalId PK
--> PaymentId FK points to Table Payments
--> Status [Some flag meaning 'Succeeded', 'Failed', 'Reversed', etc]
--> ProcessorMessage [Something the service sent back, like '(M) CVV2 Matched']
--> Amount
--> (Other administrative fields)

Table PaymentDeposits:
--> PaymentDepositId PK
--> PaymentApprovalId FK points to Table PaymentApprovals
--> Status
--> ProcessorMessage
--> Amount
--> (Other administrative fields)

Table PaymentRefunds:
--> PaymentRefundId PK
--> PaymentDepositId FK points to Table PaymentDeposits
--> Status
--> ProcessorMessage
--> Amount
--> (Other administrative fields)

Alle unsere Zahlungsmethoden (Kreditkarte, PayPal, Google Checkout, Scheck, Bargeld, Gutschrift und Money Order) abstrahiert in diese Genehmigung passen -> Deposit -> Rückerstattung Metapher, und die UI ruft die gleiche Verfahren auf einer IPayment IPaymentProcessor und Schnittstellen mit verschiedenen Implementierungen (CybersourcePaymentProcessor, PayPalPaymentProcessor, etc). Die Abstraktion ist ziemlich gut in den letzten anderthalb Jahren über diese unterschiedlichen Methoden gearbeitet, wenn auch manchmal die GUI unterschiedlichen Wortschwall an den Benutzer angezeigt wird (zum Beispiel, wird es sagen „Autorisieren“ und „Charge“ anstelle von „Genehmigen“ und „Deposit“ für Kreditkartenzahlungen und der Bildschirm Bargeld für die Eingabe führt das genehmigen / Deposit Schritt auf einen Schlag.)

Ich hoffe, das macht Sinn. Es klingt wie Sie nicht tatsächlich die Zahlungsinformationen zu speichern, aber es ist sinnvoll, darüber nachzudenken, wo diese Dinge am Ende können.

Andere Tipps

Fokus auf die Dinge. Die tatsächliche Dinge. Versuchen Sie, die Dinge zu beschreiben einfach, direkt und in natürlicher Sprache zuerst.

Wenn Sie dann für Design Führung bitten, können Sie Definitionen liefern. In einigen Fällen wird der Akt des Schreibens Definitionen das Design Crystalize machen.

Aufträge sind Dinge. Was sind die Attribute eines Auftrags? Kunden, Produkt, Zahlung / Abrechnungsoptionen.

Abrechnungsoptionen ist (fast) Dinge. Sie können offenbar definieren und identifizieren. (Ich bin nicht sicher, ob ich es könnte. Aus Ihrer Frage, es scheint, dass Sie in der Lage sein könnte. Aber ohne eine Ein-Satz-Zusammenfassung, ich bin nicht sicher, was mit Milliarden-Optionen vor sich geht.

Was ist ein „Abrechnungsdaten?“ Was für eine Art von Ding ist das? Welche Attribute (oder Eigenschaften) hat es?

Wie funktioniert ein „Abrechnungsdaten“ beziehen sich auf einen Auftrag? Wie kommt es zu einer Billing Option beziehen?

Sie können ferner die Frage mit Definitionen für jede Sache zu aktualisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top