задачка для программиста - включаем мозг с утра :)
Создана: 15 Ноября 2010 Пон 8:55:07.
Раздел: "Компьютерный раздел"
Сообщений в теме: 6, просмотров: 1277
-
собственно у меня мозг не включается, нужна помощь
не могу решить задачку, связанную с выбором из таблицы на sql в access
есть 6 значений, которые пока можно закодировать как угодно, 1 2 3 4 5 6 или A B C D E F. пока примем буквенное обозначения.
есть переменная var1, которая может принимать любое из этих значений.
например var1 = "A", или var1 = "С"
есть таблица с 2 колонками: ID, field.
так вот поле field должно содержать любое сочетание из A B C D E F например
| ID | field |
----------------
| 1 | AB |
| 2 | ACD |
| 3 | D |
| 4 | DEF |
нужно организовать выбор строк, в которых встречается в поле field переменная var1.
можно ли сделать это с вышеуказанной организацией хранения данных, или нужно что-то переделывать (пока вижу вариант -вместо одного поля field использовать 6 с булевыми значениями, но это как-то громоздко, что-ли. хотелось бы по возможности обойтись одним полем. -
-
Для запроса из примера мощность операции будет N (записей в таблице), при том что на кажду запись будет делаться минимум 6 строковых сравнений. Хотя бы при 10000 записей - будет полный п...ц по производительности. Like '\%xxx\%' не оптимизируется по индексам в отличие от like 'x\%'
Правильно такую задачу решать надо так:
Есть словарь значений 'a', 'b', 'c' ... сколько надо
field должен быть преобразован в связку
table.id (1) - (*) [cross.id, cross.value] (*) - (1) dictionary.id
id, пара cross.id, cross.value и dictionary.id - первичные ключи
cross.id->table.id и cross.value к dictionary.id -> foreign keys
тогда выборка будет выглядеть хотя бы так
select * from table where exists (select id from cross where value=$variable)
тогда выборка будет иметь приличный размер log2(n)xlog2(m) (n - sizeof table, m - sizeof cross, max(m) = n * d, где d - sizeof dictionary). И на 10000 записей мощность будет уже не 10000, а всего лишь log2(10000) x log2(60000) или ~210. На два порядка меньше. И рост будет уже не линейный. При 100K записей операций станет всего ~320. -
Ну уж не сгущайте краски , для любой средней офисной машинки протрясти 10 тыс записей - это как два байта переслать )))ник писал : Для запроса из примера мощность операции будет N (записей в таблице), при том что на кажду запись будет делаться минимум 6 строковых сравнений. Хотя бы при 10000 записей - будет полный п...ц по производительности.
Делать индексы по строковым полям - это вообще некошерно.Тут уж надо прорабатывать архитектуру базы или гнать ссаной тряпкой автора структуры
Полнотекстовый поиск в базах данных вообще отдельная наука )) и решается по разному на разных серверах
200 тысяч записей строковое поле 50 знаков (ест-нно не индексное) выборка по одной букве типа like '\%А\%' итог=47 мсекник писал :
На два порядка меньше. И рост будет уже не линейный. При 100K записей операций станет всего ~320. -