Родительские и дочерние таблицы
На страницу 1, 2, 3 След.
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Чт Янв 17, 2013 17:04  Родительские и дочерние таблицы |
|
Полезность: Нет оценки
|
Есть задача ежедневного импорта множества различных данных по клиентам, например Клиент, депозит, счета ...
Которые надо перелить в другую Оракловую базу посредством множества файлов с определённой структурой, например, Клиент.txt, депозит.txt, счета.txt ...
Общее у них - id Клиента.
Решил использовать структуру:
1. Родительский тип в нем 1 реквизит id Клиента
2. Дочерние типы Клиент, депозит, счета ... + темповая FIS_EXPORT в которой будет определяться необходимость выгрузки той или иной таблицы (т.к. нужны только клиенты с изм. данными) с реквизитами которые нужны для выгрузки
Я могу так это дело использовать? А то мне компилятор на
Код: | delete x in ::[FIS_EXPORT]; |
Предупреждает - возможно неконсистентное удаление.
Что это?
Я правильно понимаю, что такая структура равнозначна созданию отдельных таблиц в каждой из которых будет реквизит id Клиента?
Или лучше всё таки отдельными таблицами независимыми?
З.Ы. такой способ выбран из за красоты визуального восприятия в словаре данных. Т.к. открываешь + и видишь какие у тебя таблицы используются для этого проекта т.е. сгруппированы. И ЦФТ не сильно пугается видя 1 справочник, а не 41  |
|
 |
