[Moscow.pm] Размышления на тему ORM и вообще работы с БД
Peter Rabbitson
rabbit+moscowpm на rabbit.us
Пт Окт 28 06:41:11 PDT 2011
On Fri, Oct 28, 2011 at 05:37:00PM +0400, Михаил Шогин wrote:
> >
> > 28 октября 2011 г. 15:02 пользователь Михаил Шогин <mshogin at 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, я честно не знаю
Сделать можно... но ЗАЧЕМ?! Чем недостаточен
SELECT en.n FROM entities en WHERE en.status = 1
Подробная информация о списке рассылки Moscow-pm