Struttura gerarchica che deve rafforzare la disponibilità

3

Il progetto a cui sto lavorando ha profonde relazioni genitore / figlio che devono rafforzare la disponibilità.

Immagina di essere un grande venditore elettronico in tutto il mondo (Best Buy) e di vendere telefoni cellulari

Abbiamo Regioni (Asia, Europa, Nord America ..), Paesi all'interno di Regioni , Magazzini all'interno di Paesi , Negozi che funzionano con Magazzini .

Ecco i 4 livelli che hanno relazioni parent-child.

(Livello 1) (Livello 2) (Livello 3) (Livello 4)
Regioni - > Paesi - > Magazzini - > Stores

Vendiamo solo telefoni cellulari e abbiamo in totale 100 diversi modelli disponibili. La disponibilità del singolo telefono può variare in tutti questi livelli (punti di disponibilità). Ad esempio:

Per impostazione predefinita, tutti i modelli di telefoni cellulari sono disponibili per tutti i negozi.

Vendiamo solo 100 modelli di telefoni,  - Solo 80 di loro sono disponibili in Asia  - Su 80 solo 60 di questi sono disponibili in India  - Su 60 solo 50 di questi sono disponibili nel magazzino di Delhi  - e infine su 50 solo 45 di questi sono disponibili nel negozio di Nuova Delhi 1

Anche alcuni degli attributi dei telefoni potrebbero cambiare tra questi punti di disponibilità.

Ad esempio: Nokia Lumia 830 potrebbe essere commercializzato come Lumia X in India. L'India potrebbe offrire Vodafone per impostazione predefinita per Nokia Lumia 830 , ma Delhi Warehouse può scegliere di ignorarlo e offrire un altro fornitore di simcard.

Finora ho trovato 2 modi per gestire:

1- Applicazione di tutti i mapping disponibili in ogni livello.

Pertanto, quando realizziamo 90 telefoni Nokia disponibili per la regione Asia, creeremo.

  • 90 voci a livello di regione
  • 90 x Numero di voci di Paesi nel Livello 2
  • 90 x numero di Paesi x numero di voci di magazzino nel livello 3
  • 90 x numero di Paesi x numero di magazzini x numero di voci di negozi nel livello 4

Quindi qualcuno che modifica la disponibilità a livello di negozio nella regione Asia può vedere tutti i prodotti disponibili e filtrare come preferisce o modificare gli attributi. Il magazzino di Delhi non può venderne 10, il negozio di Nuova Delhi non può vendere 5 degli specifici disponibili nel magazzino. Quindi

Rimuoveremo  - 10 mappature dal magazzino  - 10 x Numero di tutti i mapping di negozi forniti da warehuse dall'alto  - 5 mappature x dallo specifico negozio di Nuova Delhi

Questo approccio è più facile da gestire nel codice. Ma tutte le operazioni stanno creando molti record di dati e gestire questo con le transazioni potrebbe essere problematico.

2- La sola creazione di record per quelli non è disponibile nel livello selezionato e accetta tutto è disponibile in ogni livello.

In effetti, per impostazione predefinita, tutti i prodotti sono disponibili a livello globale, a meno che non siano state create restrizioni specifiche al livello richiesto

Quindi mettiamo a disposizione 90 telefoni Nokia per la regione Asia, creeremo:

  • 90 voci nel livello 1

    Se qualcuno cambia la disponibilità a livello di negozio nella regione Asia, può vedere tutti i prodotti disponibili e filtrare come preferisce o modificare gli attributi. Supponiamo che il magazzino di Delhi non ne detenga 10. Il negozio di Nuova Delhi non offre 5 telefoni disponibili nel magazzino. Quindi

    Aggiungeremo

  • 10 mapping x Numero di negozi al livello 3

  • 5 mappature al negozio di Nuova Delhi

Tuttavia, implementare questo approccio e trovare i telefoni cellulari disponibili nei negozi richiederà la lettura dei valori dai genitori.

