В MySQL: несколько таблиц или одну таблицу с большим количеством столбцов?


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

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

Я довольно новичок в разработке баз данных, так какой подход лучше и каковы плюсы и минусы? Каков обычный способ сделать это?

8 84

8 ответов:

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

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

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

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

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

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

когда таблицы получают слишком много столбцов, вы можете столкнуться с проблемами с фактическим размером страницы, на которой база данных хранит информацию. Либо запись может оказаться слишком большой для страницы, в которой вы можете оказаться не в состоянии создать или обновите определенную запись, которая делает пользователей недовольными, или вам может (по крайней мере, в SQL Server) быть разрешено некоторое переполнение для определенных типов данных (с набором правил, которые вам нужно искать, если вы это делаете), но если многие записи будут переполнять размер страницы, вы можете создать серьезные проблемы с производительностью. Теперь, как MYSQL обрабатывает страницы и есть ли у вас проблема, когда потенциальный размер страницы становится слишком большим-это то, что вам придется искать в документации для этой базы данных.

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

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

минусы Дизайн сложнее, запросы становятся немного сложнее

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

у меня есть хороший пример. Чрезмерно нормализованная база данных со следующим набором отношений:

people -> rel_p2staff -> staff

и

people -> rel_p2prosp -> prospects

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

такого рода дизайн продолжается для всей базы данных.

теперь, чтобы запросить этот набор отношения это мульти-таблица присоединиться каждый раз, иногда 8 и более таблицы присоединиться. Он работал нормально до середины этого года, когда он начал очень медленно теперь, когда мы прошли 40000 записей людей.

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

решение будет иметь прямое отношение к people -> staff и people -> prospect

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

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

Я уже сделал какой-то дизайн базы данных. для меня это зависит от сложности системы с управлением базами данных; да, это правда, чтобы иметь уникальные данные только в одном месте, но это действительно трудно сделать запросы с чрезмерно нормализованной базой данных с большим количеством записей. Просто объедините две схемы; используйте одну огромную таблицу, если вы чувствуете,что у вас будут массивные записи,которые трудно поддерживать, как facebook, gmail и т. д. и используйте другую таблицу для одного набора записей для простого система... ну это только мое мнение .. надеюсь, это поможет.. Просто сделай это..ты можешь это сделать... :)

обычный способ сделать это-использовать разные таблицы, как в схеме звезды или схеме снежинки. Howeevr, я бы основал эту стратегию, чтобы быть в два раза. Я верю в теорию, что данные должны существовать только в одном месте, там для схемы, которую я упомянул, будет хорошо работать. Однако я также считаю, что для механизмов отчетности и BI-пакетов столбчатый подход был бы чрезвычайно полезен, потому что он больше поддерживает потребности в отчетности. Столбчатые подходы, как те, с infobright.org имеют огромный прирост производительности и сжатия, что делает использование обоих подходов невероятно полезным. Многие компании начинают понимать, что наличие только одной архитектуры базы данных в организации не поддерживает весь спектр их потребностей. Многие компании реализуют как концепцию наличия более чем одной архитектуры базы данных.

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