2009-03-03 8 views
5

Stiamo utilizzando NHibernate e uno dei modelli comuni che abbiamo per memorizzare informazioni enum è quello di definire tabelle separate per l'enum e basta fare riferimento all'ID nell'entità principale/tabella che utilizza l'enum. Un semplice esempio:Enum tables in Hibernate/NHibernate

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 di mettere valori enum in tabelle separate come questo? Immagino che il pro dell'enumerazione sia che puoi estenderlo più facilmente in futuro ed è più normalizzato, ma il problema è che devi fare un join ogni volta che recuperi un messaggio. C'è un punto di rottura in cui sceglieresti l'uno rispetto all'altro?

risposta

10

L'uso delle enumerazioni implica non utilizzare un altro tavolo come si fa ora. È 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 il design dell'applicazione è accoppiato e per supportare un nuovo tipo di messaggio che è necessario ricompilare (forse perché è necessario includere l'implementazione SMS), non vale la pena di avere una tabella separata, e si dovrebbe usare enumeri

Dall'altro lato, se la tua entità manca di logica (tali Paesi o tabella Stati), o la tua applicazione può inserire un nuovo tipo di messaggio senza ricompilare dovresti usare un'altra tabella. Per questo, si potrebbe cambiare il vostro tavolo per qualcosa di simile:

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

Oppure si potrebbe avere un file di configurazione separato, in cui è possibile personalizzare le dipendenze iniettati.

2

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

Mi sono allontanato dalle tabelle di enumerazione, soprattutto quando non è necessario che i dati siano dati gestiti. Hai intenzione di aggiungere sempre più MessageType mentre vai?