CftClub.ru
Клуб специалистов ЦФТ-Банк

Родительские и дочерние таблицы
На страницу Пред.  1, 2, 3  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеВт Янв 22, 2013 08:35    Ответить с цитатой
Полезность: Нет оценки
Random пишет:


Соответствие реквизитов модели и столбцов в таблице можно посмотреть на закладке "Таблица" при просмотре класса.

Переименовывал, наверное, реквизиты? Рекомендую перестроить обе таблицы, родительскую и дочернюю.


Там смотрел - всё красиво. Ничего не переименовывал, с 0 ручками создавал Smile
Перестроил родительскую таблицу - всё заработало. Мерси огромное!
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеВт Янв 22, 2013 09:06   Re: Родительские и дочерние таблицы Ответить с цитатой
Полезность: Нет оценки
Random пишет:

А затем, что таково свойство родительских таблиц.
Говорю ж, в дочерней табличке есть констрейнт на родительскую.
Например, посмотри у клиентов.
Есть клиент. Абстрактный клиент, непонятно, банк или физик.
У банка не может быть ФИО, у клиента - SWIFT-кода. Но у того и другого есть дата заведения клиента в базе.
Физик и Банк - потомки одного родительского класса Клиенты. Идентификатор Физика (значение поля id таблицы z#cl_priv) должен присутствовать в поле id таблицы z#client согласно констрейнту FK_Z#CL_PRIV_ID. Должен и точка.


Так и у меня аналогично получается, что у таблиц 1-41 все обязаны иметь ссылку на клиента + одинаковый ID выгрузки по клиенту. Дополнительно имеют кучу своих собственных реквизитов (форматы выгрузки). Или я чего то не догоняю, в чём отличия?

Random пишет:

Соответсвенно, в дочернюю таблицу нельзя вставить данные, не вставив их предварительно в родительскую таблицу, и наоборот, удалить из родительской, не удалив из дочерней, нельзя.
Кроме того, если удалять данные только из дочерней, не удаляя из родительской, будет то самое "неконсистентное" удаление, за последствия такого действия... короче, я хз что случится. Как самое малое, системные вьюшки перестанут работать.


Уболтал Smile Могу предположить, что через делете дочерней таблицы чистится всё в дочерней, а в родительской остается мусор от этих удалений (проверить не могу, нет доступа через какой нибудь SQL навигатор т.к. база на аутсорте). Как бэ ничего страшного, но не красиво и засирается табличное пространство. Просто хотелось меньше писанины. Переделаю на update, смысел в том, что мне надо занулить (сбросить) 41 параметр из 43 (2 из родительской их нужно тогда оставить). Есть способ присвоить 41 параметру NULL, а 2 не трогать? Кроме как просто в update set их все перечислить.

Random пишет:


yaffil пишет:

Собственно оно так и предполагается. Предлагаешь делать всё независимыми справочниками?

Предлагаю.


Ну так это же не красиво в словаре данных. ЦФТ испугаются увидев столько справочников Smile И кроме того во всех 41 таблицах придётся создавать 2 одинаковых реквизита (ссылку на клиента и ИД выгрузки по клиенту). Собственно, судя по коду SQL из вышеприведённого это 2 независимых таблицы связанные первичным ключом (id). На скорости не особо должно сказаться. А удобство на лицо. Или всё таки плодить 41 справочник отдельно? Запутался Sad

Random пишет:

ХД = Хранилище Данных


Угу, надо импортить данные в аналитическую систему. По её форматам. А эта система, почему то не умеет (или не хочет) сама определять были ли какие то изменения в клиенту. Ей видите ли только изменённые данные с последней выгрузки подавай. Ссылаются что типа производительнось просядет у них. А типа, то что в этом случае все вычисления в АБС придётся производить и жрать ресурсы боевого сервака, который более приоритетен, чем аналитический - их не волнует. Evil or Very Mad
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Янв 23, 2013 05:42   Re: Родительские и дочерние таблицы Ответить с цитатой
Полезность: Нет оценки
yaffil пишет:
Random пишет:

А затем, что таково свойство родительских таблиц.
Говорю ж, в дочерней табличке есть констрейнт на родительскую.
Например, посмотри у клиентов.
Есть клиент. Абстрактный клиент, непонятно, банк или физик.
У банка не может быть ФИО, у клиента - SWIFT-кода. Но у того и другого есть дата заведения клиента в базе.
Физик и Банк - потомки одного родительского класса Клиенты. Идентификатор Физика (значение поля id таблицы z#cl_priv) должен присутствовать в поле id таблицы z#client согласно констрейнту FK_Z#CL_PRIV_ID. Должен и точка.


Так и у меня аналогично получается, что у таблиц 1-41 все обязаны иметь ссылку на клиента + одинаковый ID выгрузки по клиенту. Дополнительно имеют кучу своих собственных реквизитов (форматы выгрузки). Или я чего то не догоняю, в чём отличия?

Ну так эти поля не уникальные, а я говорю про уникальный идентификатор записи, PK, который должен быть одинаковым в дочке и родителе.
Ну вставка получается такая:
Код:

insert into Z#PARENT(id, тра-ля-ля) values(seq_id.nextval, остальные поля) returning id into переменная;
insert into Z#CHILD(id, ещё поля) values(та самая переменная, и ещё значения полей);

это вместо одного инсерта
insert into Z#CHILD(id, все поля) values(seq_id.nextval, и все значения полей);

То же самое про удаление, хотя с удалением проще.

Хотя... вот вырастет объём данных, так у тебя будет задел, куда оптимизировать в смысле скорости. И банк уже подсядет на систему, и ЦФТ смирится... Smile

yaffil пишет:
Random пишет:

Соответсвенно, в дочернюю таблицу нельзя вставить данные, не вставив их предварительно в родительскую таблицу, и наоборот, удалить из родительской, не удалив из дочерней, нельзя.
Кроме того, если удалять данные только из дочерней, не удаляя из родительской, будет то самое "неконсистентное" удаление, за последствия такого действия... короче, я хз что случится. Как самое малое, системные вьюшки перестанут работать.


Уболтал Smile Могу предположить, что через делете дочерней таблицы чистится всё в дочерней, а в родительской остается мусор от этих удалений (проверить не могу, нет доступа через какой нибудь SQL навигатор т.к. база на аутсорте). Как бэ ничего страшного, но не красиво и засирается табличное пространство. Просто хотелось меньше писанины. Переделаю на update, смысел в том, что мне надо занулить (сбросить) 41 параметр из 43 (2 из родительской их нужно тогда оставить).


Ну вот если удалять через операцию DELETE#AUTO, то операция чистит родительскую табличку сама (и заодно кушает ресурсы). А если писать delete d in ::[CHILD] where id = 123, то в родительской ничего само не почистится, будет предупреждение "Возможно неконсистентное удаление".

yaffil пишет:
Есть способ присвоить 41 параметру NULL, а 2 не трогать? Кроме как просто в update set их все перечислить.

Я б завёл ещё одно поле "Признак удалённой записи", наверное.
update выполняется быстрее чем delete, а по помеченным записям в момент, когда системой не пользуются, по джобу можно потихоньку удалять данные Smile
И чхать на производительность Smile

yaffil пишет:

Random пишет:

yaffil пишет:

Собственно оно так и предполагается. Предлагаешь делать всё независимыми справочниками?

Предлагаю.


Ну так это же не красиво в словаре данных. ЦФТ испугаются увидев столько справочников Smile И кроме того во всех 41 таблицах придётся создавать 2 одинаковых реквизита (ссылку на клиента и ИД выгрузки по клиенту). Собственно, судя по коду SQL из вышеприведённого это 2 независимых таблицы связанные первичным ключом (id). На скорости не особо должно сказаться. А удобство на лицо. Или всё таки плодить 41 справочник отдельно? Запутался Sad

ЦФТ не испугаются. Им по барабану. Завёл 41 справочник, платишь за 41 справочник Smile
И не важно, что 40 - это дочерние, а 1 - родительский. Наоборот, один справочник можно выкинуть, будет экономия... наверное. Smile))