Inoltre, essere in grado di ignorare un attributo di un modello di telefono in ogni livello in modo semplice e gestibile diventa una sfida.

Ho pensato a come risolvere questo problema in un modo piacevole e pulito e se utilizzare Database di documenti o Data Warehouse sarebbe effettivamente più adatto.

    
posta Gonzales Gokhan 08.11.2016 - 15:55
fonte

4 risposte

0

Dopo aver affrontato grandi risposte qui. Ho implementato (la risposta di Joel Brown sul link)

link

senza numeri di visita . Ho esaminato casi d'uso e questo approccio sta risolvendo ciascuno di essi, inoltre è abbastanza generico da permettermi di ignorare qualsiasi campo mi piacerebbe. Purtroppo non posso contrassegnare il commento di Vlad come risposta.

    
risposta data 10.11.2016 - 18:38
fonte
0

Il modello gerarchico non sembra una buona idea. Idealmente al livello più alto c'è una voce.

Ad esempio, per Asia, ci sarebbe una voce: Nokia

Ora, se si smette di vendere telefoni Nokia in Asia, si rimuoverà solo quel record al livello più alto e il cambiamento si ridurrà a cascata verso gli altri livelli. Questo è ciò che rende un modello gerarchico potente.

Se hai molte eccezioni, come possiamo vendere Nokia in Asia, ma per questa regione per questi 2 negozi non possono vendere Nokia, e per questa regione per questi 5 negozi non possiamo vendere Nokia, quindi il modello gerarchico cade a pezzi.

La disponibilità del telefono non ha senso perché, solo perché il telefono è disponibile in Asia, potrebbe non esserlo per una regione o un negozio perché potrebbe essere esaurito, ecc. Questo perché i modelli gerarchici funzionano dall'alto verso il basso. Quindi, la disponibilità di modelli su questo non sarà una buona idea.

Si può ancora modellare le posizioni dei negozi come gerarchiche. Ciò ti consentirà di eseguire query gerarchiche, come quanti telefoni sono disponibili per questa regione, ecc.

Ma collegherei la disponibilità agli ID dei negozi invece che a un ID o a un paese o regione in modo relazionale rispetto a quello gerarchico.

    
risposta data 08.11.2016 - 16:34
fonte
0

Identifica correttamente il problema delle regole in conflitto a diversi livelli della gerarchia e della soluzione. O: usa solo liste bianche o nere. O mappare solo il livello più basso

Secondo la mia vista, solo il livello più basso è un errore. L'impostazione sarà un prodotto di un insieme di regole aziendali. Hai affermato che le regole sono cose come "solo X telefoni disponibili in asia", quindi dovrai avere quella regola gerarchica memorizzata da qualche parte e usarla per calcolare l'impostazione di livello più basso. Potresti anche calcolarlo al volo a meno che non sia molto intenso.

Sì, significa che devi seguire l'albero per controllare tutti i livelli, ma sul lato positivo hai meno regole da mantenere.

Sul lato negativo però le regole sono più complicate da spiegare agli addetti alle vendite.

    
risposta data 08.11.2016 - 18:28
fonte
0

Si desidera inserire le informazioni ridondanti e ogni livello sostituisce i valori del relativo genitore. Creerei quattro tavoli, chiamiamoli Regione, Paese, Magazzino e Negozio. E tre viste con un join esterno su ogni due tabelle Region-Country, Country-Warehouse e Warehouse-Store. Ad ogni vista i valori del livello figlio, se presenti, sostituiscono i valori del livello genitore.

In questo modo puoi leggere le informazioni a livello di Regione, Paese, Magazzino o Negozio.

Scrivi nelle tabelle inserendo solo le informazioni richieste con ridondanza minima e leggi dalle viste.

Lo stesso potrebbe essere ottenuto con un singolo tavolo unito a se stesso, ma penso che sarebbe molto più difficile capire i lavori interiori.

