Come memorizzare una quantità potenzialmente grande di proprietà opzionali degli oggetti?

4

Sto utilizzando Entity Framework Code First con ASP.NET MVC. Questo gestisce la progettazione del mio database in base ai modelli di dominio all'interno della mia applicazione.

Allo stato attuale, il motore che sto scrivendo avrà una classe website e store . store è una proprietà di website collegata da un ForeignKey nel database. Voglio implementare alcune opzioni come TaxDisplayType su ciascuno dei modelli, ma sono incerto sull'approccio migliore.

Il problema che ho è che Store potrebbe potenzialmente avere la stessa opzione di website che, se è impostata contro lo store, dovrebbe essere usata, ma se non lo è, torna al livello del sito web.

Queste sono le opzioni a cui posso pensare di fare questo:

  1. Aggiungi questa opzione per ogni classe i.e Website.TaxDisplayType e Store.TaxDisplayType - Sono preoccupato per la quantità di opzioni duplicate tra 2 tabelle.

  2. Avere un oggetto tabella che memorizza le coppie chiave / valore con un riferimento allo "scope" (sito Web o negozio i.e) e scrivo un wrapper per trascinare le opzioni tramite il loro nome. Il problema che ho con questo approccio è l'uso di stringhe magiche. A differenza dell'opzione 1, se nel codice è errato un nome di opzione di configurazione, verrà comunque compilato il progetto.

Sono anche preoccupato che andando avanti, se avessi 500 opzioni, questo equivarrà a 500 colonne di database - Questa non sembra una buona idea.

Sto cercando alcuni consigli sul modo migliore per gestire questo tipo di dati dato che:

  1. Mi piacerebbe usare le proprietà delle classi piuttosto che le stringhe magiche.
  2. Evita la duplicazione, ove possibile.
posta webnoob 23.10.2014 - 10:19
fonte

1 risposta

3

Al momento della stesura di questo libro, sto vedendo due modi in cui puoi andare con questo, entrambi sono una variante della tua opzione 2:

  • Hai una tabella option . Questa tabella sarebbe simile a questa:

    • Chiave esterna (potresti aggiungerne una per Negozio e sito web)
    • Scope-enum (sito web o negozio, così sai che tipo di opzione stai estraendo)
    • Opzione - enum (taxdisplaytype ecc., modifica l'enum nello schema ogni volta che hai nuove opzioni da aggiungere)
    • Valore

Professionisti : facile interrogare tutte le opzioni per un sito Web o un negozio ed evitare la duplicazione
Contro : avresti molte righe se i tuoi siti web e gli store utilizzano un sacco di opzioni (non dovrebbero avere un impatto sulle prestazioni purché indicizzate correttamente), e dovresti aggiornare lo schema ogni volta che aggiungi una nuova opzione (devi aggiungerla all'elenco di valori consentiti dell'enumerazione in modo che il database non si adatti correttamente)

  • Attacca con 2, ma invece di stringhe magiche, usa la serializzazione invece di accedere direttamente alle stringhe. In questo modo, hai effettivamente proprietà di classe alle quali puoi accedere.

Pro : non devi modificare lo schema se desideri aggiungere una nuova opzione o modificare la sua struttura
Contro : sei conservando ancora le stringhe nel database, quindi è necessario essere sicuri di serializzare le cose che si estraggono prima di usarle.

    
risposta data 23.10.2014 - 11:01
fonte