Come utilizzare le tabelle di collegamento nel codice back-end?

0

Questa è più una domanda a risposta aperta riguardante le migliori pratiche di progettazione.

Dire che ho due classi; uno è un veicolo, e l'altro è una fonte di informazioni (per informazioni sulla manutenzione / riparazione). Una fonte di informazioni verrà utilizzata per molti veicoli diversi e un veicolo potrebbe avere più fonti di informazione diverse (per diverse parti del veicolo).

Vehicle e InformationSource sono due diverse tabelle nel database, con una tabella di collegamento separata per mapparle insieme (VehicleInfoSourceLink).

Attualmente conservo una cache / raccolta di oggetti del veicolo per un cliente specifico (tutti i record del veicolo con customerID = X). E conservo anche una cache / raccolta di oggetti InformationSource per un cliente specifico.

Tuttavia, quando arriva il momento di trovare le informazioni disponibili per un veicolo, non sono sicuro di quale sia il modo migliore per farlo.

Opzione 1) Crea un nuovo oggetto nel mio codice C # che rappresenta la tabella di link, ad es. VehicleInfoSourceLink e conserva una cache di questo disponibile insieme alle cache Vehicle e InformationSource. In questo modo quando ho un veicolo specifico, posso guardare gli oggetti di collegamento e trovare tutti gli ID di InformationSource per un veicolo specifico, e quindi selezionare quegli Id dalla cache di InformationSource.

Opzione 2) Crea una funzione SQL chiamata "GetInformationSourcesForVehicle" che acquisisce l'id del veicolo e restituisce gli ID di tutte le fonti di informazione che sono mappate su di esso. Chiamerei questa funzione dal mio codice C # e manterrai un elenco di ID e quindi selezionerò gli oggetti InformationSource con quegli ID.

Veramente desideroso di ascoltare le opinioni delle persone su quale sia l'opzione migliore o forse anche altre soluzioni. Aperto a qualsiasi feedback, incluso come fare domande come questa (se voglio usare forum come questo più in futuro per ottenere buoni consigli sul design).

    
posta AndyNZ 10.04.2016 - 04:39
fonte

1 risposta

1

Di solito non vuoi avere un class che rappresenti la relazione tra le classi InformationSource e Car . Nei database relazionali hai queste tabelle perché non c'è altro modo su come rappresentare la relazione. Nelle lingue orientate agli oggetti puoi farlo direttamente.

Non so esattamente cosa intendi per fonte di informazioni disponibili e quando una fonte di informazioni diventa disponibile per un veicolo in base alle tue regole aziendali, ma anche in quel momento, mantenendo le fonti di informazione per un cliente specifico, a meno che ciò non sia direttamente correlato alla disponibilità di uno, probabilmente non è necessario.

Potresti avere classi come questa:

class InformationSource
{
    private List<Car> _carsToBeSourceOf;

    public InformationSource(List<Car>? carsToBeSourceOf)
    {
        _carsToBeSourceOf = carsToBeSourceOf == null ?
            new List<Car>() : carsToBeSourceOf;
    }

    public function AddCarToHaveThisAsInformationSource(Car car)
    {
        _carsToBeSourceOf.Add(car);
    }
};

class Car
{
    protected List<InformationSource> _informationSources;

    public Car(List<InformationSource>? informationSources)
    {
        _informationSources = informationSources == null ?
            new List<InformationSource>() : informationSources;
    }

    public addInformationSource(InformationSource informationSource)
    {
        _informationSources.Add(informationSource);
        informationSource.AddCarToHaveThisAsInformationSource(this);
    }
};

Un Customer avrà quindi una lista di automobili come proprietà, puoi aggiungere un getter alla classe Car per accedere alle fonti di informazione e attraverso questo getter puoi accedere a tutte le fonti di informazione che Customer ha .

Ma poi di nuovo, potresti già vedere il problema, che nel caricare una classe Car , ci potrebbe essere una situazione che richiederebbe di caricare tutte le macchine dal database, a causa delle relazioni.

Ciò accadrebbe in una situazione quando una macchina in calcestruzzo con ID univoco (per questo esempio si assume ID 1) avrebbe più fonti di informazioni e alcune di queste fonti di informazioni sarebbero legate alle auto con ID diverso da 1.

Potresti pensare a un caricamento lento, che potrebbe funzionare, ma probabilmente starai mescolando la logica di business con la persistenza (le classi Car e InformationSource probabilmente includeranno la parte di caricamento), che non va bene.

Se la situazione è il caso, allora sì, un'altra classe come CarsInformationSources è probabilmente una buona idea, quindi un Car conterrà un elenco di CarsInformationSources e così anche il InformationSource class.

Ma poi di nuovo, se fosse il caso in cui una fonte di informazione legata ad una macchina sarebbe legata solo a questa macchina, non avresti davvero bisogno della mappa in primo luogo, quindi avere la classe CarsInformationSources che agisce come un mediatore è molto probabilmente l'idea migliore.

    
risposta data 10.04.2016 - 15:06
fonte

Leggi altre domande sui tag