Лично я считаю хорошей идеей хранить перечисления в базе данных, если значения перечислений используются в других типах сущностей.Кроме того, очень распространено хранить каждое перечисление в другой таблице, иначе отношения внешнего ключа не будут правильными.
Например, если MessageType
перечисление имеет значения:
enum MessageType
{
Alert = 1, /*each next will be incremented by 1*/
Error,
Log
}
Тогдасоответствующая таблица будет иметь следующую структуру:
table MessageTypes
{
ID int,
Name varchar(50)
}
Здесь ID
содержит целочисленные значения из нашего MessageType
enum (1 => «Alert», 2 => «Error», 3 => «Журнал») и используется в качестве внешнего ключа, где это необходимо.
Кроме того, в коде не остается большой необходимости манипулировать данными из таблицы MessageTypes
, минимизируя таким образом размеры передаваемых данных из /в базу данных.
Например, рассмотрим следующую таблицу базы данных:
table Messages
{
ID int,
MessageTypeID int /*this is foreign key referring to Messages.ID*/,
Text varchar(100)
}
В коде у нас, вероятно, будет соответствующий класс сущностей, подобный этому:
class Message
{
int ID { get; set; }
int MessageTypeID { get; set; }
string Text { get; set; }
}
Итак,когда мы извлекаем сущность Message
, нам не нужно извлекать соответствующую строку из таблицы MessageTypes
, а также нам не нужно иметь отдельную сущность, такую как MessageType.Вместо этого мы можем напрямую использовать уже известные значения enum для проверки типа сообщения:
var msg = LoadMessage(id: 101);
if (msg.MessageTypeID == (int)MessageType.Alert)
{
Console.WriteLine("Alert: {0}", msg.Text);
}
Надеюсь, это имеет смысл.