Я, когда выгрузки в ЦФТ-шное ХД делал, тоже думал заводить родительский тип и кучу дочерних. Потом передумал, сделал просто кучу справочников (около ста).
Теперь вовсе снёс справочники, оставил только таблицы, работа через динамический SQL.
Это и не локальные доработки, за них платить не надо, и в словаре данных не мешаются, и по скорости хорошо. И ещё вкусности есть.
yaffil пишет:

Random пишет:

ХД = Хранилище Данных


Угу, надо импортить данные в аналитическую систему. По её форматам. А эта система, почему то не умеет (или не хочет) сама определять были ли какие то изменения в клиенту. Ей видите ли только изменённые данные с последней выгрузки подавай. Ссылаются что типа производительнось просядет у них. А типа, то что в этом случае все вычисления в АБС придётся производить и жрать ресурсы боевого сервака, который более приоритетен, чем аналитический - их не волнует. Evil or Very Mad

1. Выгрузка из АБС в формате csv есть в ЦФТ.
2. Работает она на разнице между тем, что получилось сейчас и тем, что выгружалось раньше (всё хранится в АБС)
3. есть способ анализировать только поля id, sn, su, но может не всегда сработать
4. пробивать в ЦФТ, чтобы в дополнение к полям sn и su было добавлено st (serial time) или tt (transaction time) - астрономические дата и время обновления записи.
ну или значение из отдельного общего для всех таблиц сиквенса
5. или строить выгрузки на LogMiner, Streams и иже с ними.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеСр Янв 23, 2013 08:19    Ответить с цитатой
Полезность: Нет оценки
Таблицы без справочников - это хорошо, но когда нет доступа к БД, а только к интерфейсной части ЦФТ, то выбирать не приходится.

