Хранение столбцов, которые часто добавляются / удаляются

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

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

Итак, я мог бы:

  1. Сохранить настройки в виде столбцов (user_image_url как варчар, time_offset как int, background_color как varchar и т. д.) с учетной записью пользователя в качестве первичного ключа. Мне не нравится идея добавления другого столбца при появлении нового параметра (и, возможно, с десятками столбцов), но я думаю, что это самый простой, быстрый и наиболее очевидный способ.
  2. Создайте таблицу, в которой хранятся только идентификатор учетной записи, идентификатор настройки и значение настройки в качестве varchar. Итак, что-то вроде (account_id, setting_id, value) values (1, 2, 'http://logos.com/yourlogo.png'), Идея состоит в том, чтобы присоединиться к нему с settings таблица, которая хранит setting_id, Большим недостатком этого (что я вижу) является то, что каждый параметр должен быть одного типа (varchar). Я не уверен, что это укусит меня в задницу позже.

Спасибо!

2 ответа

Решение

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

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

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

Наконец, вы можете решить проблему с типом, имея несколько столбцов - как правило, varchar, float (какой-то) и datetime - вместе со столбцом типа. Таким образом, вы можете напрямую хранить значения. Если вы идете varchar маршрут, убедитесь, что вы храните даты в формате ISO YYYY-MM-DD (вы можете опустить дефисы, если хотите).

Вариант 1 нарушает первую нормальную форму проектирования реляционной базы данных. Вариант 2 - лучший путь. Есть много доступных объяснений первой нормальной формы, доступных в Интернете - это самое простое, что я нашел: http://www.andrewrollins.com/2009/08/11/database-normalization-first-second-and-third-normal-forms/

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