2015-06-15 2 views
0

Я использую mysql, у меня есть таблица пользователей, которая содержит некоторую базовую информацию, такую ​​как имя, фамилия, возраст, пол и т. Д. Я хочу предоставить функцию, называемую профилем, где пользователь будет поместить другую информацию, такую ​​как местоположение работы, альтернативные контактные данные и т. д. Эти новые столбцы не фиксированы, в будущем мне может быть больше столбцов. Насколько мне известно, могут быть два подхода:хороший подход для периодического добавления столбцов в таблицу sql

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

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

Таблица 1: userId | firstName | возраст | ....

Таблица 2: columnId | columnName | dataType

Таблица 3: userId | columnId | значение

Какой будет хороший подход для моего сценария?

+0

Таблица 3 должна быть 'userId | columnId | value' –

+0

Пожалуйста, решите, какую базу данных вы фактически используете. –

+0

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

ответ

3

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

Есть еще по крайней мере два подхода не в списке:

  • магазин дополнительные поля в формате JSON или XML-строки в каждой записи.
  • Добавьте столбцы в вспомогательную таблицу, используя тот же первичный ключ.

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

  • Сколько профилей у вас?
  • Есть ли соображения производительности при добавлении новых столбцов?
  • Нужны ли индексы для новых столбцов?
  • Являются ли типы новых столбцов одинаковыми?
  • Нужны ли ссылки на внешние ключи для новых столбцов?
  • Необходимы или желательны другие ограничения?
  • Все ли профили предназначены для всех столбцов?
  • Будет ли количество столбцов профиля превышать максимальное количество столбцов таблицы?

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

+0

На самом деле будет много профилей (не менее 100 млн.). не требуется. Все типы столбцов будут разными (но если мы используем второй подход «EAV», его можно обрабатывать в коде). Ограничение внешнего ключа не требуется. Ранее созданный профиль также будет иметь вновь созданные столбцы, но с нулевым значение, пока пользователь не заполнит это значение. Число столбцов никогда не будет превышать максимальный предел. – Prometheus

+1

'похоже, очень правильный вопрос, только один без правильного ответа. 'Это один заслуживает +1. остальная часть вашего ответа заслуживает другого +1. –

Смежные вопросы