А что за выгрузка? И каким образом она сравнивает предыдущие значения?

Я хотел сначала к аудиту зацепиться, но подумал что устанешь ждать, потому на справочники переориентировался 1 справочник 1 таблица импорта в нужном формате. Сначала цикл по клиентам заполняет/апдейтит все справочники. Затем цикл по самому справочнику с выплёвыванием в файл нужной инфу по новым клиентам или по тем, у кого что то поменялось.
SS
Участник


Вступление в Клуб: 25.01.2013
СообщениеПт Янв 25, 2013 14:03    Ответить с цитатой
Полезность: Нет оценки
Коллеги, а почему не использовать GoldenGate?
Вы пытаетесь заново изобрести колесо.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеПт Янв 25, 2013 17:06    Ответить с цитатой
Полезность: Нет оценки
Потому, что:

1. оно я полагаю не бесплатное
2. Если есть система в которую надо выгрузить данные в нужных форматах, зачем использовать промежуточное звено?
3. Данный формат (с промежуточным звеном) был бы актуален, если скажем, есть несколько систем со своими форматами в которые надо закачивать данные. Тогда, да, тупо заливаем весь срез туда, а от туда уже обрабатываем различными операциями. И пусчай оно там ресурсы тратит.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Янв 28, 2013 16:11    Ответить с цитатой
Полезность: Нет оценки
SS пишет:
Коллеги, а почему не использовать GoldenGate?
Вы пытаетесь заново изобрести колесо.


Я пытался прикрутить GG, и пытаюсь до сих пор, но есть причины, по которым это достаточно сложно.

А вот для себя лично: поделитесь опытом настройки GG чтоб вывод был во flat-files?
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Янв 28, 2013 16:16    Ответить с цитатой
Полезность: Нет оценки
yaffil пишет:
Таблицы без справочников - это хорошо, но когда нет доступа к БД, а только к интерфейсной части ЦФТ, то выбирать не приходится.

