Frage

Okay, also eine Tabelle Ich mache jetzt für "Box Items".

Nun wird eine Box Item, je nachdem, was es / den Status des Elements für verwendet werden wird, kann zu einer „Versand“ Box oder ein „Returns“ boxt am Ende wird.

Ein Box Artikel defekt sein: wenn es ist, wird ein Flag in der Zeile (IsDefective) Schatulle des Artikels eingestellt wird, und die Box Einzelteil wird in einer „Returns“ Box gestellt werden (mit anderen Gegenständen zu, dass zu zurück Verkäufer). Andernfalls werden die Box Artikel schließlich in eine „Versand“ Box gestellt werden (mit anderen Einzelteilen versandt werden). (Beachten Sie, dass Versandboxen haben ihre eigenen Tabellen: es gibt nicht eine gemeinsame Tabelle für alle Boxen ... aber vielleicht sollte ich als dritte Möglichkeit zu tun, dass, wenn möglich berücksichtigen)

Vielleicht heute Ich denke nur nicht klar, aber ich begann in Frage zu stellen, was in dieser Situation getan werden sollte.

Mein Bauch sagt mir, dass ich ein eigenes Feld für jede mögliche Beziehung haben sollte, selbst wenn nur eine der Beziehungen kann zu einem bestimmten Zeitpunkt geschehen, die das Schema für Box Artikel aussehen würden:

BoxItemID Beschreibung Defekt ShippingBoxID ReturnBoxID etc ...

Dies würde die Beziehungen deutlich machen, aber es scheint verschwenderisch (da nur eine der Beziehungen wird jederzeit verwendet werden). Also dachte ich, ich nur ein Feld für die BoxID haben könnte, und bestimmen, welche BoxID es mit Bezug auf (a Versand oder eine Rückgabe Box ID) basierend auf dem IsDefective Feld:

BoxItemID Beschreibung Defekt BoxID etc ...

Dies scheint weniger verschwenderisch, aber sitzt nicht richtig bei mir. Die Beziehung ist nicht offensichtlich.

Also, ich habe es Ihnen, Datenbank-Gurus von Stackoverflow. Was würden Sie in dieser Situation tun?

EDIT: Vielen Dank an alle für Ihre Eingabe! Es hat mir viel gegeben, um darüber nachzudenken. Zum einen werde ich ein ORM nächstes Mal, wenn ich ein Projekt wie diese beginnen zu verwenden. =) Für zwei, da ich jetzt gerade nicht bin, ich werde die vier Bytes beißen und zwei Felder verwenden.

Danke an alle wieder!

War es hilfreich?

Lösung

Ich bin mit Psychotic Venom und mattlant.

Möchten Sie die polymorphe Route (mit welcher Tabelle Ihre Fremdschlüssel Punkte herauszufinden, basierend auf dem Inhalt eines anderen Feldes) wird ein Schmerz sein. Codierung der Beschränkungen für die vielleicht hart (ich bin nicht sicher, die meisten Datenbanken, die nativ unterstützen würde, ich glaube, Sie würden einen Trigger verwenden).

Sie Gegenstände immer zwischen den Tischen bewegen? Das Festhalten an zwei Tabellen mit identischen Definitionen, wo man ist für Retouren und ist für den Versand der einfachste Weg sein kann. Wenn Sie mit der Definition haften möchten Sie zunächst (mit den beiden getrennten Feldern) vorgeschlagen wird, ist durchaus sinnvoll.

„Vorzeitige Optimierung ist die Wurzel aller Übel“ und so weiter. Während es verschwenderisch scheint, denken Sie daran, was Sie speichern. Da sie IDs sind, sind sie wahrscheinlich nur ganze Zahlen, vielleicht 4 Bytes. Wasting vier Bytes pro Datensatz ist im Grunde nichts. In der Tat, wegen der Polsterung, die Dinge auf geraden Adressen oder andere solche Dinge kann „frei“ sein, dass zusätzliches Feld zu setzen dort. Es hängt alles von dem DB-Design.

Es sei denn, Sie haben einen sehr guten Grund, die polymorphe Weg zu gehen (wie Sie auf einem Embedded-System mit wenig Speicher sind, oder Sie haben über einige wirklich langsam 9600 bps Link zu replizieren) wird es wahrscheinlich nicht die Kopfschmerzen wert sein können Sie am Ende mit. Mit all den besonderen Fällen in Ihre Abfragen schreiben kann nerven.

