[Moscow.pm] Размышления на тему ORM и вообще работы с БД

Михаил Шогин mshogin на gmail.com
Пт Окт 28 06:37:00 PDT 2011


>
> 28 октября 2011 г. 15:02 пользователь Михаил Шогин <mshogin на gmail.com>написал:
>
>> У меня есть небольшой пример
>> ( пример связан с ORM Django, думаю что на ORM Perl также распространяется
>> )
>>
>> Имеем след таблицу
>> create table entities (
>>  n number,
>>  title varchar2(100),
>>  dsc clob,
>>  status number,
>>  fd date
>> )
>>
>> создаем индексы
>> create unique index ENTITIES$N on books ( n )
>> create index ENTITIES$N$STATUS on books ( n, status )
>>
>> status - доступность сущности ( 0 - доступна , null - не доступна )
>>
>
> Объясните, пожалуйста, разработчикам, что null означает "отсутсвие данных",
> только "отсутсвие данных" и ничего, кроме "отсутствия данных". Разработчики,
> работающие с базами данных, должны понимать, что "отсутсвие данных" не может
> быть использовано как "данные".
>
> В этом конкретном случае "запись недоступна" есть некоторые вполне
> определённые данные, и для этого статуса должно быть определено полне
> конкретное значение.
>
NULL - тоже значение.

Объяснение простое,
Поле выставляется в значение NULL для не попадания в индекс.

Согласен что было бы лучше сделать так
status - доступность сущности ( 1 - доступна , 0 - не доступна )

однако в таком случае пришлось бы строить индекс

create index ENTITIES$N$STATUSACTIVE on books (n, case when status = 1 then
1 else null end )

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

select en.n
  from entities en
where case
               when en.status = 1
               then 1
               else null
          end  = 1

как такое сделать используя ORM, я честно не знаю



>
>>  выбираем идентификаторы всех доступных сущностей
>>
>> SQL
>> select en.n
>>   from entities en
>> where en.status = 0
>>
>> план выполнения
>>
>>  INDEX FAST FULL SCAN INDEX ENTITIES$N$STATUS
>>
>> ORM
>> entities = Entity.objects.filter( status = 0 )
>>
>
> Про указание колонок уже упомянули.
>
Да, уже отписал по этому поводу

>
>
>> получится запрос
>> select en.*
>>   from entities en
>> where en.status = 0
>>
>> план
>> TABLE ACCESS FULL
>>
>> профит на лицо
>> + ко всему прочему следует отметить что записи со status = null в индекс
>> не попадут, так что профит еще больше чем просто "на лицо"
>>
>> Также можно построить индекс в который попадут только недоступные сущности
>> и выбирать используя этот индекс
>>
>>
>
> --
> Andrei Protasovitski
> < andrei[dot]protasovitski[at]gmail[dot]com >
> Diemen, Netherlands
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>


-- 
С уважением
Михаил Шогин.
Tel: +7 915 0311328
ICQ: 266776394
e-mail: shogin на corp.mail.ru
Интернет холдинг @mail.ru
www.mail.ru
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20111028/e73161c9/attachment-0001.html>


Подробная информация о списке рассылки Moscow-pm