Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индекс на bit / 2 сообщений из 2, страница 1 из 1
26.12.2007, 09:10
    #35034200
arrrght
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс на bit
День добрый!

Подготовка к задаче:

Возьмем chmod - по идее это обычный int, разбитый по битам - rwxrwxrwx, так?
т.е. таблица chmod(id integer, u0 integer) - ID файла и его доступ.
Доступ это включенные биты (считаю от конца):
первый - выполнение для всех
второй - запись для всех
третий - чтение для всех
четвертый - выполнение для группы
и.т.д

Чтобы включить запись на чтение для создателя накладываем на него маску -
Код: plaintext
update chmod set u0=u0 | B'001000000'::integer;
Чтобы посмотреть все файлы на которые я имею доступ на чтение и запись:
Код: plaintext
select * from chmod where u0&B'011000000'::integer = B'011000000'::integer;

все ОК
Сразу скажу chmod - это только пример, не стоит задача забить все файлы чтобы было проще искать.

Идем дальше - допустим есть ещё одна группа group1 - назначаем ей биты 10,11,12:
Код: plaintext
select * from chmod where u0&B'010000000000'::integer = B'010000000000'::integer;
Покажет на какие файлы группа group1 имеет доступ на запись - все просто, и эти группы я могу добавлять до бесконечности - не хватит 31 бита, добавлю поле u1 и буду писать туда - вопросов нет.

Вопрос в другом:
Как мне проиндексировать поле u0? - ведь при выборке по маске u0 & B'01100'::integer - никакие индексы не учитываются.

PS: написал u0 & B'01001'::integer для понятности, в реале я конечно буду искать u0 & 9.
PS2: назначения bit(10) так и не понял. Во-первых - индекс на него тоже не работает при select-е, а вот при добавлении новой группы или просто отдельного права придётся перестраивать всю таблицу и менять сам select для выравнивания по кол-ву бит - жутко неудобно.
...
Рейтинг: 0 / 0
26.12.2007, 10:29
    #35034395
av1985
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс на bit
arrrght
Как мне проиндексировать поле u0? - ведь при выборке по маске u0 & B'01100'::integer - никакие индексы не учитываются.

create index ... on chmod ((u0&B'0000000001'::integer...

или

create index ... on chmod (u0) where u0&... ::bool;

ну и выборку соотвественно для каждого случая в своей манере.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индекс на bit / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]