powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Связка со справочником: View, Computed By или на клиенте?
11 сообщений из 11, страница 1 из 1
Связка со справочником: View, Computed By или на клиенте?
    #32261082
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем, привет.

В наличии

TableMain (id integer, ref1_id, ref2_id)
TableRef1(id integer, name varchar(10))
TableRef2(id integer, name varchar(10))

Что лучше:

a) Create view ... as
Select tm.id,
tm.ref1_id, tr1.name,
tm.ref2_id, tr2.name
from
TableMain tm
left join TableRef1 tr1 on tm.ref1_id=tr1.id
left join TableRef2 tr2 on tm.ref2_id=tr2.id

и работать с view

или

b) alter table TableMain
add ref1_name computed by
(select tr1.name from TableRef1 tr1 where tr1.id=ref1_id)

alter table TableMain
add ref2_name computed by
(select tr2.name from TableRef2 tr2 where tr2.id=ref2_id)

и работать с таблицей

или

с) писать связующие запросы на клиенте ?
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32261093
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы использовал способ с. Способ б не рекомендуется, когда-то я даже знал, почему, но забыл :-(((
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32261301
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Способ "б" однозначно не использовать
Есть еще варианты
d)
create procedure ...
for Select tm.id, tm.ref1_id, tr1.name, tm.ref2_id, tr2.name
from
TableMain tm
left join TableRef1 tr1 on tm.ref1_id=tr1.id
left join TableRef2 tr2 on tm.ref2_id=tr2.id
into :id, :ref1_id, :ref1_name, :ref2_name
do suspend;

e)
Select tm.id, tm.ref1_id, tr1.name, tm.ref2_id, tr2.name
from
TableMain tm
left join TableRef1 tr1 on tm.ref1_id=tr1.id
left join TableRef2 tr2 on tm.ref2_id=tr2.id
И кстати почему left join? Таблицы не связаны?
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32261415
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Denis Uskov:

left join т.к. м.б. null в главной таблице

ХП совсем не нравится, т.к. если не писать на клиенте весь запрос, то хотелось бы иметь возможность использовать результат как отношение, а с ХП там то ли какие-то ограничения, то ли план не оптимален получается

Еще один вопрос всем.
Верно ли следующее:
при создании view, компилируется его код, включая план запроса, и даже если впоследствии, например, добавить в базу индекс, то View его использовать не будет, пока не сделаешь drop-create.
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32261460
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как план не должен компилиться. Ты возьми и проверь и нам расскажи. Я бы и сам поверил, да зянят очень.
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32261523
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал.
Не верно.

2 Gold:
Спасибо за совет ;-)
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32261532
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, вот видишь, сколько пользы! Боле того, старые версии сервера допускали при создании представления явно указывать план запроса, так этот план вобще игнорируется, если мне память не изменяет, и индексы используются в зависимости от контекста, в котором это представление использовано.
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32261581
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль только, что в случае
a)
если TableRef1.id - primary (а значит и unique) key и учитывая объединение по left join во View, запрос вида:

select v.TableMain_id from OurView v

все равно заставит сервер читать записи в таблице TableRef1 и проиграет запросу

select id from TableMain

И не задумывался бы я больше над тем остановиться на варианте a (облегчив жизнь прикладникам) или на c (заставив их самих писать Query.SelectSQL и выигрывая в производительности за счет "штучности", а значит и оптимальности запросов).
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32263225
koff4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть не совсем в тему, но я в таких случаях часто использую несколько экзотический и, возможно спорный способ. Так что попрошу сразу ногами не бить!!!

1) alter table TableMain
add ref1_name varchar(30) - не Computed, а самое обычное!!!
2) Привязываем ref1Id,ref1_Name при помощи внешнего ключа c Update-action к Table_Ref1
3) При изменении записи организую работу со справочником средствами приложения.

То есть в таблице ФИЗИЧЕСКИ имеется поле результатата, инициализирующееся при изменении данных (Pre-Computed). Целостность данных обеспечивается как сервером (через Referential Integrity), так и клиентом (на этапе изменения записей).
Упрощаются (и ускоряются) соответствующие выборки. Правда усложняются (и замедляются) процессы изменение данных и вырастает объем базы.
Способ этот я выдумал не сам, а позаимствовал из одно промышленной системы. Там, как я думаю, он применялся именно для ускорения выборок.
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32263521
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koff4
Может я чего не понимаю,
но зачем тогда ref1_id в главной таблице и id в подчиненной?
Не достаточно ли просто ref1_name и name соответственно?
...
Рейтинг: 0 / 0
Связка со справочником: View, Computed By или на клиенте?
    #32264927
koff4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Accue:
ref1_id и id используются при контроле ссылочной целостности (CASCADE UPDATE). То есть если в tableRef1 изменить name - тут же изменятся соответствующие значения ref1_name в Table_main.
Хотя, если name является одновременно является первичным ключом, тогда ты прав.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Связка со справочником: View, Computed By или на клиенте?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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