Перечисления или таблицы?

Я делаю это общественной Wiki, поскольку я ценил бы подход людей и не обязательно ответ.

Я нахожусь в ситуации, где у меня есть много полей данных типа поиска, которые не изменяются. Пример был бы:

Ежегодная зарплата
Опция: 0 - 25K
Опция: 25K - 100K
Опция: 100K +

Я хотел бы иметь эти опции, легко доступные через перечисление, но также хотел бы к текстовым значениям, доступным в DB, поскольку я сделаю создание отчетов о текстовых значениях и не идентификаторе. Кроме того, так как они статичны, я не хочу выполнять вызовы к DB.

Я думал, копируя это в перечислении и таблице, но хотел бы услышать некоторые альтернативные мысли.

Спасибо

7
задан 2 revs, 2 users 96% 28 December 2009 в 17:52
поделиться

7 ответов

Я думаю, что перепись - плохая идея. Просто учитывая тип данных, которые вы показываете, они могут измениться. Лучше иметь таблицу базы данных с полями ID/Min/Max/Description, которые вы загружаете при инициализации приложения

.
7
ответ дан 6 December 2019 в 10:50
поделиться

Так как C# не разрешает Enum со строковыми значениями, я бы предложил структуру со статическими строками.

Таким образом, вы поддерживаете некоторую интеллектуальность, но без попыток получить значение Enum о том, что является строковым значением в БД.

Другое решение, которое я бы предложил: удалить логику, которая зависит от этих значений, и перейти к табличной логике. (Например, если в каждой трассе есть своя налоговая ставка, добавьте налоговую ставку как столбец в базе данных, а не случай {} в коде.)

.
0
ответ дан 6 December 2019 в 10:50
поделиться

Использовать как enum(для кода), так и тексты БД- для представления графического интерфейса.

Итак, если у вас всегда будет 3 варианта использования перечисления LowSalary, MiddleSalary и HighSalary, сохраняйте свои тексты в БД и переключайте свои тексты в графическом интерфейсе, соответствующем значению вашего имущественного перечисления.

.
-1
ответ дан 6 December 2019 в 10:50
поделиться

Я использую оба. В Linq to SQL и EF, вы просто делаете свойство столбца типом перечисления. В других фреймворках обычно можно как-то привязать колонку к свойству enum. Вы все еще можете иметь таблицу первичных ключей в БД, содержащую действительные перечисления.

Вы также можете сделать это с ограничением CHECK в БД, но это имеет тенденцию привязывать ваши данные к вашему приложению - кто-то, глядя только на БД, не обязательно будет знать, что означает каждое значение. Поэтому я предпочитаю гибридную таблицу/значение

.
1
ответ дан 6 December 2019 в 10:50
поделиться
Используйте и то, и другое, И вы должны исследовать CodeDOM. Используя это, вы можете написать процедуры генерации кода, которые позволяют компиляционному процессу автоматически генерировать сборку или класс с этими перечислениями в нем, читая базу данных. Таким образом, вы получите возможность управлять базой данных, но не будете вызывать базу данных каждый раз, когда вы получаете доступ к экземпляру перечисления....

1
ответ дан 6 December 2019 в 10:50
поделиться

Сначала убедитесь, что эти данные действительно статичны. Если что-то изменится, вам придется перекомпилировать и переустановить.

Если данные действительно статические, я бы поехал по enum-маршруту. Можно создать YearlySalaryEnum, содержащий все значения. Для представления строки я бы использовал словарь со строковыми значениями и YearlySalaryEnum в качестве ключа. Словарь можно держать как статический экземпляр в статическом классе. Использовать его можно следующим образом (C#):

string highSalary = StaticValues.Salaries[YearlySalaryEnum.High];
0
ответ дан 6 December 2019 в 10:50
поделиться

Один из способов - это написать форматировщик, который может превратить перечисление в строковое представление:

public class SalaryFormatter : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
         return (formatType == typeof(ICustomFormatter)) ? new
         SalaryFormatter () : null;
    }

    public string Format(string format, object o, IFormatProvider formatProvider)
    {
        if (o.GetType().Equals(typeof(Salary)))
        {
            return o.ToString();

            Salary salary = (Salary)o;
            switch (salary)
            {
                case Salary.Low:
                     return "0 - 25K";
                case Salary.Mid:
                     return "25K - 100K";
                case Salary.High:
                     return "100K+";
                default:
                     return salary.ToString();
            }
        }

    return o.ToString();
    }
}

Вы используете форматировщик, как и любой другой:

Console.WriteLine(String.Format(new SalaryFormatter(), "Salary: {0}", salary));

Форматировщик может быть расширен для поддержки различных форматов с помощью форматирования строк, множества типов, локализации и т.д.

.
2
ответ дан 6 December 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: