Какой лучший темп. метод связывания записей, которые нужно отправить на сервер для вставки в БД - PullRequest
0 голосов
/ 01 июля 2010

[СЦЕНАРИЙ] Сценарий заключается в том, что существует необходимость отправки нескольких записей через XML-файл на сервер для вставки в базу данных.Эти записи состоят из нескольких основных и подробных таблиц, связанных между собой первичным и внешним ключами.

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

{Клиент} ---------------> {Наш сервер} -> {SQL Server}

[ВОПРОС] Каков наилучший способ временного связывания основных и подробных записей, чтобы сервер должен понимать связанные записи и заменять временные первичные / внешние ключи на GUID или любой автоматический номер / уникальный ключ согласно схеме базы данных,?

Должен ли я использовать простые последовательные целочисленные ключи или GUID?Есть ли отраслевые стандарты?

1 Ответ

1 голос
/ 08 июля 2010

Я никогда не слышал о каких-либо стандартных способах сделать это, в промышленности или иным образом. По возможности, вы хотите определить / сгенерировать первичные ключи перед добавлением строк в базу данных. Естественные ключи идеально подходят для этого, и гиды тоже подойдут. Краткий пример:

--  Start with Parent row and several Children rows to insert
SET @GuidPK = newid()
INSERT parent row using @GuidPK
INSERT children rows using @GuidPK

Если вы не можете сделать это (что произойдет, если вы используете столбец идентификаторов в качестве первичного ключа родителя) и вставляете одного родителя (+ 0 или более дочерних элементов), все равно просто:

--  Start with Parent row and several Children rows to insert
INSERT Parent  --  Presums one at a time!
SET @NewPK = scope_identity()
INSERT Children using @NewPK

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

Сначала добавьте каждого «нового» родителя в родительскую таблицу. Как только это будет сделано, запросите родительскую таблицу и извлеките новый Id, назначенный каждому родителю, и назначьте его соответствующим дочерним строкам, когда они будут загружены. Код Псуэдо:

INSERT ParentSet
SELECT NewIds of ParentSet just loaded
INSERT ChildSet using these NewIds

Хитрость в том, чтобы идентифицировать и извлечь (только) новых родителей, которых мы только что ввели. Если у вас есть ключ natrual (уникальное имя продукта, OrderId, может быть, что-то, основанное на данных даты и времени), используйте его. Если нет, вам нужно подделать один. Я проделал трюки, в которых изначально генерировал guid для каждого добавляемого родителя, устанавливал произвольный столбец для этого родителя во время первоначальной вставки, извлекал новые идентификаторы, читая только для этих направляющих, а затем заменяя направляющие соответствующим столбцом. значение. Более псевдо-код:

Добавьте столбец к родительскому набору, настройте с уникальным guid в каждом ВСТАВИТЬ родительский ... столбец XYZ = новый guid ВЫБЕРИТЕ NewId из Parent, где XYZ (список сгенерированных направляющих) ОБНОВЛЕНИЕ родительского набора XYZ = правильное значение где (фильтр или объединение на основе NewId) ВСТАВИТЬ детей (используя полученный NewId)

Надеюсь, это поможет, это трудно объяснить без конкретных структур и примеров данных.

...