Сколько столбцов таблицы базы данных слишком много?

Я взял на себя разработку проекта, в котором есть пользовательская таблица с более чем 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, которую вы описали, является наихудшей как с точки зрения эксплуатационной надежности, так и с точки зрения производительности. Очень сложно написать достойные запросы к этой модели.

Это действительно зависит от того, что вы пытаетесь сделать.

Другие вопросы по тегам