Денормализация для простоты: плохая идея? - PullRequest
4 голосов
/ 20 мая 2010

Прочитав этот вопрос , я узнал, что денормализация не является решением для простоты. А как насчет этого дела?

У меня есть новостные статьи, в которых есть список сайтов-статей, которые будут опубликованы. Последнее можно выразить в нормализованном виде либо по таблице, либо по соотношению «многие ко многим» (я думаю, через кросс-таблицу). Но простое решение состоит в том, чтобы просто добавить несколько логических значений для сайтов, на которых будет опубликована статья (publish_to_site_1, publish_to_site_2 и т. Д.). Предполагая, что сайты:

  1. маленький номер
  2. не изменится со временем
  3. сами не имеют полей, кроме имени

Это все еще ужасная идея? Отношение «многие ко многим» кажется несколько громоздким, но я делал это раньше в подобных случаях (и это казалось громоздким).

Примечание: Я делаю это в Rails, где это не так больно. С другой стороны, метапрограммирование делает такие вещи тривиальными

(1..5).each { |site| do_something(article["publish_to_site_#{site}".to_symbol]) }

Ответы [ 4 ]

3 голосов
/ 20 мая 2010

Если эти условия действительно выполняются, то нет, это не страшная идея.

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

Итак, все в порядке (нормализовано):

article                        show_on_stackoverflow    show_on_my_blog
-----------------------------------------------------------------------
Denormalize for Simplicity             YES                     NO
More simplicity                        YES                     YES
...

Но это не нормально (избыточность):

article                        show_on_stackoverflow    stackoverflow_mainpage_url   show_on_my_blog    my_blog_mainpage_url
------------------------------------------------------------------------------------------------------------------------------
Denormalize for Simplicity             YES              http://stackoverflow.com            NO          http://my.blog.url       
More simplicity                        YES              http://stackoverflow.com            YES         http://my.blog.url
...
2 голосов
/ 22 мая 2010

Предположение два нереально.

Следовательно, в полном соответствии с «Если эти условия действительно выполняются, то нет, это не страшная идея». : да, это ужасная идея.

0 голосов
/ 20 мая 2010

Лично я думаю, что я бы не денормализовал.По моему мнению, одиночное отношение n: n не так уж и сложно, если вы знакомы с SQL.Что может быть обременительным, так это использование денормализованной структуры для разных запросов.Например, вы уверены, что вам никогда не понадобится список всех сайтов, на которых опубликована статья ...?

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

Приветствия Матиаса

0 голосов
/ 20 мая 2010

Если вы рассматриваете булевы «sites-article-будут-опубликованы-в» как просто атрибуты первичного элемента данных, такие как «isGreen», «hasHair», «isBipedal», то одна таблица нормализуется ощущение, что было бы извращением иметь внешний ключ к таблице Green{<true>, <false>}.

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

...