Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Требуется переливать данные из иерархической таблицы одной БД в другую. Иерархия организована с помощью внешнего ключа на саму себя. Планирую в таблице в БД-приемнике создать суррогатный первичный ключ, а ID сущности из оригинальной БД хранить как неключевое поле. Как правильно спроектировать таблицу - иерархию реализовать через внешний ключ (то есть в качестве ключа использовать введенный суррогатный ключ) или хранить в строке ID родительской сущности из оригинальной БД (но тогда ограничение целостности нужно будет поддерживать вручную), либо вводить суррогатный ключ и вовсе не стоит, а стоит использовать в качестве первичного ключа значения первичного ключа из таблицы-источника?
22 сен 17, 08:25    [20814357]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1472
Interloper,

А в первичной таблице, надеюсь, ключ суррогатный?

Если так, зачем во вторичной добавлять еще один?

Или вы планируете передавать дерево как-то частично, так что во вторичной базе оно может быть не целостным?
22 сен 17, 09:24    [20814480]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Cane Cat Fisher,

В первичной таблице ключ суррогатный. Планируется передавать периодически обновления дерева. Есть вероятность, что возможно потом во вторичную таблицу будут литься данные из нескольких разных источников, тогда использование в качестве первичного ключа такового из первичной таблицы невозможно, так как приведет к коллизиям. Хотелось бы почитать про best practices в подобных задачах, чтобы понимать все pro и contra. Так-то понятно, что будет работать решение и с дополнительным суррогатным ключом и без него (если источник будет один), но желательно предвидеть подводные камни, которые таит в себе каждое из решений.
22 сен 17, 09:36    [20814522]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1472
Тогда дерево - это вообще второй вопрос. Представьте, что у вас плоская таблица, и придумайте, что вы хотите сделать с ключами от разных источников.
22 сен 17, 10:03    [20814610]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43931

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

1) Используй GUID в качестве ключа и коллизий не будет.
2) Используй deferred constraint и не будет проблем с внешним ключом при заливке.
3) Используй лог шиппинг и опять таки проблем с ключом не будет, ибо операции пойдут в том
же порядке, что и в первичной БД.

Posted via ActualForum NNTP Server 1.5

22 сен 17, 12:33    [20815398]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Dimitry Sibiryakov,

1) GUID я и планирую в качестве суррогатного ключа использовать, так как в базе-источнике тип ключа - INTEGER.
22 сен 17, 14:12    [20815882]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43931

Interloper
в базе-источнике тип ключа - INTEGER.

Ты что, источник не проектируешь что ли, только консолидированную?..

Posted via ActualForum NNTP Server 1.5

22 сен 17, 14:15    [20815902]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Dimitry Sibiryakov,

Источник уже есть и я на него никак влиять не могу.
22 сен 17, 16:10    [20816676]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43931

Interloper
Источник уже есть и я на него никак влиять не могу.

Тогда идея с дополнительным ключом заведомо провальная. У тебя есть на выбор всего два
варианта:
1) Дополнительное поле во всех ключах, идентифицирующее БД-источник.
2) Таблицы соответствия ключей в источнике с ключом в консолидированной БД.

Выбор между ними зависит от софта, которым ты будешь информацию реплицировать.

Posted via ActualForum NNTP Server 1.5

22 сен 17, 16:29    [20816800]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Dimitry Sibiryakov,

Почему идея провальная?
22 сен 17, 17:00    [20816910]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43931

Interloper
Почему идея провальная?

Ключ используется для идентификации записей. Если в источнике этого ключа нет, ты не
сможешь точно идентифицировать запись. Представь, что из двух баз пришли записи с ключом
12345. Ты можешь назначить им разный дополнительный ключ, но при последующей репликации
изменений из одной базы ты не сможешь определить какую из этих двух записей надо изменить.

Posted via ActualForum NNTP Server 1.5

22 сен 17, 18:18    [20817099]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Dimitry Sibiryakov,

Так я храню ключ источника в своей таблице. Если появятся несколько источников, разумеется, придется так же хранить и инфо о таком, из какого источника пришла запись.
25 сен 17, 08:42    [20819670]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3314
Interloper
Требуется переливать данные из иерархической таблицы одной БД в другую. Иерархия организована с помощью внешнего ключа на саму себя. Планирую в таблице в БД-приемнике создать суррогатный первичный ключ, а ID сущности из оригинальной БД хранить как неключевое поле. Как правильно спроектировать таблицу - иерархию реализовать через внешний ключ (то есть в качестве ключа использовать введенный суррогатный ключ) или хранить в строке ID родительской сущности из оригинальной БД (но тогда ограничение целостности нужно будет поддерживать вручную), либо вводить суррогатный ключ и вовсе не стоит, а стоит использовать в качестве первичного ключа значения первичного ключа из таблицы-источника?

вариант1 - используй в качестве ключа суррогатный ключ.
26 сен 17, 15:46    [20824296]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
mad_nazgul
Member

Откуда:
Сообщений: 4232
Interloper
Требуется переливать данные из иерархической таблицы одной БД в другую. Иерархия организована с помощью внешнего ключа на саму себя. Планирую в таблице в БД-приемнике создать суррогатный первичный ключ, а ID сущности из оригинальной БД хранить как неключевое поле. Как правильно спроектировать таблицу - иерархию реализовать через внешний ключ (то есть в качестве ключа использовать введенный суррогатный ключ) или хранить в строке ID родительской сущности из оригинальной БД (но тогда ограничение целостности нужно будет поддерживать вручную), либо вводить суррогатный ключ и вовсе не стоит, а стоит использовать в качестве первичного ключа значения первичного ключа из таблицы-источника?


"Шардируйте" ключи.
Т.е. выберите "шаг" ключа (обычно максимальное количество инстансов БД)
А потом для каждого инстанса задаете начальное значение + шаг.
Например предполагаем, что будет не более 3 инстансов. Тогда шаг ключа будет 3
Соответственно для 1-го инстанса будут ключи
1, 4, 7, 10 и т.д.
Для второго
2, 5, 8, 11 и т.д.
Для третьего
3, 6, 9, 12 и т.д.

Тогда вопросов с уникальностью и пересечением не будет :-)
27 сен 17, 08:59    [20825695]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
LSV
Member

Откуда: Киев
Сообщений: 30144
Т.е. выберите "шаг" ключа
Достаточно сделать интервалы: с 1 до 100тыс, с 100тыс+1 до 200тыс. и т д.
Проще организовать автоинкременты.
27 сен 17, 09:42    [20825771]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
mad_nazgul
Member

Откуда:
Сообщений: 4232
LSV
Т.е. выберите "шаг" ключа
Достаточно сделать интервалы: с 1 до 100тыс, с 100тыс+1 до 200тыс. и т д.
Проще организовать автоинкременты.


Не так удобно.
Так у нас на инстансах бесконечное множества.
А если делить по интервалам, то есть ограничение сверху.

А так все равно "автоинкремент" идет через сиквенс, а там можно сразу шаг указывать.
Единственное нужно руками прописать, а не через скрипт serial/bigserial
27 сен 17, 10:46    [20826024]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
LSV
Member

Откуда: Киев
Сообщений: 30144
А если делить по интервалам, то есть ограничение сверху.
Дык никто не мешает назначить новый интервал. Или сразу назначить интервал достаточной длины.
У вас скорее всего не тыща баз.
27 сен 17, 11:22    [20826178]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
mad_nazgul
Member

Откуда:
Сообщений: 4232
LSV
А если делить по интервалам, то есть ограничение сверху.
Дык никто не мешает назначить новый интервал. Или сразу назначить интервал достаточной длины.
У вас скорее всего не тыща баз.


Зачем делать, когда можно не делать.
Сиквенс пишется один раз, а за интервалами придется следить :-)
27 сен 17, 13:43    [20826598]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43931

mad_nazgul
Тогда вопросов с уникальностью и пересечением не будет :-)

Тогда будут вопросы, когда "внезапно" окажется, что максимум баз вдруг стал 4, а не 3.

Posted via ActualForum NNTP Server 1.5

27 сен 17, 14:19    [20826739]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
LSV
Member

Откуда: Киев
Сообщений: 30144
mad_nazgul
Сиквенс пишется один раз, а за интервалами придется следить :-)
Это почему еще за сиквенсами не нужно следить ?
Было 3 сиквенса: 1,4,7... / 2,5,8... / 3,6,9... И вдруг неожиданно нужно добавить еще один.
Можно конеш сделать с большим запасом. Дык и интервалы можно сделать с большим запасом.
28 сен 17, 09:36    [20828239]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1472
mad_nazgul
Например предполагаем, что будет не более 3 инстансов. Тогда шаг ключа будет 3
Соответственно для 1-го инстанса будут ключи
1, 4, 7, 10 и т.д.
Для второго
2, 5, 8, 11 и т.д.
Для третьего
3, 6, 9, 12 и т.д.