То есть нет доступа к АРМ Администратор?

yaffil пишет:
А что за выгрузка? И каким образом она сравнивает предыдущие значения?

Выгрузка... это процесс получения новых/измененных/потерявших актуальность данных.
select * from dual
minus
select * from cache_dual;

и наоборот
select * from cache_dual
minus
select * from dual;

После того, как данные на руках, их нужно запихнуть в cache_dual, понятно.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Янв 28, 2013 16:17    Ответить с цитатой
Полезность: Нет оценки
yaffil пишет:
Потому, что:

1. оно я полагаю не бесплатное

Естественно
yaffil пишет:
2. Если есть система в которую надо выгрузить данные в нужных форматах, зачем использовать промежуточное звено?

Увеличение производительности. Снижение нагрузки на АБС.
yaffil пишет:
3. Данный формат (с промежуточным звеном) был бы актуален, если скажем, есть несколько систем со своими форматами в которые надо закачивать данные. Тогда, да, тупо заливаем весь срез туда, а от туда уже обрабатываем различными операциями. И пусчай оно там ресурсы тратит.

И так тоже можно.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеПн Янв 28, 2013 16:44    Ответить с цитатой
Полезность: Нет оценки
Random пишет:

То есть нет доступа к АРМ Администратор?


Только туды и есть, но там создаются объекты схемы, за которые надо платить Smile А если, например через Девелопер или SQL навигатор какой-нибудь создавать таблицы, то за них платить не надо.

З.Ы. все вроде нормально отрабатывает с такой структурой и довольно таки быстро.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеСр Янв 30, 2013 08:08    Ответить с цитатой
Полезность: Нет оценки
Код:

delete x in ::[FIS_EXPORT];


Правильно понимаю, что, если это дочерняя таблица, то правильно удалять данные в ней из родительской вот так:

Код:

delete x in ::[РОДИТЕЛЬ] where x%class='FIS_EXPORT';


В этом случае вычистится и дочерняя полностью и родительская в части связанных данных с дочерней
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеСр Янв 30, 2013 08:39    Ответить с цитатой
Полезность: 1
yaffil пишет:

Правильно понимаю, что, если это дочерняя таблица, то правильно удалять данные в ней из родительской вот так:

Код:

delete x in ::[РОДИТЕЛЬ] where x%class='FIS_EXPORT';


В этом случае вычистится и дочерняя полностью и родительская в части связанных данных с дочерней


Неправильно. При ручном удалении нужно чистить как родительскую таблицу, так и дочернюю отдельно.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеСр Янв 30, 2013 08:47    Ответить с цитатой
Полезность: Нет оценки
Печалька Sad

Т.е. оба этих delete писать друг за дружкой?
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеСр Янв 30, 2013 08:54    Ответить с цитатой
Полезность: Нет оценки
yaffil пишет:
Печалька Sad

Т.е. оба этих delete писать друг за дружкой?

Да.
Либо, как вариант, можно использовать интерфейсный пакет (если таблица в словаре Платформы(создана в Админе словаря)):
Код:

declare
  i integer;
begin
   i:=rtl.open;
 
   for obj in (select id from Z#FIS_EXPORT)
    loop       
        Z#FIS_EXPORT#INTERFACE.delete(obj.id);
    end loop;
 
end;


Еще можно триггер на удаление повесить. Но этот вариант не очень хорош, т.к. ненагляден (как мне кажется).
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеСр Янв 30, 2013 10:41    Ответить с цитатой
Полезность: Нет оценки
А так тоже самое будет?:
Код:

for (FIS_EXPORT_DEL in ::[FIS_EXPORT] where FIS_EXPORT_DEL.[CREDIT_ID] in (1,2,7,9)
      )loop
      ::[FIS_EXPORT].[DELETE_AUTO];
end loop;


Т.е. удалятся все записи с CREDIT_ID in (1,2,7,9), а остальные остануться.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу Пред.  1, 2, 3  След.
Страница 2 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru