Как Вы определяете, как далеко нормализовать базу данных?

Да, тебе нужен мокито. Вы можете проверить свой отдых, ударив по действующему запросу. Но с написанием тестов, вы можете запустить множество тестов для одного и того же отдыха для разных сценариев одним щелчком мыши. Итак, вам нужно написать тесты, чтобы охватить все сценарии тестирования одним щелчком мыши. с другой стороны, если вы будете тестировать все сценарии с помощью реальных запросов, вам потребуется много времени, и вы можете сделать недействительные тесты. В общем, вам нужен мокито, чтобы вы могли приступить к юнит-тестам.

18
задан David Basarab 6 September 2008 в 18:39
поделиться

14 ответов

Вы хотите начать разрабатывать нормализованную базу данных до 3-й нормальной формы. Поскольку Вы разрабатываете слой бизнес-логики, можно решить, что необходимо денормализовать немного, но никогда, никогда не понижаются 3-я форма. Всегда, поддерживайте в соответствии 1 и 2-я форма. Вы хотите денормализовать для простоты кода, не для производительности. Используйте индексы и хранимые процедуры для этого :)

, причина не "нормализует, когда Вы идете", то, что необходимо было бы изменить код, который Вы уже написали почти каждый раз, когда Вы изменяете проектирование баз данных.

существует несколько хороших статей:

http://www.agiledata.org/essays/dataNormalization.html

16
ответ дан 30 November 2019 в 06:46
поделиться

Нормализация означает устранять избыточные данные. Другими словами, ненормализованная или денормализованная база данных является базой данных, где та же информация будет повторена в нескольких различных местах. Это означает, что необходимо записать более сложный оператор обновления, чтобы гарантировать, чтобы Вы обновили те же данные везде, иначе Вы получаете непоследовательные данные, которые в свою очередь означают, что вывод запросов unrealiable.

Это - довольно огромная проблема, таким образом, я сказал бы что вред денормализации, не наоборот.

В некотором случае можно сознательно решить денормализовать определенные части базы данных, если Вы судите, что преимущество перевешивает дополнительную работу в обновлении данных и риска повреждения данных. Например, с datawarehouses, где данные агрегированы по причинам производительности и данным, если часто не обновленный после начальной записи, которые снижают риск несоответствий.

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

7
ответ дан 30 November 2019 в 06:46
поделиться

@GrizzlyGuru, которые мудрец однажды сказал мне, "нормализуют, пока это не причиняет боль, денормализуйте, пока это не работает".

Это еще не привело меня к сбою :)

я не соглашаюсь о запуске с него в ненормализованной форме однако, по моему опыту, its', легче адаптировать Ваше приложение для контакта с менее нормализованной базой данных, чем более нормализованная. Это могло также привести к ситуациям, где работа it "достаточно хорошо", таким образом, Вы никогда не находите время для нормализации его (пока its' слишком поздно!)

10
ответ дан 30 November 2019 в 06:46
поделиться

Наличие нормализованной базы данных даст Вам наибольшую гибкость и самое легкое обслуживание. Я всегда запускаю с нормализованной базы данных и затем ненормализую только, когда существует реальная проблема, для которой нужно обращение.

я просматриваю это так же к производительности кода т.е. пишу удобный в сопровождении, гибкий код и иду на компромиссы для производительности, когда Вы знаете , что существует проблема производительности.

2
ответ дан 30 November 2019 в 06:46
поделиться

Просто попытайтесь использовать здравый смысл.

Также некоторые говорят - и я должен согласиться с ними - что, если Вы присоединяетесь 6 (магическое число) таблицы вместе в большинстве Ваших запросов - не включая создание отчетов о связанных - чем Вы могли бы рассмотреть денормализовывание немного.

-1
ответ дан 30 November 2019 в 06:46
поделиться

Часто, если Вы будете нормализовать, то насколько Ваше другое программное обеспечение позволит Вам, Вы будете сделаны.

, Например, при использовании Объектно-реляционной технологии отображения, у Вас будет богатый набор семантики для различного many-one и many-many отношений. Под капотом это предоставит объединяющим таблицам эффективно 2 первичных ключа. В то время как относительно редкий, истинная нормализация часто дает Вам отношения с 3 или больше первичными ключами. В случаях как это я предпочитаю придерживаться O/R и прокручивать мой собственный код для предотвращения различных аномалий DB.

