Родительские и дочерние таблицы
На страницу 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) |
Соответствие реквизитов модели и столбцов в таблице можно посмотреть на закладке "Таблица" при просмотре класса.
Переименовывал, наверное, реквизиты? Рекомендую перестроить обе таблицы, родительскую и дочернюю. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|