powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / маска значений - да/нет
11 сообщений из 11, страница 1 из 1
маска значений - да/нет
    #32598166
vazhnecki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спроектировали базу вот таким образом:

таблица со списками вопросов:
table questions
(
question_id int,
question_text TEXT,
);

это таблица из не более чем 20 вопросов,
содержит к примеру данные:
(1, "question1 text" );
(2, "question2 text" );
(3, "question3 text" );
..
(20, "question20 text" );

Ответом на вопрос может быть только "да" или "нет";

есть таблица пользователей, в ней хранятся ответы пользователей на вопросы,
ее вид:

table user_answers
(
user_id int,
answer_mask bit(20),
);

answer_mask - это битовая маска для хранения ответов на вопросы,
1й бит - ответ на первый вопрос (0-нет, 1-да), 2й - на второй и т.д.


А вот меня мучает вопрос - можно ли как-то построить индекс для unswer_mask так, чтобы он использовался для поиска пользователей ответвиших определенным образом на некоторые вопросы ? То есть поиск всех пользователей для которых (answer_mask && maska_poiska)!=0

или может быть есть какие-то другие более гибкие варианты решения этой задачи, с удовольствием выслушаю.
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32598459
demas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Использование битового поля оправдано только в том, случае, если предполагается ОЧЕНЬ большое количество отвечающих. В этом случае мы выигрываем в размере базы. В противном случае мы только теряем - в возможности строить быстрые sql запросы по ответам.

2. А вот меня мучает вопрос - можно ли как-то построить индекс для unswer_mask так, чтобы он использовался для поиска пользователей ответвиших определенным образом на некоторые вопросы ? То есть поиск всех пользователей для которых (answer_mask && maska_poiska)!=0

Зависит от сервера. Oracle позволяет строить индексы по функциям. Ms Sql - уже не помню. То ли может, то ли в Yukon обещали - надо уточнить.
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32598472
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Еще можно битовую маску ответов хранить как целое или строку.
Если отбирать нужные значения не через &, а простым равенством, то индекс по этому полю будет работать.
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32598553
vazhnecki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
используется PostgreSQL, возможно ли под ним такое ?
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32598560
vazhnecki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пользователей действительно много, (~100000)
и маску стали использовать именно для сокращения размера базы;

(таблица с ответами пользователей содержит еще много других полей)
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32599787
vazhnecki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или, если это возможно, подскажите как сделать хоть с ущербом для объема ?
главное - скорость поиска, ради этого я готов пойти на почти любые жертвы :)
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32600132
Николай МВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я помню битовые поля тем хороши, что если их несколько , то они хранятся рядом . Проще говоря, если одно битовое поле хапнет 1 байт, то восемь полей подряд хапнут тот же 1 байт, а шестнадцать полей хапнут два байта. Поэтому Вам имеет смысл хранить все ответы отдельно, причем можете старое поле answer_mask тоже оставить -- на размеры таблицы это повлияет незначительно.

Но на всякий случай поэкспериментируйте с битовыми полями, и посмотрите как они влияют на размер таблицы именно у Вас.
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32600688
vazhnecki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не понял, что это должно дать ?
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32601191
Николай МВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По отдельным битовым полям (отдельным ответам) вы сможете строить индексы и поиск должен значительно ускориться.
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32601704
vazhnecki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
елки зеленые, 20 новых полей ... и обозвать их как-то нужно .. :)
можно конечно в отдельную таблицу впихнуть и заполнять ее триггером из первой таблицы, ..

я тут задумался, 20 полей это ведь 20 индексов, а как хотелось все впихнуть в один индекс, эхх ...
...
Рейтинг: 0 / 0
маска значений - да/нет
    #32601885
Николай МВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, двадцать полей обозвать нетрудно, например так: bit_1, bit_2...., bit_N. :)

Ну вот Вам другой вариант: пусть каждый ответ пишется отдельной строкой:
например:
table user_answers
(
user_id int,
answer_mask bit(20),
answer_mask2 int
);

Вопрос_1: да 11, нет 10
Вопрос_2: да 21, нет 20
...
Вопрос_N: да N*10+1, нет N*10

Или так:
table user_answers
(
user_id int,
answer_mask bit(20),
question_id int,
answer bit(1)
);

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


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