Alexsey Эксперт
Вступление в Клуб: 06.09.2007
|
Чт Янв 17, 2013 18:30   |
|
Полезность: Нет оценки
|
В случае дочерних таблиц получится список независимых таблиц объединенных в таблице CLASSES полем PARENT_ID. В Администраторе словаря это будет выглядеть как набор ТБП с общим реквизитом ID Клиента. По сути, для красоты можно справочники сгруппировать, тогда они будут выглядеть красиво еще и в навигатре Получается, что в таблице FIS_EXPORT будет так же реквизит ID Клиента.
У меня возник вопрос, насколько необходима эта временная таблица для определения выгрузки? Не проще будет инициализировать в памяти таблицу записей или какой-либо другой механизм аля переменная типа логика? _________________ всегда есть как минимум 2 выхода |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Пт Янв 18, 2013 03:37   |
|
Полезность: Нет оценки
|
1.А та другая база Oracle имеет такую же структуру ?
2.Почему не использовать dblink , без выгрузки в файлы ? |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пт Янв 18, 2013 08:12   |
|
Полезность: Нет оценки
|
Alkov пишет: | 1.А та другая база Oracle имеет такую же структуру ?
2.Почему не использовать dblink , без выгрузки в файлы ? |
1. Такую же, т.к. они предоставили форматы, а я делаю 41 файл под их форматы.
2. Я бы, с удовольствием, но ЦФТ находится на аутсорте в Новосибе и никакой вариант с ДБлинками они не разрешат. Остается только файлообмен. |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пт Янв 18, 2013 08:24   |
|
Полезность: Нет оценки
|
Alexsey пишет: |
У меня возник вопрос, насколько необходима эта временная таблица для определения выгрузки? Не проще будет инициализировать в памяти таблицу записей или какой-либо другой механизм аля переменная типа логика? |
Я думал, как можно попроще извратиться, но тут система дурацкая, есть 41 таблица с разным набором полей. Необходимо заливать только те, где было хоть какое то изменение. При этом чтобы залить дочернюю таблицу, надо сначала залить её родителей. При этом там есть параметр LOAD_ID который должен присутствовать во всех таблицах по одному клиенту одинаковый, но есть исключения (примерно 10 таблиц должны быть с другим одинаковым ID). Т.е. по одному клиенту используется 2 ID.
Поэтому я ничего не придумал как использовать базовый набор 41 таблицы для самой выгрузки и сверкой изменения значения в АБС, а временну использую как счетчик по таблицам, надо или не надо её выгружать.
Т.е. первый цикл бежит по всем клиентам в АБС, сверяет её с данными в 41 таблице и если есть изменения апдейтит соответствующую таблицу + по временной таблице меняет реквизит (boolean) с аналогичным названием таблицы на true.
Второй цикл бежит по временной таблице и по реквизитам со значением true выгружает соответствующую таблицу в файл.
На вскидку ничего другого не смог придумать  |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пт Янв 18, 2013 08:28   |
|
Полезность: Нет оценки
|
Меня больше напрягает фраза-предупреждения компилятора
Код: | возможно неконсистентное удаление |
Что это такое и где оно может бахнуть или не может? |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Пт Янв 18, 2013 09:19   |
|
Полезность: Нет оценки
|
могу предположить, что это предупреждение о возможности частичного удаления связанных данных ( останутся ссылки на удаленные объекты).
Лучше спросить у фирмы производителя компилятора  |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Пт Янв 18, 2013 10:41   |
|
Полезность: Нет оценки
|
delete x in ::[FIS_EXPORT];
наверное надо было дописать в конце all
можно попробовать за основу взять операцию которую создать Генератором экспорта. |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пт Янв 18, 2013 11:47   |
|
Полезность: Нет оценки
|
Нет, all тут ни при чём. Я же под ноль зачищаю эту временную таблицу.
Может оно имеется в виду, что тут всё грохнется, а в родительской ничего не потрётся и останутся значение общего реквизита т.е. ID клиента?
Ну собственно оно так и предполагается чтобы работало
Кстати, как сравнить значения в наших таблицах для выгрузки с теми что в АБС (изменился ли реквизит с момента последней выгрузки). Тупо if по всем полям с соответствующими в АБС? Или есть более практичный способ? |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Пт Янв 18, 2013 20:31   |
|
Полезность: Нет оценки
|
yaffil пишет: |
Кстати, как сравнить значения в наших таблицах для выгрузки с теми что в АБС (изменился ли реквизит с момента последней выгрузки)? |
Например так,
Код: | (select 1, 2, 3 from dual -- 1 база
union all
select 4, 5, 6 from dual
)
minus
(select 1, 2, 3 from dual -- 2 база
union all
select 5, 5, 6 from dual -- данные изменились
) |
|
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пн Янв 21, 2013 12:07  Re: Родительские и дочерние таблицы |
|
Полезность: Нет оценки
|
yaffil пишет: | Решил использовать структуру:
1. Родительский тип в нем 1 реквизит id Клиента
2. Дочерние типы Клиент, депозит, счета ... + темповая FIS_EXPORT в которой будет определяться необходимость выгрузки той или иной таблицы (т.к. нужны только клиенты с изм. данными) с реквизитами которые нужны для выгрузки |
Не делай так
1. в общей для всех структур таблице будут храниться все данные депозитов, клиентов, счетов, и т.д. Соответственнго, она будет очень длинная.
Любой индекс в ней будет очень большой.
Перестройка этого индекса будет очень медленной. Это удаление, вставка, изменение информации.
2. Для вставки данных в, например, счета, нужно делать два шага вместо одного.
3. удаление - аналогично.
4. Я недавно оптимизировал 133 форму. Проблема - все данные одной реализации (несколько десятков тысяч записей) вытаскиваются из таблицы 8 секунд. Связка reps_data и f_133_data. из одной таблицы - на порядок быстрее.
5. Группировать структуры можно, залепив в длинное имя с начала определённую приставку.
6. Кстати, ты уже задумался, что будет, если тебе предложат лить клиентов из двух разных мест? Если их потребуется "свести", то есть выкинуть одну запись, оставив другую?
yaffil пишет: | Предупреждает - возможно неконсистентное удаление.
Что это?
|
Это значит, что в родительской таблице ты данные удаляешь, а в дочерней - нет.
Если наоборот, то компилятор сам должен понять и вставить удаление из родительской тоже.
yaffil пишет: |
Я правильно понимаю, что такая структура равнозначна созданию отдельных таблиц в каждой из которых будет реквизит id Клиента? |
Нет.
Такая структура эквивалентна созданию n+1 таблицы, при этом:
CLIENTS
----------------
*id
... другие реквизиты клиентов
ACCOUNTS
----------------
*id
... другие реквизиты счетов
...
и ещё одна родительская
PARENT
---------------
*id
CLIENT_ID
При этом select id from z#PARENT даст те же самые значения, что и
select id from z#clients
union all
select id from z#accounts
union all
...
на поле id вешается foreign constraint, совершенно лишний, который будет замедлять удаление.
PS: Насколько понимаю, делаешь ХД? |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пн Янв 21, 2013 16:30   |
|
Полезность: Нет оценки
|
Собственно засада, не знаю как побороть:
Код в операции тип "групповая":
Код: |
for (select fis (fis.[KLIENT_ID] :C_KLI_ID, fis%id :C_ID) in ::[STR_FIS_EXPORT]all where fis.[NATURAL1]) loop
debug_pipe('FIS.[KLIENT_ID]: '||FIS.C_KLI_ID,0);
debug_pipe('FIS: '||FIS.C_ID,0);
end loop;
|
Выдаёт правильный C_ID, но пустой C_KLI_ID, хотя по завершении операции я в представлении вижу правильный ID и KLI_ID. Собственно проваливаюсь на нужного клиента.
Компилятор перевернул код вот так:
Код: | declare
cursor c_obj is
select a2.C_LOAD_ID C_KLI_ID, a1.ID C_ID
from Z#STR_IMPORT_FIS a2, Z#STR_FIS_EXPORT a1
where a1.id=a2.id
and ((a1.C_NATURAL1 = '1'));
FIS c_obj%rowtype;
begin
for plp$c_obj in c_obj loop
FIS := plp$c_obj;
--# 310,1
RTL.DEBUG_PIPE('FIS.[KLIENT_ID]: '||FIS.C_KLI_ID,0);
RTL.DEBUG_PIPE('FIS: '||FIS.C_ID,0);
end loop;
end; |
Таблица Z#STR_IMPORT_FIS является родительской для Z#STR_FIS_EXPORT.
Где засада?
П.С. каким то волшебным образом компилятор переделывает реквизит на родительский (a2.C_LOAD_ID C_KLI_ID) и при чём совсем не тот который в PL+ написан (fis.[KLIENT_ID] :C_KLI_ID)
Последний раз редактировалось: yaffil (Пн Янв 21, 2013 17:07), всего редактировалось 1 раз |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пн Янв 21, 2013 16:38  Re: Родительские и дочерние таблицы |
|
Полезность: Нет оценки
|
Random пишет: |
Не делай так
1. в общей для всех структур таблице будут храниться все данные депозитов, клиентов, счетов, и т.д. Соответственнго, она будет очень длинная.
|
Почему длинная? Смотрю на таблицу через арм админа, вижу, что она не затягивает в себя реквизиты дочерних таблиц.
Random пишет: |
2. Для вставки данных в, например, счета, нужно делать два шага вместо одного.
3. удаление - аналогично.
|
Зачем 2 раза, родительская у меня только для связи всех дочерних таблиц одним ID клиента
Random пишет: |
При этом select id from z#PARENT даст те же самые значения, что и
select id from z#clients
union all
select id from z#accounts
union all
...
|
Собственно оно так и предполагается. Предлагаешь делать всё независимыми справочниками?
Random пишет: |
PS: Насколько понимаю, делаешь ХД? |
Что такое ХД? А то у меня фантазия щаз разыграется. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Янв 22, 2013 08:11  Re: Родительские и дочерние таблицы |
|
Полезность: Нет оценки
|
yaffil пишет: | Random пишет: |
Не делай так
1. в общей для всех структур таблице будут храниться все данные депозитов, клиентов, счетов, и т.д. Соответственнго, она будет очень длинная.
|
Почему длинная? Смотрю на таблицу через арм админа, вижу, что она не затягивает в себя реквизиты дочерних таблиц.
|
Если б затягивала, была бы ещё и широкая
yaffil пишет: |
Random пишет: |
2. Для вставки данных в, например, счета, нужно делать два шага вместо одного.
3. удаление - аналогично.
|
Зачем 2 раза, родительская у меня только для связи всех дочерних таблиц одним ID клиента
|
А затем, что таково свойство родительских таблиц.
Говорю ж, в дочерней табличке есть констрейнт на родительскую.
Например, посмотри у клиентов.
Есть клиент. Абстрактный клиент, непонятно, банк или физик.
У банка не может быть ФИО, у клиента - SWIFT-кода. Но у того и другого есть дата заведения клиента в базе.
Физик и Банк - потомки одного родительского класса Клиенты. Идентификатор Физика (значение поля id таблицы z#cl_priv) должен присутствовать в поле id таблицы z#client согласно констрейнту FK_Z#CL_PRIV_ID. Должен и точка.
Соответсвенно, в дочернюю таблицу нельзя вставить данные, не вставив их предварительно в родительскую таблицу, и наоборот, удалить из родительской, не удалив из дочерней, нельзя.
Кроме того, если удалять данные только из дочерней, не удаляя из родительской, будет то самое "неконсистентное" удаление, за последствия такого действия... короче, я хз что случится. Как самое малое, системные вьюшки перестанут работать.
yaffil пишет: |
Random пишет: |
При этом select id from z#PARENT даст те же самые значения, что и
select id from z#clients
union all
select id from z#accounts
union all
...
|
Собственно оно так и предполагается. Предлагаешь делать всё независимыми справочниками?
|
Предлагаю.
yaffil пишет: |
Random пишет: |
PS: Насколько понимаю, делаешь ХД? |
Что такое ХД? А то у меня фантазия щаз разыграется. |
ХД = Хранилище Данных
Последний раз редактировалось: Random (Вт Янв 22, 2013 08:18), всего редактировалось 1 раз |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Янв 22, 2013 08:15   |
|
Полезность: 1
|
yaffil пишет: | Собственно засада, не знаю как побороть:
...
П.С. каким то волшебным образом компилятор переделывает реквизит на родительский (a2.C_LOAD_ID C_KLI_ID) и при чём совсем не тот который в PL+ написан (fis.[KLIENT_ID] :C_KLI_ID) |
Соответствие реквизитов модели и столбцов в таблице можно посмотреть на закладке "Таблица" при просмотре класса.
Переименовывал, наверное, реквизиты? Рекомендую перестроить обе таблицы, родительскую и дочернюю. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|