2016-10-23 4 views
1

ich die 5 Arten untersucht haben, die hereWie eine Tabellenhierarchie für Aufträge mit verschiedenen Produkten entwerfen Parameter

ich immer noch Probleme erwähnt wurden eine bin zu finden in eine neue DB-Design zu implementieren Ich schaffe. Jeder der erwähnten Wege hat seine Vor- und Nachteile und die Nachteile waren nicht für meine Bedürfnisse geeignet.

Ich werde kurz erklären, was ich brauche. Mein Unternehmen hat Abteilungen und jede Abteilung hat Kategorien (ich Listing nur ein paar für ein Beispiel):

  1. Videobearbeitung (VE) cat 1: Veranstaltungen Katze 2: Clips cat 3: Produktion

  2. Graphic Design (GD) cat 1: Digital Alben cat 2: Fotomanipulation cat 3: Foto-Retusche

Wie Sie sehen können, jedes Produkt hat ganz andere Attribute.

Ab sofort habe ich eine Excel-Datei für jede Abteilung, wo jede Datei Registerkarten für alle Clients hat (weshalb ich eine DB mache).

Auf meiner Website hat jetzt jede Kategorie ein Bestellformular, das für die Attribute in dieser Kategorie entwickelt wurde. Ich habe Probleme, dies in eine ORDERS-Tabellenhierarchie zu implementieren.

Wie Sie in meinem Screenshot sehen können (ignorieren Sie die Namensgebung ... Ich habe "Attribute" verwendet, damit Sie sehen können, was es ist. Ich werde das kurz in "att" ändern. Ich auch nur einige grundlegende Spalten zum Testen erstellt) Die vier richtigen Tabellen sehen aus, wie die ORDER FORMS heute aussehen, wenn Kunden Produkte aus diesen Kategorien bestellen. Also, wenn Sie darüber nachdenken, sollten sie eine One-to-One-Beziehung mit der Tabelle ORDER_DETAIL sein (wie ich zu einem von ihnen in dem Screenshot), weil Sie nur eine Reihe von diesen in einer Bestellung haben können. Aber ein Problem, das ich dachte, ist, dass der Name "order_detailsID" nicht übereinstimmt und ich habe gelernt, dass Relation Keys die gleichen Namen haben sollten ... und ich kann die PK's "order_detailsID" der Attributtabelle nicht nennen, weil das nicht was ist es ist ... es sind Attribute.

Vielleicht sind meine ORDERS und ORDERS_DETAILS falsch ... Ich weiß es nicht. Ich brauche Hilfe, um herauszufinden, wie Kunden in die Lage versetzt werden, ein Produkt zu bestellen, und darauf basierend, um die entsprechende Attributtabelle zum Ausfüllen einer Zeile zu erhalten.

(und natürlich der FK „order_detailsID“ Feld in den att-Tabellen werden nicht verwendet, da ich nicht wusste, ob ich sie benötigen.)

Was würden Sie vorschlagen?

Klicken Sie auf HERE für große Originalqualität von Screenshot.

enter image description here

Antwort

1

So in vier Tabellen

Video_clips_att 
Video_events_attributes 
GD_album_attributes 
GD_manipulation_att 

Sie Fremdschlüssel auf Order_Details OR auf Bestellungen haben.

Dies hängt davon ab, ob Sie jedes Attribut mit einem bestimmten Produkt über Order_details oder nur mit einer bestimmten Bestellung in Orders verbinden möchten.

Eine Abfrage wie

SELECT Video_clips_att.* FROM Video_clips_att INNER JOIN Order_details ON Video_clips_att.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…'; 
SELECT Video_events_attributes.* FROM Video_events_attributes INNER JOIN Order_details ON Video_events_attributes.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…'; 
SELECT GD_album_attributes.* FROM GD_album_attributes INNER JOIN Order_details ON GD_album_attributes.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…'; 
SELECT GD_manipulation_att.* FROM GD_manipulation_att INNER JOIN Order_details ON GD_manipulation_att.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…'; 

Werden Sie die vier Sammlungen zurückkehren, von jedem dieser Datensätze, zu einer bestimmten Reihenfolge gehört.

Nun, wenn Sie diese Daten in Ihrer Anwendung verwenden, können Sie wie folgt tun:

public class IOrder { 
    public ICollection<IOrderAttributes> OrderAttributes; 
} 

