Вопрос проектирования загрузки базы данных

Я ищу помощь в дизайне здесь.

Я делаю работу для клиента, который требует от меня хранить данные о своих десятках тысяч сотрудников. Данные передаются мне в таблицах Excel, по одному для каждого города / страны, в которой у них есть офисы.

У меня есть база данных, которая содержит таблицу электронных таблиц и таблицу данных. В таблице данных есть столбец spreadsheet_id, который связывает ее с таблицей электронных таблиц, чтобы я знал, из какой электронной таблицы была получена каждая строка данных. У меня также есть простой сценарий оболочки, который загружает данные в базу данных.

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

Вопрос - как мне справиться с этим? Мне кажется, у меня есть следующие варианты:

  1. Загрузите всю измененную электронную таблицу и отметьте оригинал как «неактивный».

    ПРОФИ: Это просто, просто и легко автоматизировано.
    Минусы: в базе данных хранится много избыточных данных, особенно если электронная таблица изменяется много раз.

  2. Сделайте различия в таблицах и загружайте только те строки, которые изменились.

    ПРОФИ: меньше данных загружается в базу данных.
    Минусы: Это по крайней мере частично вручную, и, следовательно, подвержены ошибкам. Это также означает, что база данных больше не будет рассказывать всю историю - например, если некоторые данные будут отсутствовать позднее, я не смогу убедительно сказать, что я никогда не получал данные, просто запрашивая базу данных. И продолжит ли работать diff, даже если мне придется делать это несколько раз?

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

    ПРОФИ: Это автоматизировано.
    Минусы: для написания и тестирования такого процесса потребуется время, и мне будет очень трудно оправдать время, потраченное на это.

Я надеюсь найти четвертое и лучшее решение. Есть идеи относительно того, что это может быть?

11.12.2008 18:17:12
1 ОТВЕТ

Если у вас нет возможности быть на 100% уверенным, что вы можете избежать человеческой ошибки в варианте 2, не делайте этого.

Вариант 3: не должно быть слишком сложно (или много времени) написать скрипт VBA, который сделает сравнение за вас. VBA не быстр , но вы можете позволить ему работать всю ночь. Не должно быть более одного или двух часов, чтобы запустить его без ошибок.

Вариант 1. Это мой предпочтительный подход: быстрый, простой, и я не могу придумать ничего, что могло бы пойти не так прямо сейчас. (Ну, вы должны сначала пометить оригинал как «неактивный», а затем загрузить новый набор данных IMO). Особенно, если это может случиться чаще в будущем, важно иметь стабильный и быстрый процесс для его решения.

Если вы действительно беспокоитесь обо всех неактивных записях, вы также можете удалить их после обновления ( delete from spreadsheets where status='inactive'или некоторых других). Но до сих пор все базы данных, которые я видел в своей работе, имели много таких. Я бы не слишком волновался об этом.

1
11.12.2008 18:56:58