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