-1
ответ дан 30 November 2019 в 06:46
поделиться

Истина - то, что "это зависит". Это зависит от большого количества факторов включая:

  • Код (Кодированный рукой или управляемый Инструмент (как пакеты ETL))
  • Первичное приложение (Обработка транзакций, Организация хранилищ данных, Сообщая)
  • Тип Базы данных (MySQL, DB/2, Oracle, Netezza, и т.д.)
  • Архитектура Базы данных (Tablular, Колоночный)
  • Качество DBA (превентивный, реактивный, неактивный)
  • Ожидаемое Качество данных (Вы хотите осуществить качество данных на прикладном уровне или уровне базы данных?)
1
ответ дан 30 November 2019 в 06:46
поделиться

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

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

, Если Вы денормализовываете затем Вас или должны жить с тем, что можно получить обновление anomolies или необходимо реализовать ограничительную проверку сами в коде приложения. Это устраняет большое преимущество использования DBMS, который позволяет Вам определить эти ограничения декларативно.

Настолько принимающий то же качество кода, денормализовывание не может на самом деле дать Вам лучшую производительность.

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

1
ответ дан 30 November 2019 в 06:46
поделиться

Я соглашаюсь, что обычно лучше начаться с нормализованным DB и затем денормализовать для решения очень определенных проблем, но я, вероятно, запустил бы в Нормальная форма Boyce-Codd вместо 3-й Нормальной формы.

1
ответ дан 30 November 2019 в 06:46
поделиться

Я верю запуску с ненормализованной базы данных и перемещению к нормализованному, в то время как Вы прогрессируете, является обычно самым легким начать. К вопросу того, как далеко нормализовать, моя философия должна нормализовать, до запуски для причинения вреда. Это может звучать немного легкомысленным, но это обычно - хороший способ измерить, как далеко взять его.

2
ответ дан 30 November 2019 в 06:46
поделиться

База данных normizational, который я чувствую, является видом искусства.

Вы не хотите, нормализуют Вашу базу данных, потому что у Вас будет слишком много таблиц, и она вызовет Ваши запросы даже простых объектов, занимают больше времени, чем они должны.

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

, Например, если бы Вы создаете приложение управления контактами, имело бы смысл иметь Адрес (улица, Город, состояние, Zip, и т.д.) как его собственная таблица.

Однако, если у Вас есть только 2 типа контактов, Бизнеса или персональный, Вам нужна таблица типа контакта, если Вы знаете, что только собираетесь иметь 2? Для меня нет.

я запустил бы первым выяснением типов данных, в которых Вы нуждаетесь. Используйте программу моделирования, чтобы помочь любить Visio. Вы не хотите запускаться с ненормализованной базы данных, потому что Вы в конечном счете нормализуете. Запустите путем помещения объектов там логические группировки, поскольку Вы видите, что повторенные данные берут те данные в новую таблицу. Я не отставал бы от того процесса, пока Вы не чувствуете, что Вы разрабатываете базу данных.

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

3
ответ дан 30 November 2019 в 06:46
поделиться

Исходный плакат никогда не описывал, в какой ситуации будет использоваться база данных. Если это будет каким-либо типом проекта организации хранилищ данных, где в какой-то момент Вам будут нужны кубы (OLAP) данные обработки для некоторого фронтенда, было бы более мудро начаться со схемой "звезда" (таблицы фактов + размер) вместо того, чтобы изучить нормализацию. Книги Kimball очень помогут в этом случае.

2
ответ дан 30 November 2019 в 06:46
поделиться

У Jeff есть довольно хороший обзор его философии на его блоге: , Возможно, нормализация не нормальна . Главное: не переусердствуйте нормализацию. Но я думаю, что еще большая точка для устранения - то, что это, вероятно, не имеет значения слишком много. Если Вы не выполните следующий Google, Вы, вероятно, не заметите большую часть различия, пока Ваше приложение не растет.

3
ответ дан 30 November 2019 в 06:46
поделиться

Начните с оптимизации времени. Не пытайтесь перечислять и/или применять оптимизации вслепую. Не тратьте время на преобразование возвращаемых значений в ссылочные параметры только потому, что компилятор не доверяет NRVO.

Не тратьте время на ручную маркировку функций как встроенных . Не тратьте свое время, пытаясь собрать какой-то универсальный «Словарь оптимизаций».

97% вашего кода только не имеет значения с точки зрения производительности. Если вы попытаетесь применить оптимизацию независимо от того, что они делают и где они полезны, вы будете тратить 97% своего времени. Все это время можно было потратить на оптимизацию 3% кода, который действительно имел значение. (Кстати, именно это Кнут имел в виду с цитатой «корень всего зла.» Не то, чтобы оптимизация не должна выполняться, но то, что, если вы не имеете в виду определенный фрагмент кода, который вы уже знаете является горячей точкой, ваши оптимизации будут [1] преждевременными, и 2) неэффективными)

Поэтому первый совет по оптимизации: Закройте этот вопрос и обратитесь за помощью в оптимизации конкретного кода, который имеет значение в вашем приложении. Вы не узнаете ничего полезного об оптимизации 3% вашего приложения, что имеет значение, запросив общие фокусы оптимизации.

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

Третий совет по оптимизации: поймите систему, на которой вы работаете. Структурируйте свой код, чтобы использовать пространственную и временную локальность, чтобы минимизировать промахи в кэше. Простое переключение обхода массива 2D со столбца-мажора на строку-мажор может легко удвоить производительность. Помните, что компилятор и CPU будут переупорядочивать инструкции для повышения пропускной способности, но ветви ограничат их возможности для этого, поэтому попробуйте структурировать свой код, чтобы получить достаточно большие базовые блоки без скачков в них или из них. Если вы работаете на процессоре, поддерживающем инструкции SIMD, рассмотрите возможность их эффективного использования. Если вам действительно нужно погрузиться в оптимизацию на уровне инструкций, убедитесь, что у вас есть представление о задержках используемых инструкций. Для тяжелого кода с плавающей запятой помните, что инструкции FP в целом не будут автоматически переупорядочены компилятором или ЦП. Поскольку операции FP имеют довольно большие задержки, цепочки зависимостей могут быть реальным фактором снижения производительности. Устранение этих ошибок вручную может значительно ускорить выполнение кода. Аналогично, избегайте зависимостей памяти. Код, который сначала записывает, а затем считывает адрес, будет медленным. Если один или оба доступа к памяти не могут быть оптимизированы, то перед началом чтения необходимо дождаться завершения записи (что в противном случае могло бы произойти в фоновом режиме без остановки ЦП).Поместите все часто используемые данные во временные элементы, чтобы избежать наложения псевдонимов.

Что касается оптимизации «больших сложных наборов данных», как вы спросили? Я понятия не имею. Дело в сложных наборах данных в том, что у них очень мало общего. Нет общего способа их оптимизации.

Последнее предложение: звучит так, будто вы на самом деле не пишете C++. Вы говорите о ручном внедрении динамических массивов, вы говорите о reallocs и MFC-классах. Похоже, вы пишете «Си с классами.» Используйте стандартную библиотеку. std:: vector уже существует. Как и std:: Последовательность . Стандартная библиотека C++ обладает прекрасным свойством, что она чрезвычайно эффективна. То же самое нельзя сказать и для классов МФЦ.

-121--4546476-
NSMutableArray *buttonsToRemove = [NSMutableArray array];
for (UIView *subview in self.view.subviews) {
    if ([subview isKindOfClass:[UIButton class]]) {
        [buttonsToRemove addObject:subview];
    }
}
[buttonsToRemove makeObjectsPerformSelector:@selector(removeFromSuperview)];

ПРАВКА :
Я отредактировал свой ответ на вопрос о лучшем решении.
Теперь объекты не удаляются из массива при перечислении...

-121--4585698-

Не забывайте Мать всех дебатов по нормализации базы данных о Coding Horror (обобщено в блоге High Scalability).

-1
ответ дан 30 November 2019 в 06:46
поделиться
Другие вопросы по тегам:

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