NULL или ноль/пустая строка?

Духовность™

Продвинутый новичок
NULL или ноль/пустая строка?

В базе есть поле last_visit типа int в котором хранится timestamp. Когда запись вставляется в базу, timestamp не определен, свойство объекта имеет значение NULL.
В виду того, что сложный слой оперирующий с базой приводит переменные к числовому или строковому типу, в базу пишется ноль - 0. Повлиять на это я не могу - запросы руками не пишутся.

У меня вопрос к сообществу - а насколько правильно писать в базу такие значения как ноль и пустая строка при отсутствии этих значений, т.е. когда переменная равна NULL?

Вот, например, поле типа int хранит timestamp. Свойство не определено. Можно записать NULL, можно ноль. Разницы как бы никакой, но разница есть.

Или поле URL-адрес типа varchar. Свойство не определено. Можно записать NULL, можно пустую строку. Разницы как бы никакой, но разница есть.

Ваши мысли? Как вы делаете?
 

fixxxer

К.О.
Партнер клуба
timestamp 0 это вполне конкретное значение, 1970-01-01 00:00:00 UTC.

-~{}~ 11.05.10 18:32:

В виду того, что сложный слой оперирующий с базой приводит переменные к числовому или строковому типу
Ну, эммм. Как бы тебе сказать, чтобы не обидно было. :) Вообще null-значение предусматривают все нормальные orm/query builder-ы.
 

Духовность™

Продвинутый новичок
Вообще null-значение предусматривают все нормальные orm/query builder-ы.
в смысле? что ты имеешь в виду?

а почему так,а не просто тип timestamp?
потому, что мне не удобно работать с форматом timestamp mysql
не надо на частности отвлекаться

-~{}~ 11.05.10 19:08:

Я не очень наверно понятно выразился.

Есть поле в БД типа int default null
Из POST приходит переменная содержащая 0. КАК научить слой определять, ЧТО писать в базу - 0 или NULL?
 

fixxxer

К.О.
Партнер клуба
Ну у меня так примерно

$this->Form
->addField('timestamp', new Field_Scalar)
->addFilter('timestamp', new Filter_NullifyEmpty)

Другой вариант - сделать это на уровне модели.
 

AmdY

Пью пиво
Команда форума
должно быть фиолетово что пишется, ты пытаешь на поле повесить много логики, заведи ещё одно. тем более на дефолтное значение поля надеяться не стоит, не разноси логику между моделью и бд.

