3

Мы создаем структуру базы данных с помощью mySQL Workbench для нового приложения, и количество соединений, необходимых для составления списка данных, резко возрастает, для многих отношений.Структура базы данных - Чтобы присоединиться или не присоединиться

Приложение будет достаточно прочтенным и иметь пару сотен тысяч строк в таблице.

Вопросы:

  • Является ли это действительно так плохо, чтобы объединить таблицы, где это необходимо, и, таким образом, уменьшая присоединяется?

  • Должны ли мы начать смотреть на горизонтальное разбиение? (в сочетании с таблицами слияния)

  • Есть ли лучший способ свернуть таблицы, чтобы позаботиться о взаимоотношениях «многие ко многим»?

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

ответ

4

Пойдите с нормализованной формой базы данных. Для большей части задач вам не потребуется больше 3 или 4 штук, и вы все равно можете писать представления для наиболее распространенных объединений. Денормализация заставит вас всегда думать об обновлении полей в нескольких местах/таблицах при изменении одного свойства и, несомненно, приведет к большему количеству проблем, чем к преимуществам.

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

+0

Спасибо! На самом деле мы уже входим в 8-9 объединений, и, безусловно, будут дополнения к ядру, поэтому в будущем 10-15 объединений не могут быть полностью невозможными. – Industrial

+3

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

1

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

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

Если вы беспокоитесь о слишком много присоединяется для запросов, вы могли бы разоблачить определенные наборы данных, как вид ...

3

В обратном порядке:

  • Забудьте об этом. Используйте базу данных. Люди saynig «делают это в приложении» довольно часто являются теми, кто не осведомлен о количестве работ, которые собираются писать в базах данных.

  • В зависимости от конкретной необходимости.

  • В зависимости от конкретной необходимости. OLTP (обработка транзакций) - подходит для обычной формы. OLAP (аналитическая обработка) - перейдите на правильную звездную диаграмму и денормализовать, чтобы получить оптимальную производительность. Смешанный - забудьте об этом. Не работает для более крупных установок, потому что теории разные ... за исключением случаев, когда вы создаете базу данных OLTP, а затем используете специальную базу данных куба OLAP (которой у mySQL нет).

2

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

+0

Мне всегда говорили нормализовать, нормализовать и нормализовать снова. Затем число объединений увеличивается, и мне говорят, что он быстро убивает производительность. – Industrial

+0

Слишком много объединений убьют производительность при расширении набора данных. Очевидно, что существует множество других преимуществ для баз данных, чем возможность выполнять объединения. – Kimble

+0

@ Kimble: Конечно, в зависимости от приложения, но где вы нарисуете линию на «слишком много объединений»? – Industrial

0

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

Особенно, если база данных сильно кэширована, как вы говорите, вы будете удивлены, насколько быстро СУБД занимается такими вещами - в конце концов, она предназначена для всех.

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

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

И, как было сказано много раз, преждевременная оптимизация обычно плохая, а не хорошая.

+0

Ну, мы не строим новый Facetube, но мы действительно не хотим начинать создавать приложение, которое будет страдать от плохой структуры с первого дня. Каково ваше мнение о том, когда сливать столы и отделять их от друг друга? – Industrial

+0

@ Промышленный - время денормализации обычно возникает, когда у вас есть четкие доказательства необходимости. Помимо этого, «плохая структура с первого дня», скорее всего, возникнет из-за попытки угадать, где вы лучше, чем СУБД при оптимизации. – ChrisA

1

Если вы указали внешние ключи (вы установили внешние ключи, не так ли?) И имеете правильные места в ваших запросах, 10-15 соединений должны быть легко обработаны базой данных. Особенно с таким количеством строк. У меня есть запросы с таким количеством подключений к таблицам с миллионами строк, и они работают нормально.

Обычно лучше разделять данные, чем денормализовать.

Что касается деноминации, не делайте этого, если вы не разработали стратегию сохранения денормализованных данных в синхронизации с родительской таблицей.

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