Index · Правила · Поиск· Группы · Регистрация · Личные сообщения· Вход

Список разделов Компьютерный раздел
 
 
 

Раздел: Компьютерный раздел задачка для программиста - включаем мозг с утра :) 

Создана: 15 Ноября 2010 Пон 8:55:07.
Раздел: "Компьютерный раздел"
Сообщений в теме: 6, просмотров: 1254

  1. 15 Ноября 2010 Пон 8:55:07
    собственно у меня мозг не включается, нужна помощь Смайлик :-)

    не могу решить задачку, связанную с выбором из таблицы на 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 с булевыми значениями, но это как-то громоздко, что-ли. хотелось бы по возможности обойтись одним полем.
  2. 15 Ноября 2010 Пон 9:24:00
    endi писал :
    не могу решить задачку, связанную с выбором из таблицы на sql в access

    select * from tabulya where field like '\%переменная\%'
    Это чистый SQL, в акессе возможно надо будет синтакис подправить
  3. 15 Ноября 2010 Пон 9:44:58
    KaraKodil писал(а) ? :

    точно. совсем забыл про этот оператор.
    надо чаще кодить :)))
    спасибо
  4. ник


    Хранитель


    Более 10 лет на форумеМуж.
    15 Ноября 2010 Пон 9:52:45
    Для запроса из примера мощность операции будет 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.
  5. 15 Ноября 2010 Пон 10:14:34
    ник писал : Для запроса из примера мощность операции будет N (записей в таблице), при том что на кажду запись будет делаться минимум 6 строковых сравнений. Хотя бы при 10000 записей - будет полный п...ц по производительности.
    Ну уж не сгущайте краски , для любой средней офисной машинки протрясти 10 тыс записей - это как два байта переслать )))
    ник писал : Like '\%xxx\%' не оптимизируется по индексам в отличие от like 'x\%'
    Делать индексы по строковым полям - это вообще некошерно.Тут уж надо прорабатывать архитектуру базы или гнать ссаной тряпкой автора структуры

    ник писал :
    Правильно такую задачу решать надо так: ....
    Полнотекстовый поиск в базах данных вообще отдельная наука )) и решается по разному на разных серверах

    ник писал :
    На два порядка меньше. И рост будет уже не линейный. При 100K записей операций станет всего ~320.
    200 тысяч записей строковое поле 50 знаков (ест-нно не индексное) выборка по одной букве типа like '\%А\%' итог=47 мсек
  6. ник


    Хранитель


    Более 10 лет на форумеМуж.
    15 Ноября 2010 Пон 10:33:09
    Мне жаль вашего работодателя.