Гарантия уникального назначения суррогатных ключей - максимальное соответствие для двухстороннего графика


1

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

Другими словами, если исходная система A имеет естественный ключ ABC, представляющий тот же объект, что и естественный ключ DEF исходной системы B, мы назначили бы тот же суррогатный ключ для обоих. Таблица будет выглядеть так:

SURROGATE_KEY SOURCE_A_NATURAL_KEY SOURCE_B_NATURAL_KEY 
1    ABC      DEF 

Это был план. Тем не менее, эта система работает некоторое время, а суррогатное ключевое назначение - беспорядок. Исходная система A дала бы естественный ключ ABC в один день, прежде чем система источников B узнала об этом. DW назначил ему суррогатный ключ 1. Затем исходная система B начала давать естественный ключ DEF, который представляет ту же самую вещь, что и естественный ключ ABC исходной системы A. DW неправильно дал этот комбо суррогатный ключ 2. таблица будет выглядеть следующим образом:

SURROGATE_KEY SOURCE_A_NATURAL_KEY SOURCE_B_NATURAL_KEY 
1    ABC      NULL 
2    ABC      DEF 

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

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

Wikipedia - Matching

MIT 18.433 Combinatorial Optimization - Lecture Notes on Non-Bipartite Matching

мне нужно легко понять реализацию (не оптимально выполнять) алгоритма Эдмонда, деревьев и цветов. У меня нет формального математического или CS-фона, и то, что у меня есть, есть самоучка, и сегодня я не в математическом пространстве. Может ли кто-нибудь помочь? Хорошо написанное объяснение, которое поможет мне реализовать, будет глубоко оценено.

EDIT:

математический подход является оптимальным, так как мы хотим, чтобы максимизировать глобальную пригодность. Жадный подход (сначала возьмите все экземпляры A, затем B, а затем C ...) закрасит вас в локальный угол максимума.

В любом случае, я получил это назад к бизнес-аналитикам, чтобы сделать вручную (все 20 миллионов из них). Я помогаю им выполнять функции для оценки качества глобального соответствия. Это идеально, так как они все-таки выписываются, поэтому моя задняя сторона покрыта.

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

2

У меня создается впечатление, что вы идете по этому пути неправильно; как говорит cdonner, есть другие способы просто перестроить ключевую структуру, не пройдя через этот беспорядок. В частности, вам необходимо гарантировать, что натуральные ключи - - всегда уникальные для данной записи (нарушение этого условия - это то, что привело вас в этот беспорядок!). Наличие как ABC, так и DEF идентифицирует одну и ту же запись, является катастрофическим, но в конечном итоге восстанавливается. Я даже не уверен, почему вам нужны суррогатные ключи вообще; в то время как у них есть много преимуществ, я бы отнесся к тому, чтобы перейти к чисто-реляционным и просто потрошить их из вашей схемы, a la Celko; это может просто избавить вас от этого беспорядка. Но это решение должно быть принято после просмотра всей вашей схемы.

Чтобы решить ваше потенциальное решение, я вытащил свою копию документа DB Введение в теорию графики, второе издание, описывающее алгоритм цветения на стр. 144. Вам понадобится математический фон, нотация и теория графов, чтобы следовать алгоритму, но это достаточно кратким, что я думаю, что это может помочь (если вы решите пойти по этому маршруту). Если вам нужно объяснение, сначала обратитесь к ресурсу по теории графов (Wikipedia, ваша местная библиотека, Google, где бы вы ни находились), или спросите, не находите ли вы, что вам нужно.

3.3.17. Алгоритм. (Алгоритм цветения Эдмондса [1965a] - эскиз).

Вход. График G, соответствующий M в G, M - ненасыщенная вершина u.

Идея. Исследуйте M -согласительные пути от u, записывая для каждой вершины вершину, из которой она была достигнута, и договаривающиеся цветы, когда они найдены. Поддерживать наборы S и T аналогично алгоритму 3.2.1, с S, состоящим из u и вершин, достигаемых вдоль насыщенных краев. Достижение ненасыщенной вершины дает увеличение.

Инициализация.S = {u} и T = {} (пустой комплект).

Итерация. Если S не имеет никаких отмеченных вершин, остановка; нет M - путь от u.В противном случае выберите немаркированный номер v в S. Для изучения из v последовательно рассмотрим каждый из y в N(v), так что y не находится в T.

Если y является ненасыщенным по m, а затем проследить от y (расширяющихся цветов по мере необходимости), чтобы отчет об M -augmenting (u, y) -path.

Если y находится в S, то расцвет был найден. Приостановите исследование v и сократите цвет, заменив его вершины в S и T одной новой вершиной в S. Продолжите поиск из этой вершины на меньшем графике.

В противном случае y соответствует w по M. Включить y в T (поступил от v) и включает в себя w в S (поступил от y).

Изучив все такие соседи v, отметьте v и итерации.

Алгоритм, описанный здесь, выполняется во времени O (n^4), где n - число вершин. Запад дает ссылки на версии, которые работают так же быстро, как O (n^5/2) или O (n^1/2 m) (m - количество ребер). Если вы хотите, чтобы эти ссылки или ссылки на оригинальную бумагу Эдмондса, просто спросите, и я выкопаю их из индекса (какой изящный в этой книге).


1

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

Ниже приведены примеры правил - только вы можете решить, какие из них применяются:

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

Написание запросов, которые перестраивают ваше сопоставление ключей, тривиально, как только вы установили правила. Я не уверен, как это может быть математической проблемой?


0

Если вы ищете реализацию, библиотека Eppsteins PADS имеет соответствующий алгоритм, это должно быть достаточно быстро для ваших целей, общий алгоритм сопоставления находится в CardinalityMatching.py. Комментарии в реализации объясняют, что происходит. Библиотека проста в использовании, чтобы предоставить график на Python, вы можете представить граф с использованием словаря G, так что G [v] дает список (или набор) соседей вершины v.

Пример:

G = {1: [1], 2:[1,3], 3: [2,4], 4:[3]} 

дает линейный график с 4 вершинами.