fixxxer
как ты решаешь вопрос валидации
1. отдельный компонент
2. на уровне модели
3. на уровне формы
У меня на ум приходит только передача валидаторов с формы модели или наоборот, а те, уже добавляют свои условия.
PHP:
$user = new User();
$user->addField('login', array(Validate::T_LENGTH => array(0, 100)); // это вызывается где-то в дебрях модели, сюда сунул для наглядности
$form = new Form();
$form->addField('login', array(Validate::T_EMPTY);
$form->setValidators($user->getValidators());
так мне больше нравится
PHP:
$user = new User();
$user->addField('login', array(Validate::T_LENGTH => array(0, 100)); 
$form = $user->getForm();
$form->addField('login', array(Validate::T_EMPTY);
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Из POST приходит переменная содержащая 0. КАК научить слой определять, ЧТО писать в базу - 0 или NULL?
Непонятно. Тебе нужна валидация, или подгонка значений? если постом пришел ноль - надо в базу, реально, писать ноль. Или если ноль писать нельзя - выдать ошибку. - это и есть валидация.
 

AmdY

Пью пиво
Команда форума
флоппик
насколько я понял, там возможны три варианта - точное время, ноль и нулл. а в зависимости от === делает логика.
 

akd

dive now, work later
Команда форума
AmdY, вот только непонятно что там делает этот 0 :)

по теме: мой "велосипед", смотрит на декларацию поля, если оно может быть null и значение из поста - пустое, подставляем NULL И запихиваем его в базу именно так, иначе, в случае INT - intval().
 

fixxxer

К.О.
Партнер клуба
AmdY
да особо никак не решаю. ну то есть я предпочту не говорить как я решаю, бгг.

ваще прихожу к мнению, что надо для каждой сущности иметь value object с observer-ами на изменение значений, которых может быть скока хош.
 

AmdY

Пью пиво
Команда форума
вот я тоже никак не решаю :(, делаю отдельную форму. подумываю подцепить валидаторы к модели, но это уже по взрослому получится, а хочется фреймворк для детей.

akd
я как то сам мутил отдачу заданий воркерам
NULL - свежесозданной или на каждую итерацию
0 - отработанные
с временем - время следующего запуска
затем понадобилось 4-е положение и добавил поле таки :(
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
с "$form = $user->getForm(); " могут быть серьезные осложнения
в форме могут быть нужны данные не только пользователя, не все данные, или данные разделяются на несколько форм

-~{}~ 12.05.10 03:31:

>сложный слой оперирующий с базой приводит переменные к числовому или строковому типу

этот слой не позволяет для конкретного случая составить запрос тектом?
 

Духовность™

Продвинутый новичок
этот слой не позволяет для конкретного случая составить запрос тектом?
позволяет, но у меня не конкретный случай, а случай, когда запросы составляются автоматически на основании массива/объекта и его свойств. Т.е. так:
PHP:
// сохраняем объект на строку таблицы БД
protected final function insertSimpleRowObject($object)
{
    $sql = 'INSERT INTO `'.$this->db_table_name.'` SET ';
    $args = array();

    foreach ($object->getData() as $key => $value)
    {
        $options = $object->getMapItem($key);

        if ($options['db_element'])
        {
            if (is_object($value))
            {
                if ($value instanceof DateTime)
                {
                    $sql .= '`'.$options['db_field_name'].'` = ?i, ';
                    $args[] = $value->getTimestamp();
                }
            }
            else
            {
                if ($value !== NULL)
                {
                    $sql .= '`'.$options['db_field_name'].'` = "?s", ';
                    $args[] = $value;
                }
                else
                {
                    $sql .= '`'.$options['db_field_name'].'` = NULL, ';
                }
            }
        }
    }

    $sql = rtrim($sql, ', ');

    array_unshift($args, $sql);

    call_user_func_array(array($this->db, 'query'), $args);

    $object->id = $this->db->getInsertId();
}
если постом пришел ноль - надо в базу, реально, писать ноль.
давайте разберем более простой пример. есть набор текстовых полей, в т.ч. полей не обязательных к заполнению. когда приходит POST, то не переменные, относящиеся к незаполненным полям имеют пустую строку в своем значении. вопрос - что писать в базу - эту пустую строку или NULL? А главное, как научить слой распознавать, когда надо писать NULL, а когда реальные значения, пусть даже пустые строки или нули? Не вручную же каждое поле проверять. Или всё же надо писать в довес к обычным валидационным фильтрам т.н. санитарные, по типу как в Sanitize filters?
 

Fortop

Новичок
А главное, как научить слой распознавать, когда надо писать NULL, а когда реальные значения, пусть даже пустые строки или нули?
Никак.
Только указывать явно, что должен быть вставлен NULL

Можешь попытаться сделать интеллектуально на основе table schema и если поле может быть NULL, то его и вставлять, но это никак не решает вопрос вставки пустой строки '' в таблицу где разрешены NULL значения.
 

baev

‹°°¬•
Команда форума
А какая разница для строк — пустая строка или NULL?
Всё равно при выдаче записей NULL'евые значения будут пустыми строками заменяться.

А для чисел всё просто: если в переменной пустая строка, то пишем в базу NULL. Если в переменной ноль, то и пишем «0».
 

Духовность™

Продвинутый новичок
А какая разница для строк — пустая строка или NULL?
ну идеологически разница есть. я поэтому и озаботился этим вопросом. кстати, а по размеру что там больше - null или пустая строка? )
 

AmdY

Пью пиво
Команда форума
baev
+1

grigori
да, разные формы, возможно, через наследование и выбирать $form = $id ? $user->getForm('onUpdate') : $user->getForm('onCreate');
вопрос в том, насколько такое доменное поведение усложнит понимание?
 

baev

‹°°¬•
Команда форума
ну идеологически разница есть
— как её при выводе значений увидеть?

P. S. Да и при вводе — тоже.
Что — будет выпадающий список с вариантами: «это — пустая строка», «а это — NULL»?..
 

FB3

Новичок
triumvirat
чисто по логике null должен быть меньше по размеру
 
Сверху