А как тогда выбрать запросом записи, например, только второго инстанса?
28 сен 17, 10:55    [20828509]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
mad_nazgul
Member

Откуда:
Сообщений: 4232
Cane Cat Fisher
mad_nazgul
Например предполагаем, что будет не более 3 инстансов. Тогда шаг ключа будет 3
Соответственно для 1-го инстанса будут ключи
1, 4, 7, 10 и т.д.
Для второго
2, 5, 8, 11 и т.д.
Для третьего
3, 6, 9, 12 и т.д.


А как тогда выбрать запросом записи, например, только второго инстанса?


Делением по модулю?! :-)
28 сен 17, 11:48    [20828696]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1472
mad_nazgul
Cane Cat Fisher
пропущено...


А как тогда выбрать запросом записи, например, только второго инстанса?


Делением по модулю?! :-)


А соответствующий индекс получится построить? Или все подряд делить-молотить?
28 сен 17, 12:27    [20828802]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Пока вопрос о нескольких инстансах не идет. Вопрос лишь в том, нормальная ли практика использовать в таблице, куда будут литься данные, новый суррогатный ключ для обеспечения иерархии.
28 сен 17, 15:38    [20829342]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1472
Interloper
Пока вопрос о нескольких инстансах не идет. Вопрос лишь в том, нормальная ли практика использовать в таблице, куда будут литься данные, новый суррогатный ключ для обеспечения иерархии.


Что-то мы по кругу пошли.

Q: Нужен ли суррогатный ключ для обеспечения иерархии?

A: Зачем вам дополнительный суррогатный ключ? Используйте тот что в льющихся данных.

Q: Главная проблема в том, что если данные будут литься из нескольких инстанций, их ключи будут совпадать. Но в то же время вопрос о нескольких инстансах не идет. Так нужен ли суррогатный ключ?
28 сен 17, 16:06    [20829442]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Cane Cat Fisher,

Если использовать тот же, появится дополнительная работа для обеспечения ссылочной целостности - нужно будет как минимум в определенном порядке данные лить, чтобы родительские записи лились раньше, чем дочерние. Либо еще как-то изголяться.
28 сен 17, 16:25    [20829509]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1472
Interloper
Cane Cat Fisher,

Если использовать тот же, появится дополнительная работа для обеспечения ссылочной целостности - нужно будет как минимум в определенном порядке данные лить, чтобы родительские записи лились раньше, чем дочерние. Либо еще как-то изголяться.


Проблема решаема, выше обсуждали, но хочу уточнить - а если дочерняя приедет раньше, а родительской еще нет - как тут поможет именно суррогатный ключ?
28 сен 17, 16:38    [20829575]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43931

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

Posted via ActualForum NNTP Server 1.5

28 сен 17, 17:32    [20829811]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Dimitry Sibiryakov
Interloper
Вопрос лишь в том, нормальная ли практика использовать в таблице, куда будут литься
данные, новый суррогатный ключ для обеспечения иерархии.
Нет, это кривой костыль.


А какое решение не костыль?
29 сен 17, 08:16    [20830734]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Interloper
Member

Откуда: Краснодар
Сообщений: 249
Cane Cat Fisher
Interloper
Cane Cat Fisher,

Если использовать тот же, появится дополнительная работа для обеспечения ссылочной целостности - нужно будет как минимум в определенном порядке данные лить, чтобы родительские записи лились раньше, чем дочерние. Либо еще как-то изголяться.


Проблема решаема, выше обсуждали, но хочу уточнить - а если дочерняя приедет раньше, а родительской еще нет - как тут поможет именно суррогатный ключ?


Придется проставление ссылок выделить в отдельный шаг процесса ETL.
Еще соображение по поводу суррогатного ключа - в объектной модели приложения я использую для сущностей интерфейс, который обязывает сущности иметь поле Id типа Guid (а первичный ключ в таблице источнике имеет тип int).
29 сен 17, 08:20    [20830738]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация иерархических таблиц между разными БД  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3314
Dimitry Sibiryakov
Interloper
Вопрос лишь в том, нормальная ли практика использовать в таблице, куда будут литься
данные, новый суррогатный ключ для обеспечения иерархии.
Нет, это кривой костыль.

http://www.kimballgroup.com/1998/05/surrogate-keys/
все уже придумано давно.
29 сен 17, 10:09    [20830927]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Проектирование БД Ответить