![]() |
Модераторы: Akella |
![]() ![]() ![]() |
|
Akella |
|
||||||||||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
FB 2.0
Есть таблица объектов, очень много полей. Основное поле это ID объекта - первичный ключ, остальные поля в данном случае нас не интересуют. Есть таблица телефонов, где нас интересуют поля TEL, ID_ARENDA и ID_MEDIATOR
Есть таблица посредников. Фактически такая же, как и таблица объектов, только поля другие. В таблице посредников нас тоже интересует ID посредника - первичный ключ. Таблица телефонов связана с таблицей объектов по внешнему ключу (ID - ID_ARENDA) Также таблица телефонов связана с таблицей посредников по внешнему ключу (ID - ID_MEDIATOR) ![]() Само собой, что посредники и объекты могут иметь практически неограниченное число номеров телефонов, хотя, как показывает практика их бывает 1-3 у объекта и значительно больше у посредника. Что требуется. В таблицу объектов требуется добавить поле "Посредник по номеру телефона", которое будет вычисляться на ходу - calculated. Т.е. нужно динамически вычислять название посредника, если номер телефона объекта совпал с номером телефона посредника. Я так подумал, что можно вычислять используя хранимую процедуру, т.к. много разных действий. Поле "Посредник по номеру телефона" будет отображать название посредника, основываясь на номере(ах) телефона(ов) объекта. Допустим у объекта есть номер 0667121717. И есть посредник с таким же номером. Т.е. физически в таблице телефонов живет 2 одинаковых телефона, только в полях ID_ARENDA и ID_MEDIATOR разные ID из разных таблиц. Как мне представляется и как уже реализовано: на вход процедуры получаем ID объекта, по этому ID вычисляем номер телефона объекта, а вернее список номеров телефонов, т.к. у объекта может быть 2-3 телефона:
Теперь соединением (inner join) через специальную процедуру ищем эти телефоны в таблице телефонов (опять пробегаемся по таблице телефонов), но с другим условием, чтобы поле ID_MEDIATOR было НЕ пустое, т.е. ищем посредников по условию: where phones.id_mediator is not null and phones.tel = номер телефона.
теперь внутри вложенного цикла нужно найти название посредника:
В целом последний цикл будет выглядеть так:
Таким образом получается очень много чтений. ![]() Что можно придумать, чтобы ускорить код? Структуры таблиц, ключей менять уже поздно. Ну разве что чуть-чуть. Вот полный код процедуры:
Также созданы доп. индексы для полей (ID_MEDIATOR+TEL) и (TEL + ID_ARENDA) в таблице телефонов. Ну в таблице посредников по полю name. фух... ну и наворотил. |
||||||||||||
|
|||||||||||||
tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: нет Всего: 8 |
Где наворотил?
Кода много, но он весь повторяющийся: простые выборки и описание агрегата list(all field, :separator). Это сообщение отредактировал(а) tishaishii - 17.1.2012, 06:25 |
|||
|
||||
Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 1 Всего: 54 |
-------------------- Кольцов Виктор Владимирович |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
вместо этого я использую inner join c процедурой, которая список превращает в виртуальную таблицу и можно соединиться с этой таблицей
http://forum.vingrad.ru/index.php?showtopi...t&p=2042046 Добавлено через 10 минут и 48 секунд Меня волнует, что мне приходится 2 раза в процедуре проходить таблицу телефонов. Первый раз для поиска номера телефона, а второй раз для поиска ID посредника :(, а таблица телефонов содержит почти 100 тыщ записей. |
|||
|
||||
tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: нет Всего: 8 |
Можно триггерами заполнять обычное поле (не calculated), тогда будут индексы.
Вместо unlist использовать формат
А ещё можно создать таблицу для поисковых запросов и таблицу для списков номеров из запроса, которая будет заполняться из unlist, каждая запись помечаться uuid, например. Индексы. Это сообщение отредактировал(а) tishaishii - 18.1.2012, 07:09 |
|||
|
||||
tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: нет Всего: 8 |
Не понятно для чего нужна unlist. Уж вести в таблице или в массиве.
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
Что/чего вести?
|
|||
|
||||
tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: нет Всего: 8 |
Имею в виду, можно номера телефонов вести в отдельной таблице с кодами и всяческой дополнительной аналитической информацией. Сохранять актуальность записи с помощью системы триггеров.
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
А телефоны и так в отдельной таблице.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Interbase" | |
|
Обязательно указание: 1. Версию InterBase (Firebird, Yaffil) 2. Способа доступа (ADO, BDE, IBX и т.д.)
Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Firebird, Interbase | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |