2010-07-01 1 views
0

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

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

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

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

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

ответ

1

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

-- 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 

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

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

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

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

Добавить Колум в родительский набор, настроить с уникальным идентификатором GUID в каждом ВСТАВИТЬ родителя ... колонка XYZ = новый справ ВЫБРАТЬ NewID от Родителя, где XYZ в (список GUIDs генерируемой) UPDATE родительский набор XYZ = правильное значение где (фильтр или соединение основано на NewId) Дети INSERT (с использованием полученного NewId)

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

 Смежные вопросы

  • Нет связанных вопросов^_^