Domanda

Stiamo usando NHibernate e uno dei modelli comuni che abbiamo per archiviare informazioni simili a enum è definire tabelle separate per l'enum e fare semplicemente un riferimento all'ID nell'entità / tabella principale che utilizza l'enum. Un semplice esempio:

Message
-------
ID (bigint PK)
MessageTypeID (bigint FK)
Body (varchar)

MessageType
-----------
ID (bigint PK)
Value (varchar)

La tabella MessageType contiene un piccolo numero di valori enum come: SMS, MMS, PSMS, ecc.

Vale la pena mettere i valori enum in tabelle separate come questa? Immagino che il pro dell'enum sia che puoi estenderlo più facilmente in futuro ed è più normalizzato, ma il contro è che devi fare un join ogni volta che ricevi un messaggio. C'è un punto di rottura in cui sceglieresti l'uno sull'altro?

È stato utile?

Soluzione

Usare enum implica non usare un'altra tabella come stai facendo adesso. È anche più veloce come hai detto e molto più semplice.

In entrambi i casi è possibile aggiungere più opzioni, ma la domanda è: se si aggiunge un altro elemento nella tabella, sarà necessario ricompilare l'applicazione per aggiungere tale funzionalità?

Voglio dire, se la progettazione dell'applicazione è accoppiata e per supportare un nuovo tipo di messaggio devi ricompilare (forse perché devi includere l'implementazione di SMS), non vale la pena avere una tabella separata e dovresti usare enums

D'altra parte, se la tua entità non ha una logica (come una tabella di Paesi o Stati) o la tua applicazione può collegare un nuovo tipo di messaggio senza ricompilare, dovresti usare un'altra tabella. Per questo, potresti cambiare il tuo tavolo in qualcosa del genere:

MessageType
-----------
ID (bigint PK)
Value (varchar)
ImplementationType (varchar) (ie: Xyz.SMSSender, Xyz)

Oppure potresti avere un file di configurazione separato, in cui puoi personalizzare le dipendenze iniettate.

Altri suggerimenti

Vorrei creare un enum nel tuo codice con ID corrispondente alla tabella MessageType. Quindi nelle tue classi basta usare quello e nHibernate dovrebbe essere in grado di mapparlo correttamente.

Mi sono allontanato dalle tabelle enum, specialmente quando quei dati non devono essere gestiti. Aggiungerai sempre più MessageType mentre procedi?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top