Каким должен быть тип столбца "срок действия", если в некоторых случаях он не имеет никакого значения? (пусто? ноль? 0000-00-00?)

У меня есть таблица с указанием пунктов, которые я использую в моем главном меню:

модель | display_name | подменю | активный

MYSQL:

CREATE TABLE `main_menu` (
  `model` varchar(255) NOT NULL COMMENT 'name of the model',
  `display_name` varchar(255) NOT NULL,
  `sub_menu` enum('Fruits','Vegtables','Grains','Breads','Snacks','Sweets') DEFAULT NULL,
  `active` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

пример:

model   | display_name  | sub_menu  | active
---------------------------------------------
potato  | Potato        | Vegtables | 0
apple   | Apple         | Fruits    | 1
pumpkin | Pumpkin       | Vegtables | 1
  • Я хочу добавить дату истечения срока действия ("exp_date").
  • Не все строки имеют срок годности.

Какой должен быть тип exp_date? Очевидно, "Дата".. но в тех случаях, когда для определенной строки не существует exp_date, что считается "хорошей практикой"? Вставка NULL? вставка 0000-00-0?

model   | display_name  | sub_menu  | active    | exp_date
--------------------------------------------------------------
potato  | Potato        | Vegtables | 0         | NULL
apple   | Apple         | Fruits    | 1         | NULL
pumpkin | Pumpkin       | Vegtables | 1         | 2019-03-01

Использование MySQL 5.7 и может перейти на новую версию 8. Я просто хочу убедиться, что я делаю это правильно. Я помню (не уверен, откуда), что типы даты и значения даты в проблеме, и есть правильный способ сделать это.

2 ответа

Решение

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

SELECT model, display_name, sub_menu, active, exp_date
FROM main_menu
WHERE exp_date > NOW() OR exp_date IS NULL;

Использование NULL если вы еще не знаете exp_date и используете 9999-12-31 (максимальное поддерживаемое значение для даты), если срок действия строки не истек.

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