Il modo migliore per modellare "Composite Skus"?

0

Ho un record SKU che tiene traccia delle materie prime utilizzate, dei prezzi, dei costi, ecc. Un esempio di SKU sii un Hamburger (1 panino, 1 patty, 1 oz ketchup, costa $ 11, costa $ 4, ecc.)

Ho bisogno di aggiungere il concetto di SKU compositi ora, come Burger and Fries Meal, che avrebbe un SKU Hamburger e SKU Fries, oltre a confezioni speciali per il pacchetto Pasto. È improbabile che il numero di sottovoci aumenti di più di 5 al massimo.

Ho bisogno di modellarlo nel mio DB e nella mia applicazione. L'utente non si preoccupa se uno SKU è composto o meno, eccetto quando sta facendo effettivamente l'installazione iniziale e sta componendo in cosa consiste una SKU composita.

Ecco una cosa che ho considerato:

Opzione 1: Ho preso in considerazione l'idea di fornire a SKU una SKU principale opzionale. Quindi il numero di voci secondarie è scalabile (da 1 a molti), e l'uso dell'oggetto SKU nel mio codice applicativo rimarrebbe in gran parte lo stesso (specialmente nella parte dell'applicazione utente), come continuerei a utilizzare SKU. Una truffa è perché uno SKU sarebbe denotato come avente un genitore, quindi avrei bisogno di creare gli SKU di Hamburger per la vendita indipendente, per i pasti di hamburger e patatine fritte, per i pasti all'anello di hamburger e cipolle, ecc. prospettiva di mantenimento delle scorte.

Opzione 2: Fornire gli articoli secondari facoltativi SKU SKU.SubSku1, SKU.SubSku2, ecc. (Da 1 a N). I pro di questo sono che ancora una volta mi permette di cambiare molto poco del mio codice rivolto all'utente. Permetterebbe ad un hamburger di apparire in più di uno SKU composito, oltre che in versione standalone. Sostenere l'aggiunta di sotto-elementi nell'interfaccia utente esistente sarebbe molto più semplice anche in questo modo. Questo non richiede una tabella di join. Il cono è che supportava un aumento nel numero di sotto-elementi richiederebbe un cambio di schema.

Opzione 3: Sostanzialmente uguale a 2, ma usando una tabella Join (molti a molti). Questo scalerebbe meglio, ma non sono sicuro che il ridimensionamento sia davvero un problema, come ho detto che questo è più un problema di Pasto in Hamburger, non una relazione da Organizzazione a Persona. Questo potrebbe essere complicato da gestire nel mio codice UX, ma vedremo.

Opzione 4: Creare un modello CompositeSku nella relazione many-to-many o 1-N con SubItems. Questa opzione potrebbe essere suddivisa in base alla relazione. Ma il significato di questa opzione è che si tratta di un modello separato dal mio normale oggetto SKU. Dato che questo SKU composito proviene dal mio livello dati nel mio livello aziendale / servizio, potrei adattarlo affinché appaia come un normale SKU, probabilmente come lo adatterei alle opzioni precedenti. I pro si attengono a più di un singolo modello per paradigma di modello e meno campi inattivi (cioè campi che vengono utilizzati solo quando SKU è un genitore). I truffatori dovevano adattare un oggetto per apparire come uno SKU, o scrivere un sacco di codice per gestire gli SKU compositi ovunque nella UX dove sono gestiti gli SKU attualmente normali. Un altro grande problema è il recupero e la ricerca dei dati. Estraggerei i dati da una tabella aggiuntiva, dovendo unirli ai normali dati della SKU.

Mi sto davvero avvicinando al 2 e al 3, ma il # 2 sembra un po 'un anti-pattern. La relazione da 1 a N (parent.child1, parent.child2) è un anti-pattern?

Se è importante, sto utilizzando Entity Framework, MS-SQL e C #. UX fa un uso pesante delle griglie Kendo (che ritengo possa influenzare il mio design troppo probabilmente).

    
posta sheamus 01.12.2016 - 22:29
fonte

4 risposte

2

Perché hai bisogno di due classi diverse? Sembra che "ItemSku" sia solo uno "Sku" con un oggetto e "CompositeSku" sia solo uno "Sku" con più di un oggetto. Se vuoi il "prezzo totale", somma solo tutti gli elementi associati allo Sku.

public class Sku
{
    public List<SkuItem> Items { get; set; }

    public int TotalPrice
    {
        get
        {
            return Items.Sum(item => item.Price);
        }
    }
}

Non c'è bisogno di classi separate a meno che non abbiano bisogno di un comportamento diverso (e no, il calcolo del prezzo totale non è "diverso").

Non esiste una relazione genitore-figlio. È un numero molti-a-molti. Una volta che SKU può fare riferimento a più altri SKU, e ogni SKU può essere referenziata da più SKU.

    
risposta data 02.12.2016 - 18:49
fonte
1

Un termine del settore per questo è "un pacchetto di prodotti". Fondamentalmente, tecniche di ottimizzazione dei prezzi di marketing (per vendere di più con prodotti correlati al packaging). Di solito, ottiene il proprio numero di SKU. Dal punto di vista della progettazione è BOM (Bill of material) o tipo di rete relazione padre / figlio versi relazione gerarchica padre / figlio. Implementato con due tabelle. Una tabella rappresenterà tutte le SKU (incluso un bundle) altre tabelle memorizzeranno due relazioni dalla tabella SKU. Uno per il genitore e l'altro per il bambino.

    
risposta data 09.06.2018 - 00:47
fonte
1

Un SKU nella mia mente non è in realtà un oggetto. È un tipo di identificatore utilizzato per identificare un tipo di elemento e può appartenere a diversi tipi di elementi. Ciò renderebbe un attributo, non un'entità.

Quindi, ad esempio in un ambiente di produzione, potresti avere Part (che è un ingrediente nel tuo mondo degli hamburger) e un Assembly (un pasto). Parte e assieme sarebbero modellati come entità diverse, ma entrambi avrebbero un attributo / colonna Sku.

Inoltre, la SKU potrebbe non essere necessariamente utilizzata come chiave. È possibile che si desideri utilizzare una chiave surrogata per i join interni (ad esempio nella tabella cross-join che consente di connettere gli assembly con le rispettive parti). In questo modo se lo SKU ha bisogno di essere modificato, non è necessario aggiornare a cascata tutti gli identificatori nelle altre tabelle. Inoltre, apre la strada se hai bisogno di più SKU per articolo (ad esempio a volte c'è una SKU del produttore e un SKU del rivenditore).

Ciò rende leggermente più difficile la ricerca in tutti gli SKU, poiché potrebbero esistere in più di una tabella. Ma è preferibile forzare diversi tipi di oggetti nella stessa tabella, che può avere solo un set di vincoli e non si adatterebbe perfettamente a nessuna delle due entità. E lo rende più efficiente se un utente, ad esempio, desidera solo cercare SKU che rappresentano assiemi.

Quindi per rispondere alla tua domanda - prima, modella le entità e le loro relazioni-- pasto, ingrediente e M: M join table-- quindi scopri dove deve essere assegnato l'attributo SKU, tenendo presente che potrebbe finire in più di un posto.

    
risposta data 09.06.2018 - 03:41
fonte
0

Uno sku composito non è più uno sku.

ciò che stai descrivendo è un "pacchetto"

es. ho azione che ho

10 burgers cost 1.99
10 fries cost 0.50
10 shakes cost 0.99
 5 alternate supplier burgers cost 1.25

puoi acquistare un pacchetto

meal1 = burger + fries + shake at 4.99
meal2 = burger + fries at 3.99
meal3 = 2*fries at 10.99

nota che i prezzi non sono correlati. anche un hamburger in un pacchetto potrebbe essere uno qualsiasi di una selezione di skus. In questo caso il fornitore alternativo più economico burger.

    
risposta data 03.12.2016 - 12:39
fonte