CREATE TABLE Region (
    Region VARCHAR(50) NOT NULL,
    Model VARCHAR(100) NOT NULL,
    OnSale SMALLINT NOT NULL,
    Name VARCHAR(100) NOT NULL,
    Price DECIMAL(18, 2) NULL,
    Attribute VARCHAR(100) NULL,
    CONSTRAINT PK_Region PRIMARY KEY (Region,Model)
)

CREATE TABLE Country (
    Region VARCHAR(50) NOT NULL,
    Country VARCHAR(50) NOT NULL,
    OnSale SMALLINT NOT NULL,
    Model VARCHAR(100) NOT NULL,
    Name VARCHAR(100) NULL,
    Price DECIMAL(18, 2) NULL,
    Attribute VARCHAR(100) NULL,
    CONSTRAINT PK_Country PRIMARY KEY (Region,Country,Model),
    CONSTRAINT F1_Country FOREIGN KEY (Region,Model) REFERENCES Region(Region,Model)
)

CREATE TABLE Warehouse (
    Region VARCHAR(50) NOT NULL,
    Country VARCHAR(50) NOT NULL,
    Warehouse VARCHAR(50) NOT NULL,
    OnSale SMALLINT NOT NULL,
    Model VARCHAR(100) NOT NULL,
    Name VARCHAR(100) NULL,
    Price DECIMAL(18, 2) NULL,
    Attribute VARCHAR(100) NULL,
    CONSTRAINT PK_Warehouse PRIMARY KEY (Region,Country,Warehouse,Model),
    CONSTRAINT F1_Warehouse FOREIGN KEY (Region,Country,Model) REFERENCES Country(Region,Country,Model)
)

CREATE TABLE Store (
    Region VARCHAR(50) NOT NULL,
    Country VARCHAR(50) NOT NULL,
    Warehouse VARCHAR(50) NOT NULL,
    OnSale SMALLINT NOT NULL,
    Store VARCHAR(50) NOT NULL,
    Model VARCHAR(100) NOT NULL,
    Name VARCHAR(100) NOT NULL,
    Price DECIMAL(18, 2) NULL,
    Attribute VARCHAR(100) NULL,
    CONSTRAINT PK_Store PRIMARY KEY (Region,Country,Warehouse,Store,Model),
    CONSTRAINT F1_Store FOREIGN KEY (Region,Country,Warehouse,Model) REFERENCES Country(Region,Country,Warehouse,Model)
)

CREATE VIEW CountryModels AS
SELECT R.Region,C.Country,R.Model,ISNULL(C.OnSale,R.OnSale) AS OnSale,ISNULL(C.Name,R.Name) AS Name,ISNULL(C.Price,R.Price) AS Price ,ISNULL(C.Attribute,R.Attribute) AS Attribute FROM Region R LEFT OUTER JOIN Country C ON R.Region=C.Region AND R.Model=C.Model

CREATE VIEW WarehouseModels AS
SELECT C.Region,C.Country,W.Warehouse,ISNULL(W.OnSale,C.OnSale) AS OnSale,C.Model,ISNULL(W.Name,C.Name) AS Name,ISNULL(W.Price,C.Price) AS Price ,ISNULL(W.Attribute,C.Attribute) AS Attribute FROM CountryModels C LEFT OUTER JOIN Warehouse W ON W.Region=C.Region AND W.Country=C.Country AND W.Model=C.Model

CREATE VIEW StoreModels AS
SELECT W.Region,W.Country,W.Warehouse,S.Store,ISNULL(S.OnSale,W.OnSale) AS OnSale,W.Model,ISNULL(S.Name,W.Name) AS Name,ISNULL(S.Price,W.Price) AS Price ,ISNULL(S.Attribute,W.Attribute) AS Attribute FROM WarehouseModels S LEFT OUTER JOIN Store W ON S.Region=W.Region AND S.Country=W.Country AND S.Warehouse=W.Warehouse AND S.Model=W.Model
    
risposta data 09.11.2016 - 13:56
fonte