Сколько столбцов таблицы базы данных слишком много?
Я взял на себя разработку проекта, в котором есть пользовательская таблица с более чем 30 столбцами. И плохо то, что изменения и дополнения в колонках продолжают происходить.
Это не правильно.
Должен ли я нажать для перемещения дополнительных полей во вторую таблицу в качестве значений и создать третью таблицу, в которой хранятся имена этих столбцов?
user
id
email
user_field
id
name
user_value
id
user_field_id
user_id
value
6 ответов
Не ходите ключ / значение маршрута. SQL не предназначен для этого, и он сделает извлечение реальных данных из вашей базы данных самообучением. (Примеры: индексы не работают хорошо. Присоединения - это очень весело, когда вам нужно присоединиться только для того, чтобы получить данные, к которым вы присоединяетесь. Это продолжается.)
Пока данные нормализованы до достойного уровня, у вас не будет слишком много столбцов.
РЕДАКТИРОВАТЬ: Для ясности, есть некоторые проблемы, которые могут быть решены только с ключом / значением маршрута. "Слишком много столбцов" не является одним из них.
Трудно сказать, сколько это слишком много. Это действительно очень субъективно. Я думаю, что вопрос, который вы должны задать, не "слишком много столбцов?", А скорее "принадлежат ли эти столбцы здесь?" Я имею в виду, что если в вашей таблице User есть столбцы, которые не обязательно являются свойствами пользователя, они могут не принадлежать. Например, если у вас есть несколько столбцов, которые суммируют адрес пользователя, то, возможно, вы извлекаете их в таблицу адресов с FK в User.
Я бы не стал использовать таблицы ключ / значение, если это возможно. Это может показаться простым способом сделать вещи расширяемыми, но на самом деле это просто боль в долгосрочной перспективе. Если вы обнаружите, что ваша схема меняется очень последовательно, вы можете рассмотреть вопрос о том, чтобы установить какой-то элемент управления изменениями для проверки изменений только тех, которые необходимы, или перейти на другую технологию, которая лучше поддерживает хранение без схемы, например NoSQL с MongoDB или CouchDB.
Изменения и дополнения в таблице не являются плохой вещью, если они означают, что они точно отражают изменения в ваших бизнес-требованиях.
Это часто называют EAV, и то, подходит ли это для вашей базы данных, зависит от множества факторов:
http://en.wikipedia.org/wiki/Entity-attribute-value_model
http://karwin.blogspot.com/2009/05/eav-fail.html
http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back
Слишком много столбцов на самом деле не одна из них.
Если изменения и дополнения являются постоянными, то, возможно, вам нужно сесть и лучше определить требования. Теперь я не могу сказать, слишком ли много 30 столбцов, потому что это зависит от их ширины и от того, должны ли они быть перенесены в связанную таблицу. Например, если у вас есть поля, такие как phone1, phone2, phone 3, у вас есть беспорядок, который нужно разбить на связанную таблицу для user_phone. Или, если все ваши столбцы широкие (а общая ширина таблицы шире, чем на страницах, в которых хранятся данные), а некоторые не так часто нужны для ваших запросов, они могут быть лучше в связанной таблице, в которой есть однозначный список. одно отношение. Я, вероятно, не сделал бы этого, если у вас нет реальной проблемы с производительностью.
Однако из всех возможных вариантов модель EAV, которую вы описали, является наихудшей как с точки зрения эксплуатационной надежности, так и с точки зрения производительности. Очень сложно написать достойные запросы к этой модели.