Хорошее Мнение Формы Базы Данных

Хорошо, я создаю почтовое приложение, которое позволяет вам отправлять электронные письма людям, только если они отвечают определенным требованиям, например, возраст, местоположение или хобби.

Я не могу понять, где разместить эти два поля, чтобы моя база данных была должным образом нормализована (mail_pref_min_age | mail_pref_max_age).

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

заранее спасибо.

смотри пример

Таблица профилей

User id | username | mail_pref_min_age | mail_pref_max_age
1       | joe      |   25              | 50
2       | matt     | null              | null (this feels unnormalized to me)
3       | jake     | null              | null (this feels unnormalized to me)

Profilesmail таблица

settingsID | userID | mailsettingID
1          | 1      | 1
2          | 1      | 2

Почтовый стол

mailID | mailsetting
1      | must live in USA
2      | must live in Canada

2 ответа

Есть два вероятных способа сделать это: вы можете использовать нули, чтобы указать отсутствие верхнего / нижнего предела, или (как @mlt указано в комментариях), вы можете использовать "крайние" ненулевые значения, чтобы установить границы - например, 0 для минимального возраста и для максимального возраста (например, если это значение tinyint, для максимального возраста можно установить значение 255).

Некоторые плюсы и минусы:

  • Как отобразить минимальные / максимальные значения? Отображение 0 и 255 будет выглядеть глупо, вам понадобится специальный код обработки в вашем пользовательском интерфейсе, чтобы преобразовать (скажем) 255 в "без ограничений" - так же, как вам нужно было бы делать с нулями.
  • С нулями, вы должны включить логику трина (true, false, null) во все ваши проверки
  • С "экстремальными значениями" вы пропускаете логику трина (возраст от мин до макс, проверка нулями не требуется)
  • Большинство людей используют нули, потому что это воспринимается как более легкое, или "для чего нужны нули". В долгосрочной перспективе это может быть ошибкой.

В конечном итоге, если вы можете, я бы пошел с крайними ценностями, так как вы избегаете всех усилий и боли, которые обычно вызывает Nulls.

Формально отношение с любым обнуляемым полем даже не достигает 1NF. Кроме того, использование нулей делает вашу логику намного более сложной. Для решения этой проблемы вы можете использовать значения по умолчанию или извлечь mail_pref_min_age а также mail_pref_max_age в отдельные таблицы.

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