Azure Поток данных создания / управления ключами для отношений идентичности - PullRequest
1 голос
/ 18 июня 2020

Любопытно узнать, как лучше всего сгенерировать идентификационные данные отношений через ADF.

Прямо сейчас я использую JSON данные, которые не содержат никакой информации об идентичности. Затем эти данные преобразуются в несколько таблиц приемников базы данных с отношениями (1..n, et c.). Из-за ограничений FK в некоторых таблицах приемников-приемников эти отношения необходимо «выстраивать» по одной. параметры, о которых я не знаю.

Обратите внимание, что мне нужно включать генерацию суррогатного ключа для каждой вставки. Если я этого не сделаю, основываясь на схеме выходной базы данных, я получу ошибку «не могу вставить PK null».

Также обратите внимание, что я включаю IDENTITY_INSERT ВКЛ / ВЫКЛ для каждого приемника.

enter image description here

1 Ответ

0 голосов
/ 19 июня 2020

Я бы предпочел подход ELT и использовал собственные JSON abilites в Azure SQL DB, ie OPENJSON. Вы можете поместить JSON в таблицу в Azure SQL DB, используя ADF (например, действие Stored Pro c), а затем вызвать другой сохраненный pro c для обработки JSON, примерно так:

-- Setup
DROP TABLE IF EXISTS #tmp
DROP TABLE IF EXISTS import.City;
DROP TABLE IF EXISTS import.Region;
DROP TABLE IF EXISTS import.Country;
GO

DROP SCHEMA IF EXISTS import 
GO

CREATE SCHEMA import
    CREATE TABLE Country ( CountryKey INT IDENTITY PRIMARY KEY, CountryName VARCHAR(50) NOT NULL UNIQUE )
    CREATE TABLE Region ( RegionKey INT IDENTITY PRIMARY KEY, CountryKey INT NOT NULL FOREIGN KEY REFERENCES import.Country, RegionName VARCHAR(50) NOT NULL UNIQUE )
    CREATE TABLE City ( CityKey INT IDENTITY(100,1) PRIMARY KEY, RegionKey INT NOT NULL FOREIGN KEY REFERENCES import.Region, CityName VARCHAR(50) NOT NULL UNIQUE )
GO


DECLARE @json NVARCHAR(MAX) = '{
   "Cities": [
      {
         "Country": "England",
         "Region": "Greater London",
         "City": "London"
      },
      {
         "Country": "England",
         "Region": "West Midlands",
         "City": "Birmingham"
      },
      {
         "Country": "England",
         "Region": "Greater Manchester",
         "City": "Manchester"
      },
      {
         "Country": "Scotland",
         "Region": "Lothian",
         "City": "Edinburgh"
      }
   ]
}'


SELECT *
INTO #tmp
FROM OPENJSON( @json, '$.Cities' )
WITH
(
    Country     VARCHAR(50),
    Region      VARCHAR(50),
    City        VARCHAR(50)
)
GO


-- Add the Country first (has no foreign keys)
INSERT INTO import.Country ( CountryName )
SELECT DISTINCT Country
FROM #tmp s
WHERE NOT EXISTS ( SELECT * FROM import.Country t WHERE s.Country = t.CountryName )


-- Add the Region next including Country FK
INSERT INTO import.Region ( CountryKey, RegionName )
SELECT t.CountryKey, s.Region
FROM #tmp s
    INNER JOIN import.Country t ON s.Country = t.CountryName


-- Now add the City with FKs
INSERT INTO import.City ( RegionKey, CityName )
SELECT r.RegionKey, s.City
FROM #tmp s
    INNER JOIN import.Country c ON s.Country = c.CountryName
    INNER JOIN import.Region r ON s.Region = r.RegionName
        AND c.CountryKey = r.CountryKey


SELECT * FROM import.City;
SELECT * FROM import.Region;
SELECT * FROM import.Country;

Это простой тестовый сценарий, предназначенный для демонстрации идеи, и он должен выполняться от начала до конца, но это не рабочий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...