public class Order : IOrder { 
    public ICollection<VideoClipAttributes> GetAllVideoClipAttributes { 
     return OrderAttributes.Where(x => typeof(x) == typeof(VideoClipAttributes)).Select(x => (VideoClipAttributes)x); 
    } 
} 

public class OrderAttributes : IOrderAttributes { 
    //work and stuff 
} 

public class VideoClipAttributes : OrderAttributes 
{ 
    //more work and stuff 
} 

gut, erhalten Sie die Idee.

Es wird nicht zu viel Arbeit sein, um Daten aus all diesen vier Tabellen zu sammeln und sie in vier verschiedene Typen zu setzen, die vom selben Typ erben und sie dann alle in eine nette Sammlung einfügen, die einigermaßen getrennt und abstrahiert ist. Und wenn Sie jedes Attributobjekt durch sein jeweiliges Produkt identifizieren möchten, sollten Sie den Fremdschlüssel order_detailsID in Ihren Attributtabellen verwenden.

Dies funktioniert, weil die Tabelle order_details keinen Fremdschlüssel zurück in die Attributtabelle haben muss, so dass Sie keinen künstlichen Layer-Overtop benötigen, um diese Beziehung zu pflegen.

EDIT 2016.10.24:

Da Sie eine eine Bestellung aufgeben möchten eine Beziehung Attribute, wäre eine vernünftige Lösung, Ihre vier Tabellen in eine verschmelzen:

Order_attributes{ 
    attributesID 
    orderID 
    video_clips_typeID 
    employeeID 
    video_clip_statusID 
    title 
    date 
    languageID 
    song_choiceID 
    video_event_typeID 
    video_event_statusID 
    unique_name 
    bride_name 
    groom_name 
    other_name 
    album_typeID 
    GD_album_statusID 
    need_names 
    spreads 
    size_w_mm 
    size_h_mm 
    has_cover 
    cover_size_w_mm 
    cover_size_h_mm 
    raw_image_amount 
    GD_manipulation_detailID 
    GD_manipulation_statusID 
    attributes_type 
} 

Dann Ihre Bestellung ein Mitglied wie so haben kann:

public class IOrder { 
    IOrderAttributes attributes 
} 

Um eine Schnittstelle mit Ihrer Datenbank können Sie eine Klasse wie OrderAttributes haben Store, die das Schema der Reihenfolge genau Attribute Tabelle repliziert, aber wenn man die einzelne Instanz Ihrer Bestellung konstruieren, können Sie einen Schalter wie das tun:

switch (OrderAttributesStore.AttributesType){ 
    case 0: 
     return new VideoClipsAttributes(){property=value,...}; 
    Case 1: 
     ... 
} 

Das ist, wie das Ding funktioniert: https://dotnetfiddle.net/Glyhj2

Sie können weiter gehen und den Prozess weiter straffen, aber das ist die allgemeine Idee.

Dann können Sie einen Fremdschlüssel in Orders für Order_attributes hinzufügen und einzigartig machen.

+1

[quote] "Dies wird funktionieren, da die Tabelle order_details keinen Fremdschlüssel zurück in die Attributtabelle haben muss, so dass Sie keinen künstlichen Überhang benötigen, um diese Beziehung aufrechtzuerhalten." [/ quote] Aber ich möchte nicht, dass der Benutzer in der Lage ist, mehrere Attribute in einer Reihenfolge zu bestellen ... also ist es richtig zu sagen, dass dies eine Eins-zu-Eins-Beziehung sein kann (und sollte)?(zwischen den Bestelldetails und -attributen) Vielen Dank für die ausführliche Antwort –

+1

@ZviTwersky - Für eine Bestellung zu einem Attribut können Sie keine eindeutige Einschränkung für mehrere Tabellen erzwingen. Da Sie eine Details-zu-Reihenfolge-Beziehung wünschen, wäre es sinnvoller, die Bestell-ID in Ihren Attributen mit einem Fremdschlüssel zu versehen. Sie können eine Auslöseprozedur verwenden, um sicherzustellen, dass der Eintrag, den Sie einfügen/aktualisieren, in anderen Attributtabellen nicht vorhanden ist. Alternativ können Sie die vier Tabellen zu einer zusammenführen, dann eine Spalte verwenden, um einen der vier benötigten Typen zu identifizieren, und die Daten an den entsprechenden Typ in Ihrer Anwendung übergeben. – Nomenator

Verwandte Themen