Nano Hash - криптовалюты, майнинг, программирование

Проблемы с реализацией SQL Server SCD II

У меня есть таблица пациентов с более чем 80 полями, из которых мне нужно хранить исторические данные по всем полям. Для уточнения, не все поля «нуждаются» в версионировании, хотя было принято решение просто сохранить полную копию старых записей.

Для пояснения, это для процесса ETL, который будет происходить в нерабочее время.

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

Вариант 1: используйте SSIS для реализации SCD.
За: поскольку мы все равно используем SSIS для получения наших данных, имеет смысл просто продолжать использовать тот же инструмент
Против: Я прочитал несколько статей о производительности SCD в SSIS, например: https://chrisjarrintaylor.co.uk/2012/07/03/ssis-scd-vs-merge-statement-performance-comparison./

Вариант 2. Используйте MERGE в операторе tsql.
Плюсы: краткость написания, простота понимания — все шаги выполняются за один раз
Минусы: может быть громоздко, если мы попытаемся написать условия для 80+ полей. У нас также может возникнуть проблема с производительностью при выполнении OR для такого количества полей (например, если они отличаются)
Следующий подход сработал бы для меня, хотя запись таким образом означала бы очень длинный оператор слияния: Нужна помощь в понимании альтернатив scd в SSIS

Вариант 3: INSERT все новые записи, используйте CTE для очистки дубликатов (тех, в которых нет изменений), оператор UPDATE для деактивации тех записей, которые изменились
Pro: никаких запутанных OR операторов , не слишком сложно написать или понять - производительность, кажется, не будет проблемой (мы использовали подход CTE в прошлом)
Против: Почему-то это кажется очень неуклюжим подходом.

Учитывая эти подходы или другие, которые у вас могут быть, есть ли тот, который легче поддерживать, будет лучше масштабироваться?

Небольшая выборка данных - в исходных данных более 80 столбцов (которые я не могу контролировать) и гораздо больше строк: http://rextester.com/live/AYQUT28070


  • Вы говорите о SCD ​​типа 1 или типе 2? Название подразумевает тип 2, но параметры, которые вы описываете, в частности, MERGE лучше подходят для типа 1... Вы пытаетесь обновить существующие данные, которые были изменены (тип 1), или вы пытаетесь сохранить историю изменений измененных данных (тип 2)? 01.09.2017
  • 80+ полей — верный признак плохой нормализации (или просто отсутствия нормализации). Любая операция в реляционной базе данных с плохой нормализацией всегда будет неудобной и/или будет иметь низкую производительность. 01.09.2017
  • Если вы не получили здесь хорошего ответа, попробуйте задать его на родственном сайте SE Software Engineering (но воздержитесь от перекрестной публикации ). 01.09.2017
  • @JasonA.Long SCD 2. Я хочу импортировать запись в промежуточную таблицу. Если есть какие-либо изменения, мне нужно деактивировать предыдущую запись и использовать новую, в противном случае мне нужно игнорировать эту новую строку. 03.09.2017
  • @ТТ. это система поставщика, и я, к сожалению, не имею никакого контроля над структурой данных. Мы получаем дампы данных, и я пытаюсь извлечь максимальную выгоду из ситуации. Я также взгляну на стек SE, спасибо, что сообщили мне об этом. 03.09.2017
  • @JasonA.Long Я имею в виду SCD II. Что касается звучания как SCD I, я понимаю, откуда вы взяли эту идею. Что касается слияния, у меня было бы вложенное слияние, которое выполняло бы две задачи: помечать текущую запись как неактивную и вставлять новую запись. 05.09.2017
  • Я заявлю, что это личное предпочтение просто потому, что есть несколько законных способов смоделировать это... Мое личное предпочтение - использовать модель типа 6... Основная таблица сохраняется как тип 1, содержащая только самую последнюю информацию. а затем используйте отдельные таблицы типа 2 или таблицы истории для хранения истории нескольких столбцов, которым требуется управление версиями. 05.09.2017
  • @JasonA.Долго интересно. Я читал об этой модели на Kimbal, и она не использует вторую таблицу. Я слышал о других, которые используют описанный вами метод, хотя я не хочу идти по пути триггеров (так они перемещали данные в историческую таблицу 05.09.2017
  • Ошибка с моей стороны... Я должен был сказать тип 4, а не 6... Разница в том, что история включает только те столбцы, которым нужна история типа 2. Итак, если вам нужна история только для 6 из 80 столбцов, таблица истории будет содержать только эти столбцы плюс идентификатор для присоединения к основной таблице и дату и время изменения. 05.09.2017
  • Понял. Кажется, что вы делали это в прошлом, с этим предположением, как вы управляли движущимися частями данных? 05.09.2017

Новые материалы

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

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

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

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..