Refactor utilizzando CTI o crea nuove entità

2

Attualmente sto sviluppando un'applicazione di e-commerce piuttosto ampia che gestisce più campi aziendali diversi. Come ogni applicazione di e-commerce, abbiamo un Concetto chiamato Ordine che ha uno o più OrderItem .

Dato che copriamo più campi aziendali i OrderItems devono memorizzare informazioni diverse in base al campo commerciale che il cliente ha inserito, attualmente viene fatto utilizzando l'ereditarietà delle classi sull'applicazione- Ereditarietà di tabelle singole e singole nella parte del database.

Ecco un esempio rapido e molto semplificato:

class OrderItem {
  int amount;
  int created_at;
  int order_id;
}

class ElectronicOrderItem extends OrderItem {
  string brand;
  string description;
}

class RentalOrderItem extends OrderItem {
  date startDate;
  date endDate;
  enum type;
}

La tabella OrderItem ora contiene tutti i campi di tutte le sottoclassi nullable se non per il tipo specifico. Sembrava una buona idea quando l'applicazione è iniziata qualche anno fa, ma ora è molto maldestra, con molte colonne nullable ~ 75.

Ora sto cercando di capire il modo migliore per ridefinire questa parte di codice con la prospettiva che l'applicazione possa essere suddivisa in parti diverse (campi aziendali) molto probabilmente.

I miei attuali approcci sarebbero uno dei seguenti:

  1. utilizza CTI supportato dall'ORM che stiamo utilizzando e crea una tabella per ciascuna sottoclassi di ordine-item.

  2. crea entità completamente nuove

come:

class ElectronicOrderItem {
  OrderItem item;
  string brandname;
  string description;
}

Non sono sicuro di quale opzione sarebbe migliore, soprattutto se si pensa al fatto che il team sta crescendo e l'applicazione potrebbe essere suddivisa in singoli servizi nei prossimi anni.

    
posta gries 04.05.2016 - 09:36
fonte

2 risposte

1

Data:

the application may be split up into different parts (business fields) most likely.

e

the application might be split apart into single services in the next few years

Sarei riluttante a fare qualsiasi cosa in base a quanto sopra. Chissà cosa succederà nel prossimo futuro e sarei cauto nel basare qualsiasi progetto su ciò che si prevede avverrà in questi tempi. Vorrei esaminare quali problemi hai di fronte ora e indirizzarli.

Osservando il tuo problema di modellare le classi, come regola generale preferirei composizione su eredità . Questo ti comprerà più flessibilità e, data l'incertezza su dove sta andando la tua applicazione, può essere solo una buona cosa.

    
risposta data 04.05.2016 - 13:53
fonte
0

Quindi vuoi normalizzare il tuo DB per far fronte alle sottoclassi - direi che ha senso. È facile da fare, puoi creare viste o stored proc per esporre il nuovo schema DB alla vecchia applicazione come se nulla fosse successo e lavorare sulla modifica delle tabelle DB quanto vuoi.

Una volta completato, è possibile modificare l'applicazione per iniziare a leggere direttamente dalle nuove tabelle (o viste più semplici - non si sa mai quando si vorrà ripetere questo processo o quando è necessario aggiornare il DB per una squadra mantenendo compatibilità per un altro)

    
risposta data 04.05.2016 - 09:49
fonte

Leggi altre domande sui tag