Schnell Beispiel: eine Verknüpfung zwischen zwei Tabellen zu tun, wo, wenn Sie wollen, ist zu verbinden, basierend auf, wenn der isDefective-Flag gesetzt ist wird ein Schmerz sein. nur einen der beiden Spalten verwenden zu können, allein ist wahrscheinlich genug von einem Aufwand kann man, zumindest für mich speichern.

Andere Tipps

Ich würde eine einzige Tabelle für die Boxen zu machen und der Box-Typ eine Spalte der Box-Tabelle sein. Dies würde die Beziehungen vereinfachen und machen es einfach, nach wie vor für Box-Typ abzufragen. Also das Feldelement hat nur einen Fremdschlüssel für die BoxID.

Ich würde verwenden, was Hibernate nennt Table- Box, ShippingBox und ReturnBox: pro-Unterklasse , so würde mein DB mit 3 Tischen für Kästen aufzuwickeln. Die FK in BoxItem weisen darauf Box.

Was Sie sprechen ist polymorph Beziehungen. Eine einzige ID, die mehrere andere Tabellen verweisen kann. Es gibt mehrere Frameworks, die dies unterstützen, jedoch ist es (potentiell) schlecht für die Integrität der Datenbank (das eine ganz andere Diskussion sein könnte, ob Ihre Datenbank oder Ihre Anwendung sollte die referentielle Integrität beizubehalten).

Was ist das?

BoxItem:
BoxItemID, Description, IsDefective

Box:
BoxID, Description

BoxItemMap:
BoxID, BoxItemID, BoxItemType

Dann können Sie BoxItemType eine Aufzählung sein, oder eine ganze Zahl in dem Sie Konstanten in Ihrer Anwendung als „Return“ oder „Versand“ als Art der Box definieren.

Agree über die polymorphe Diskussion über, obwohl es Potenzial schlecht verwendet werden muss, ist es immer noch eine praktikable Lösung ist.

Im Grunde haben Sie eine Basistabelle namens Box. Dann haben Sie zwei weitere Tabellen, Versandkarton und Rückkehr-Box. Die beiden fügen Sie keine zusätzlichen Felder, die sie speziell sind. sie sind im Zusammenhang mit einer 1 zur Box: 1 FK.Boz Basistabelle hat die gemeinsamen Felder aller Boxtypen

.

Sie beziehen sich BoxItem mit der Box-Tabelle. Die Art und Weisen Sie den richtigen Box-Typen erhalten ist, indem eine Abfrage zu tun, dass das Kind Feld mit der Root-Box auf dem Schlüssel basierte verbindet. Der Datensatz, der sowohl im Basisfeld hat und die Kind-Box ist von dieser Art.

Sie müssen nur vorsichtig wie erwähnt sein, dass, wenn Sie einen Box-Typen erstellen, dass es richtig gemacht wird. Aber das ist, was Tests ist für. Der Code hinzufügen sie nur ot einmal geschrieben werden muss. Oder ein ORM verwenden.

Fast alle Unterstützung des ORM dieser Strategie.

ich mit nur einem einzigen BoxItems Tisch mit IsDefective, ShippingBoxID, den Versand-box-verwandten Bereichen, ReturnBoxID und den Return-Box relevanten Bereichen gehen würde. Einige Felder werden immer für jeden Datensatz NULL sein.

Dies ist ein sehr einfaches und selbstverständlich Design, das der nächste Entwickler unwahrscheinlich ist, zu verwechseln mit. In der Theorie ist dieser Entwurf wegen der garantierten leeren Felder für jede Zeile ineffizient. In der Praxis neigen Datenbanken für jede Zeile eine minimal erforderliche Speichergröße zu haben, wie auch immer, so (es sei denn, die Anzahl der Felder sehr groß ist) dieser Entwurf so effizient wie möglich ist, wie auch immer, und viel einfacher zu codieren.

Ich würde wahrscheinlich gehen mit:

BoxTable:
box_id, box_descrip, box_status_id ...
     1, Lovely Box, 1
     2, Borked box, 2
     3, Ugly Box, 3
     4, Flammable Box, 4

       BoxStatus:
       box_status_id, box_status_name, box_type_id, ....
                   1,Shippable, 1
                   2,Return, 2
                   3,Ugly, 2
                   4,Dangerous,3

                BoxType:
                box_type_id, box_type_name, ...
                          1, Shipping box, ...
                          2, Return box, ....
                          3, Hazmat box, ...

So ist der Box-Status definiert die Box-Typ, und es ist flexibel, wenn Sie in ein paar Statusebenen oder Boxtypen später erweitern müssen.

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