Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
спроектировали базу вот таким образом: таблица со списками вопросов: 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 или может быть есть какие-то другие более гибкие варианты решения этой задачи, с удовольствием выслушаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2004, 18:33 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
1. Использование битового поля оправдано только в том, случае, если предполагается ОЧЕНЬ большое количество отвечающих. В этом случае мы выигрываем в размере базы. В противном случае мы только теряем - в возможности строить быстрые sql запросы по ответам. 2. А вот меня мучает вопрос - можно ли как-то построить индекс для unswer_mask так, чтобы он использовался для поиска пользователей ответвиших определенным образом на некоторые вопросы ? То есть поиск всех пользователей для которых (answer_mask && maska_poiska)!=0 Зависит от сервера. Oracle позволяет строить индексы по функциям. Ms Sql - уже не помню. То ли может, то ли в Yukon обещали - надо уточнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2004, 11:12 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
Еще можно битовую маску ответов хранить как целое или строку. Если отбирать нужные значения не через &, а простым равенством, то индекс по этому полю будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2004, 11:56 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
используется PostgreSQL, возможно ли под ним такое ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2004, 15:37 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
пользователей действительно много, (~100000) и маску стали использовать именно для сокращения размера базы; (таблица с ответами пользователей содержит еще много других полей) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2004, 15:51 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
или, если это возможно, подскажите как сделать хоть с ущербом для объема ? главное - скорость поиска, ради этого я готов пойти на почти любые жертвы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 14:43 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
Насколько я помню битовые поля тем хороши, что если их несколько , то они хранятся рядом . Проще говоря, если одно битовое поле хапнет 1 байт, то восемь полей подряд хапнут тот же 1 байт, а шестнадцать полей хапнут два байта. Поэтому Вам имеет смысл хранить все ответы отдельно, причем можете старое поле answer_mask тоже оставить -- на размеры таблицы это повлияет незначительно. Но на всякий случай поэкспериментируйте с битовыми полями, и посмотрите как они влияют на размер таблицы именно у Вас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 16:50 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
не понял, что это должно дать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2004, 01:38 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
По отдельным битовым полям (отдельным ответам) вы сможете строить индексы и поиск должен значительно ускориться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2004, 11:31 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
елки зеленые, 20 новых полей ... и обозвать их как-то нужно .. :) можно конечно в отдельную таблицу впихнуть и заполнять ее триггером из первой таблицы, .. я тут задумался, 20 полей это ведь 20 индексов, а как хотелось все впихнуть в один индекс, эхх ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2004, 13:44 |
|
||
|
маска значений - да/нет
|
|||
|---|---|---|---|
|
#18+
Ну, двадцать полей обозвать нетрудно, например так: 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) ); Второй вообще идеальный вариант: любые запросы у Вас летать будут, но и в том и в другом случае увеличение размера таблицы на порядок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2004, 14:43 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32598560&tid=1546365]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 472ms |

| 0 / 0 |
