Стратегия хранения дополнительных данных вместе с импортированными данными

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

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

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

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

Но в моей новой системе сотрудники могут сохранять биографические данные. Итак, в другой таблице я сохраняю это и их идентификатор.

Было бы проще иметь только одну таблицу, но я не могу этого сделать, потому что я бы отбросил данные, которых нет в другом месте, когда я выполняю импорт.

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

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

Я использую Sql server 2008, но мне интересно услышать о стратегиях, которые могут работать с любой СУБД.


person Ronnie Overby    schedule 21.01.2010    source источник


Ответы (2)


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

Вы также можете попробовать новую команду MERGE SQL в 2008 году, она может оказаться очень полезной в этом случае.

person Bandi-T    schedule 21.01.2010
comment
Это именно то, что я искал. Спасибо. - person Ronnie Overby; 22.01.2010

Вот оператор слияния SQL Server 2008, который я придумал, чтобы помочь мне в моей текущей ситуации:

MERGE INTO dbo.Sections as S        -- Target
USING dbo.SectionsStaging as SS     -- Source
ON S.Id = SS.Id                     -- Join
WHEN MATCHED THEN                   -- Record exists in both tables
    UPDATE SET
        TermCode = SS.TermCode,
        CourseTitle = SS.CourseTitle,
        CoursePrefix = SS.CoursePrefix,
        CourseNumber = SS.CourseNumber,
        SectionNumber = SS.SectionNumber,
        Capacity = SS.Capacity,
        Campus = SS.Campus,
        FacultyFirstName = SS.FacultyFirstName,
        FacultyLastName = SS.FacultyLastName,
        [Status] = SS.[Status],
        Enrollment = SS.Enrollment
WHEN NOT MATCHED THEN               -- Record exists only in source table
    INSERT ([Id],[TermCode],[CourseTitle],[CoursePrefix],[CourseNumber],[SectionNumber],[Capacity],[Campus],[FacultyFirstName],[FacultyLastName],[Status],[Enrollment])
    VALUES (SS.[Id],SS.[TermCode],SS.[CourseTitle],SS.[CoursePrefix],SS.[CourseNumber],SS.[SectionNumber],SS.[Capacity],SS.[Campus],SS.[FacultyFirstName],SS.[FacultyLastName],SS.[Status],SS.[Enrollment])
WHEN NOT MATCHED BY SOURCE THEN     -- Record exists only in target table
    DELETE;

Хорошая вещь!

person Ronnie Overby    schedule 22.01.2010
comment
Спасибо себе, что напомнил мне, как это сделать 2 года спустя! - person Ronnie Overby; 13.03.2012