Wann sollten wir beim Modellieren einer Datenbank schwache Entitäten verwenden?


12

Dies ist im Grunde eine Frage, was sind schwache Einheiten? Wann sollten wir sie verwenden? Wie sollen sie modelliert werden?

Was ist der Hauptunterschied zwischen normalen und schwachen Entitäten? Entsprechen schwache Entitäten beim domänengetriebenen Design Wertobjekten?

Um die Frage hier am Laufen zu halten, ist ein Beispiel aus Wikipedia , mit dem die Leute diese Frage beantworten können: Bildbeschreibung hier eingeben

In diesem Beispiel OrderItemwurde es als schwaches Objekt modelliert, aber ich kann nicht verstehen, warum es nicht als normales Objekt modelliert werden kann.
Eine andere Frage ist, was wäre eine normale oder schwache Entität, wenn ich die Bestellhistorie (dh die Änderungen des Status) verfolgen möchte?

Antworten:


10

Formal hat eine "schwache" Entität die folgenden Eigenschaften.

1.  It is existence-dependent on another entity, i.e., 
    it cannot exist without the entity with which it has a relationship.

2.  It inherits at least part of it's primary key from the entity to which 
    it is related. 


    i.e. -> A weak entity's primary key must be a composite key that includes 
       the primary key of the entity on which it is existence-dependent.

Ich würde sagen, dass Sie sich in der Praxis nicht offen dafür entscheiden würden , etwas per se zu einer "schwachen" Einheit zu machen. Stattdessen würden Sie die Daten so strukturieren, dass sie repräsentativ für das sind, was Sie modellieren möchten. Wenn Sie sich danach eine bestimmte Entität ansehen und diese die Merkmale einer "schwachen" Entität aufweist, können Sie sie entsprechend dokumentieren oder grafisch darstellen, wenn Sie aus irgendeinem Grund das Bedürfnis haben, dies ausdrücklich oder aus Gründen der Vollständigkeit zu betonen der Formalität.


hmmm also was ist mit meinem beispiel? hier OrderItemkommt es darauf an, Orderwie kein Gegenstand orderItemsexistieren kann, ohne zu einem zu gehören order, aber ich kann nicht erkennen, warum ich ItemLineNumbereinen Gegenstand nicht ausschließlich identifizieren kann ?! Eigentlich könnte ich einfach ItemLineNumbereine automatische Generierung durchführen int, um die Eindeutigkeit zu gewährleisten, und einen Fremdschlüssel verwenden orderID, um die beiden Entitäten miteinander zu verbinden ?!
Songo

2
Wenn Sie für Ihr OrderItem eine eindeutig identifizierende sequenzielle ID definieren und die OrderId nicht Teil des Schlüssels ist, behandeln Sie OrderItems als Bürger erster Ordnung und haben keine wirklich schwache Entität. Sie können andere Tabellen einzeln zu OrderItems hinzufügen, wenn Sie möchten; Es ist nicht erforderlich, bereits eine OrderId zu haben, um an OrderItems zu gelangen. Wenn Sie dagegen OrderItem mit OrderId und einer für den Auftrag relevanten sequenceId (oder einer ähnlichen) eingeben, ist die Entität schwach, und einzelne Positionen können nur mit der OrderId und der sequenceId referenziert werden. Modellverwendung wie vorgesehen.
Ed Hastings

2
Als tangentialer Kommentar kann es sehr verlockend sein, einfach jeder Tabelle einen eigenen sequentiellen Primärschlüssel zu geben und die Beziehungen mit PK-> FK-Beziehungen für ein einzelnes Feld so einfach wie möglich zu halten. Es eignet sich besonders für einfache Datenbanken und ist leicht nachzuvollziehen. Wenn Sie jedoch komplexere und / oder komplexere Beziehungen modellieren, sind zusammengesetzte Schlüssel sehr nützlich und bieten Ihnen mehr Optionen zum Modellieren von Nuancen.
Ed Hastings

1

Ein OrderItemkann nicht ohne eine Bestellung oder ein Produkt existieren. Daher ist es schwach, da es durch Abhängigkeiten gesteuert wird.

Wenn Sie zum Beispiel die Bestellung entfernen, können Sie nicht wissen, wohin der Artikel versendet werden soll. Oder wenn Sie das Produkt entfernen, wissen Sie nicht, was Sie versenden sollen.


-1

Nach meinem Verständnis in der obigen Abbildung haben sie die zwei Entitäten / Tabellen anstelle von einer, dh Bestellungen und Bestellpositionen, eingeschlossen, so dass der Zugriff auf die Informationen einfacher wird, wenn zwei Entitäten entworfen werden. Die Bestellposition hängt von der Bestellentität ab, sodass sie als schwache Entität betrachtet wird. weil das Merkmal einer schwachen Entität ist, hängt es von einer anderen Entität ab. Angenommen, Sie enthalten keine Bestellartikel-Entität. Wie können Sie den Preis und den Rabatt des Bestellartikels ermitteln? und wie jgauffin sagte Wenn Sie zum Beispiel die Bestellung entfernen, haben Sie keine Möglichkeit zu wissen, wohin der Artikel versendet werden soll. Oder wenn Sie das Produkt entfernen, wissen Sie nicht, was Sie versenden sollen.

Das ER-Diagramm ist entsprechend den Geschäftsanforderungen zu gestalten.


-1

Siehe, eine Bestellung hat viele Bestellpositionen (mehrwertiges Attribut). Daher erstellen wir gemäß der Regel eine separate Tabelle.

Angenommen, 2 Kunden haben die gleiche Bestellung. ZB kaufen beide das iPhone zum gleichen Preis, Rabatt, zum gleichen Datum usw. Idealerweise sollte es also zwei exakte Tupel für die Bestellung des iPhone in Bestellbeziehung geben. Aber gemäß der Einschränkung einer Beziehung sollten alle Tupel eindeutig sein. Lassen Sie uns also bis jetzt zwei Bestellungen mit derselben item_line_number.no Problem in Beziehung setzen. Betrachten Sie nun einen der Kundenstornierungen. Ist das iPhone order.also wird das item_line_number Tupel gelöscht. Jetzt werden auch andere Kunden, die das iPhone gekauft haben, aufgrund von M: 1-Korrespondenz gelöscht. Schließlich ist die Datenbank inkonsistent. Aus diesem Grund verwenden wir einen Deskriptorschlüssel, der orderid lautet. Wenn Sie ein bestelltes iPhone löschen, wird die Datenbank nicht beschädigt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.