Я недавно должен был сделать представление математических выражений в форме класса Выражения. При оценке выражения я должен пересечь древовидную структуру с постпорядком treewalk. Для достижения этого, я реализовал IEnumerable< T> как это:
public IEnumerator<Expression<T>> GetEnumerator()
{
if (IsLeaf)
{
yield return this;
}
else
{
foreach (Expression<T> expr in LeftExpression)
{
yield return expr;
}
foreach (Expression<T> expr in RightExpression)
{
yield return expr;
}
yield return this;
}
}
Тогда я могу просто использовать foreach для пересечения выражения. Можно также добавить Свойство для изменения пересекающегося алгоритма по мере необходимости.
Нормализация не имеет ничего общего с производительностью. Я не могу сказать лучше, чем это сделал Эрвин Смаут в этой теме: Какое влияние на ресурсы оказывает нормализация базы данных?
Большинство СУБД SQL имеют ограниченную поддержку изменения физического представления данных без ущерба для логической модели, поэтому, к сожалению, это одна из причин, по которой вам может потребоваться демормализация. Другой заключается в том, что многие СУБД не имеют хорошей поддержки ограничений целостности нескольких таблиц, поэтому в качестве обходного пути для реализации этих ограничений вы можете быть вынуждены поместить посторонние атрибуты в некоторые таблицы.