Задать вопрос
@ooooooooooooooo

Какое ваше отношение к таблицам с внешним ключам с NULL значением?

Привет! На картинке есть структура связей между моделями, задача простая.
Пользователю нужно выбрать страну, регион и город. Количество не ограничено, может выбрать к примеру 3 страны, 5 регионов и 10 городов.
Или выбрать только города, в этом случае столбцы Country и Subject будут иметь NULL.
Таблица LOCATIONS будет использована в выборке для рассылки EMAIL-сообщений и в фильтрах поиска на сайте
В интернете мнение расходятся, кто-то ЗА такой подход, кто-то ПРОТИВ, хотел бы узнать Ваше мнение646e5b1e4fe2b427852949.png
  • Вопрос задан
  • 162 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
@Mylistryx
А я за NULL! При ForeignKeys - корректное поведение, при unique - корректное поведение, при JOIN корректное поведение.
FK позволяют организовать целостность данных на уровне БД (CASCADE/RESTRICT/ SET NULL -это уже от бизнес логики) и там нет ON DELETE SET 123 или ON DELETE SET 0, что говорит само за себя, как и NULL значения при LEFT JOIN.
unique (column):
null
null
1
2
...
- и это нормальное и правильное поведение, т.е. значения уникальны, если они указаны. С 0 или суррогатным значением так не выйдет и будет расти еще один костыль.
По поводу экономии места - в нынешних реалиях, экономия на спичках.
Про обработку NULL / NOT NULL -если используется ORM либо обертка какая, то там это обычно реализовано прозрачно. К примеру Yii2: ArModel::findOne(['col' => null]) само развернет в нужный SQL код. В других фреймворках думаю тоже.
P.S. Имею ввиду MySQL, в других БД возможно по другому.
Ответ написан
Комментировать
Fernus
@Fernus
Техник - Механик :)
Вот, по-моему мнению, что должно быть главным критерием при проектировании структуры в данном случае:

Использование NULL для обозначения отсутствия значения может немного сохранить место, особенно для числовых типов полей, но и увеличить время выборки, если поле необходимо индексировать.


P.S.: Вам больше место жалко или производительность? :)

P.S.S.: Чем не устраивает 0 вместо NULL для чисел?

P.S.S.S.: В запросах один фиг будет фигурировать либо "IS NULL/NOT NULL", либо "<> 0"...заморочки одни и те же по сути...а вот разница в этом всём как - "лысый" и "бритый" :)

P.S.S.S.S.: Есть негласное правило...

NULL нафиг не нужен, если все его свойства не используются...


А вот какие оно имеет свойства:

Если вы сравниваете значение NULL с другим значением NULL или любым другим значением, результатом является то, что значение NULL каждого значения NULL неизвестно. Обычно значение NULL используется для указания того, что данные отсутствуют, неизвестны или неприменимы.


Но в данном случае у Вас по значению 0 и так будет понятно всё.

Вопрос: нафиг этот NULL ? Все его "плюсы" в данном случае не работают...

Ну и вот уже было тут:
https://qna.habr.com/q/463917

Выбор зависит от задач(и)...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
В более крупном масштабе это не работает. В географических справочниках и классификаторах есть одна
проблема. Адресная строка - неформализуема.

В разных странах и государствах после уровня страны например не всегда идут города или области. Там могут
быть более сложные объекты (федеральные земли, периферии). И хуже того они могут стоять на разных уровнях. Улицы одного города могут внезапно иметь двойников (после слияния поселков к примеру). Могут быть улица Ленина, проспект и бульвар и переулок того-же имени.

Вобщем если вы хотите иерархию - то можно делать иерархию. Но нельзя гарантировать жесткую типизацию для какого-то уровня. И с уникальностью - косяки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы