Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
Всех приветсвую. Я новичок в работе с базами данных, поэтому заранее прошу меня извинить за глупые вопросы. Встала задача проектирования БД и реализации механизма импорта данных. Суть проблемы заключается в следующем: необходимо импортировать неструктурированные данные из Excel в несколько таблиц на Sql Server. Импорт будет производится путем запуска приложения на VBA. Приложение одновременно будет и записывать данные и формировать из уже записанных данных отчёт. Объем загружаемых данных не больше 10000 строк за 1 запуск приложения. Одновременно работать с базой могут работать до 10 пользователей. Сейчас я сделал реализацию несколькими способами: 1) На сервере создана таблица для импорта данных с нужными форматами, но без ключей. Проверка форматов происходит на стороне клиентского приложения , далее идет импорт данных в загрузочную таблицу с указанием @@spid пользователя. Далее клиентское приложение вызывает хранимую процедуру, в которой вызывается транзакция, которая распределяет данные по таблицам, делая проверки на уникальность ключей. После этого процедура стирает данные из загрузочной таблицы, используя как ключ @@spid пользователя. В этом подходе меня смущает проблема контроля данных в загрузочной таблице, когда одновременно несколько пользователей будут работать. 2) На стороне приложения создается временная таблица , туда происходит импорт данных , а далее приложением вызывается хранимая процедура, которая ссылается в коде на временную таблицу. В этом подходе не очень нравится, что в коде необходимо формировать запрос на создание временной таблицы. - Подскажите имеют ли предложенные мною реализации право на жизнь и какие могут быть узкие места в этом случае? - Прекрасно понимаю, что каждый бизнес-кейс уникален, но все же, как технически лучше реализовывать механизм распределения данных по таблицам? - Лучше делать это на стороне клиентского приложения или же на стороне сервера? Буду рад любой помощи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 11:16 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89, 2-й вариант лучше, ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 13:36 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89Суть проблемы заключается в следующем: необходимо импортировать неструктурированные данные из Excel в несколько таблиц на Sql Server. Открою тебе страшную тайну: "импортировать неструктурированные данные" невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 14:15 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
L_argoStarDestroyer89, 2-й вариант лучше, ИМХО. Это в вас императивный программист не убит. Привет GoTo. Сервер - лучше. Хотя бы потому, что если что-то пошло не так - не надо бежать к пользователю - можно осмотреть прямо на сервере. Более того "проверка форматов" тоже должна быть на сервере. Грузить туда следует "необработанные данные." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 14:19 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89На стороне приложения создается временная таблица , туда происходит импорт данных , а далее приложением вызывается хранимая процедура, которая ссылается в коде на временную таблицу.Не понял... временная таблица на клиенте - это в Экселе, что ли? StarDestroyer89В этом подходе меня смущает проблема контроля данных в загрузочной таблице, когда одновременно несколько пользователей будут работать.А в чём суть проблемы? Что Вы собираетесь там контролировать? StarDestroyer89как технически лучше реализовывать механизм распределения данных по таблицам?Работу с неструктурированными или денормализованными исходниками по приведению их во вменяемый формат можно оставить клиенту. А вот работу с данными лучше поручать тому, кто предназначен для работы с данными - т.е. серверу БД. Т.е. клиент - получает сырые данные, первично "причёсывает" их, получая плоскую денормализованную таблицу с выверенными форматами и словарными значениями, и отдаёт серверу. Сервер - проводит окончательный контроль, формализует словарные данные, после чего раскладывает данные по таблицам с сохранением ссылочной целостности. Данные, не прошедшие контроля, возвращаются клиенту. Который проводит дополнительную обработку (возможно, даже ручную) по "причёсыванию" данных, и либо снова отправляет их серверу, либо присоединяет к следующему пакету. StarDestroyer89импорт данных в загрузочную таблицу с указанием @@spid пользователя.Соединение может и порваться... что, начинать всё сначала? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 14:22 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer892) На стороне приложения создается временная таблица , туда происходит импорт данных , а далее приложением вызывается хранимая процедура, которая ссылается в коде на временную таблицу. В этом подходе не очень нравится, что в коде необходимо формировать запрос на создание временной таблицы. В зависимости от версии сервера можно и более продвинуто извратиться. Например, если у вас 2016SP2+ или 2017 сервер, то можно создать в базе memory-optimized table co со стабильностью SCHEMA_ONLY. А потом взвести на ней безопасность на уровне строк, соответственно чтобы каждый пользователь оперировал своим куском данных. Ну и дальше - всё, как с темповой таблицей. Но создаешь один раз, и работает быстро. В MSDN есть пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 15:52 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
AkinaStarDestroyer89На стороне приложения создается временная таблица , туда происходит импорт данных , а далее приложением вызывается хранимая процедура, которая ссылается в коде на временную таблицу.Не понял... временная таблица на клиенте - это в Экселе, что ли? StarDestroyer89В этом подходе меня смущает проблема контроля данных в загрузочной таблице, когда одновременно несколько пользователей будут работать.А в чём суть проблемы? Что Вы собираетесь там контролировать? StarDestroyer89как технически лучше реализовывать механизм распределения данных по таблицам?Работу с неструктурированными или денормализованными исходниками по приведению их во вменяемый формат можно оставить клиенту. А вот работу с данными лучше поручать тому, кто предназначен для работы с данными - т.е. серверу БД. Т.е. клиент - получает сырые данные, первично "причёсывает" их, получая плоскую денормализованную таблицу с выверенными форматами и словарными значениями, и отдаёт серверу. Сервер - проводит окончательный контроль, формализует словарные данные, после чего раскладывает данные по таблицам с сохранением ссылочной целостности. Данные, не прошедшие контроля, возвращаются клиенту. Который проводит дополнительную обработку (возможно, даже ручную) по "причёсыванию" данных, и либо снова отправляет их серверу, либо присоединяет к следующему пакету. StarDestroyer89импорт данных в загрузочную таблицу с указанием @@spid пользователя.Соединение может и порваться... что, начинать всё сначала? Я просто неверно выразился: временная таблица конечно же создается на сервере, просто скрипт на ее создание я формирую на клиенте - это не очень нравится, так как код получается длинный(в таблице 30 столбцов). Если соединение разорвется, то пользователь прокрутит VBA-приложение еще раз - тут ничего страшного не случится. Но тогда в таблице для импорта "зависнут" данные - этот момент нужно как-то контролировать. Очищать всю таблицу я не могу так в этот момент с ней может работать другой пользователь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 16:05 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89, механизм строится на постоянку или на время старта системы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 16:14 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
andreymx, процесс импорта будет постоянным . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 16:35 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89Очищать всю таблицу я не могу так в этот момент с ней может работать другой пользователь. С безопасностью на уровне строк - никаких проблем. Очищай на здоровье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 17:02 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89, Сделайте общую папку, в которую 10 человек будут сбрасывать файлы для загрузки. Создайте пакет Intergation Services, который будет по расписанию смотреть в эту папку и загружать содержимое файлов на сервер. Идите в кассу за премией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 17:36 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
AkinaStarDestroyer89импорт данных в загрузочную таблицу с указанием @@spid пользователя.Соединение может и порваться... что, начинать всё сначала?Временная таблица тоже умрет если соединение порвется. Ему же не вручную 10000 строк грузить. Ну сколько это займет, пару секунд? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 19:39 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
Владислав КолосовStarDestroyer89, Сделайте общую папку, в которую 10 человек будут сбрасывать файлы для загрузки. Создайте пакет Intergation Services, который будет по расписанию смотреть в эту папку и загружать содержимое файлов на сервер. Идите в кассу за премией.Intergation Services отчет тоже нарисует? Ну и пользователям может не понравиться что нет кнопки - "начать загрузку". Кинул файл в папку и сиди жди пока тебе отчет пришлют? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 19:43 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89Я просто неверно выразился: временная таблица конечно же создается на сервере, просто скрипт на ее создание я формирую на клиенте - это не очень нравится, так как код получается длинный(в таблице 30 столбцов).Длинный код это реальная проблема, голодающие дети в Африке отдыхают. С временной таблицей самый некрасивый момент это то что её создание и использование оторваны друг от друга. Создание в коде в приложении, а использование в процедуре. Вот кто нибудь после вас захочет поменять процедуру, а там используется временная таблица, которая неизвестно где создается. Эту процедуру даже отладить будет нереально без исходников приложения. Короче, если пойдете этим путем, то пишите в процедуре коментарии и желательно скрипт для создания временной таблицы. Ну и конечно нужно убедиться что у вас весь процессинг в одном коннекшене происходит, иначе получите "объект не найден". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 19:53 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
MindВладислав КолосовStarDestroyer89, Сделайте общую папку, в которую 10 человек будут сбрасывать файлы для загрузки. Создайте пакет Intergation Services, который будет по расписанию смотреть в эту папку и загружать содержимое файлов на сервер. Идите в кассу за премией.Intergation Services отчет тоже нарисует? Ну и пользователям может не понравиться что нет кнопки - "начать загрузку". Кинул файл в папку и сиди жди пока тебе отчет пришлют? Вы правы в данном случае это не подходит, хотя вариант интересный. Попробую его использовать для другого проекта) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 23:13 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
MindStarDestroyer89Я просто неверно выразился: временная таблица конечно же создается на сервере, просто скрипт на ее создание я формирую на клиенте - это не очень нравится, так как код получается длинный(в таблице 30 столбцов).Длинный код это реальная проблема, голодающие дети в Африке отдыхают. С временной таблицей самый некрасивый момент это то что её создание и использование оторваны друг от друга. Создание в коде в приложении, а использование в процедуре. Вот кто нибудь после вас захочет поменять процедуру, а там используется временная таблица, которая неизвестно где создается. Эту процедуру даже отладить будет нереально без исходников приложения. Короче, если пойдете этим путем, то пишите в процедуре коментарии и желательно скрипт для создания временной таблицы. Ну и конечно нужно убедиться что у вас весь процессинг в одном коннекшене происходит, иначе получите "объект не найден". Тоесть лучше остановится на первом варианте с постоянной таблицей , сделав изоляцию на уровне строк, как, например, советовал uaggster ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 23:16 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89Сейчас я сделал реализацию несколькими способами: 1) На сервере создана таблица 2) На стороне приложения создается временная таблица - Подскажите имеют ли предложенные мною реализации право на жизнь и какие могут быть узкие места в этом случае? Первый вариант какой то костыльный. Проблема с тьем, что при ошибке данные остаюися, нестрашная, нужно просто придерживаться правила, что данные очищаются до использования, а не после. Второй вариант - это в принципе классика. Но действительно, нехорошо, что разделяется управление, создание на клиенте, использование на сервере. 3) Можно ещё использовать появившиеся недавно (с 2008) табличные параметры. Очень хороший вариант, хотя реализован в сиквеле кривовато (нужно делать тип данных). 4) Ещё вариант - клиент кладёт структуру данных в XML, процедура его разбирает. Для ваших мизерных нагрузок очень неплох. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 09:42 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
alexeyvg3) Можно ещё использовать появившиеся недавно (с 2008) табличные параметры. Очень хороший вариант, хотя реализован в сиквеле кривовато (нужно делать тип данных). 4) Ещё вариант - клиент кладёт структуру данных в XML, процедура его разбирает. Для ваших мизерных нагрузок очень неплох. Ога. И еще 100500 преобразований из формата в формат. Нафига? Завтра принесут еще "данных", которые в ваш универсальный формат не влазют. И фсе, приплыли. Православная загрузка должна состоять из изолированных шагов, которые можно проверять-отлаживать независимо 1. Загрузка данных "как есть" в промежуточную-"временную (не в смысле #)" таблицу. 2. Обработка данных и приведение их к нужному виду. 3. Загрузка в окончательные таблицы. Строить "универсальную" загрузку - в 101% случаев бессмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 14:27 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
aleks222Православная загрузка должна состоять из изолированных шагов, которые можно проверять-отлаживать независимо 1. Загрузка данных "как есть" в промежуточную-"временную (не в смысле #)" таблицу. 2. Обработка данных и приведение их к нужному виду. 3. Загрузка в окончательные таблицы.С этим я полностью согласен. Самое правильное. Но бывают маленькие задачки, когда нужно вставить в базу чуть чуть введённых пользователем (например, из выбранного пользователем файлика) данных, их сохранить/обработать, я прямо сразу показатль на экране. Причём давнных немного и обработка несложная. Тогда простенькие решения, с передачей данных одним из указанных способов, ИМХО вполне подходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 21:46 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
StarDestroyer89необходимо импортировать неструктурированные данные из Excel Объем загружаемых данных не больше 10000 строк за 1 запуск приложения. Одновременно работать с базой могут работать до 10 пользователей. Меня всегда на этапе формулировки формата и объема данных начинают терзать смутные сомнения. Я б начал с того, что бы посмотреть, откуда эти 10 пользователей берут по 10000 неструктурированных строк. Может быть эти строки не такие уж неструктурированные и вынимаются из соседней базы или генерятся каким либо софтом или оборудованием соответственно в очень даже структурированном формате. Не, я конечно допускаю, что есть задачи, когда пользователь ручками набивает 10000 строк, но это очень очень редкая задача имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2019, 02:16 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
PizzaPizzaЯ б начал с того, что бы посмотреть, откуда эти 10 пользователей берут по 10000 неструктурированных строк.Обычно это эксель файлы, присылаемые контрагентами, часто случайными, или такими, с которыми дела делаются раз в год. Там с трудом добиваются, что бы они не передавали данные по факсу, или устно по телефону, куда там интегрировать их систему в свою :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2019, 09:05 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
alexeyvgPizzaPizzaЯ б начал с того, что бы посмотреть, откуда эти 10 пользователей берут по 10000 неструктурированных строк.Обычно это эксель файлы, присылаемые контрагентами, часто случайными, или такими, с которыми дела делаются раз в год. Там с трудом добиваются, что бы они не передавали данные по факсу, или устно по телефону, куда там интегрировать их систему в свою :-)бардак автоматизировать невозможно (с) Не пробовали им сайт сделать, пусть вводят сами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2019, 09:14 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
PizzaPizzaStarDestroyer89необходимо импортировать неструктурированные данные из Excel Объем загружаемых данных не больше 10000 строк за 1 запуск приложения. Одновременно работать с базой могут работать до 10 пользователей. Меня всегда на этапе формулировки формата и объема данных начинают терзать смутные сомнения. Я б начал с того, что бы посмотреть, откуда эти 10 пользователей берут по 10000 неструктурированных строк. Может быть эти строки не такие уж неструктурированные и вынимаются из соседней базы или генерятся каким либо софтом или оборудованием соответственно в очень даже структурированном формате. Не, я конечно допускаю, что есть задачи, когда пользователь ручками набивает 10000 строк, но это очень очень редкая задача имхо. Вы все правильно подметили: у данных есть конкретный источник данных. Данные берутся из нескольких транзакций ERP системы SAP. Потом в Excel по определенной логике преобразовываются и далее запускается импорт на SQL, а далее пользователи получают сложный отчет в Excel. Я знаю, что решение костыльное - в силу определенных бизнес-процессов и политик безопасности я не могу напрямую работать с таблицами SAP, как и настроить регулярную выгрузку на SQL, чтобы сразу строить отчёт. Поэтому данные уже имеют определенную структуру и форматы - требуется лишь определенная проверка на бизнес-логику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2019, 09:59 |
|
||
|
Проектирование механизма импорта данных в БД
|
|||
|---|---|---|---|
|
#18+
andreymxalexeyvgпропущено... Обычно это эксель файлы, присылаемые контрагентами, часто случайными, или такими, с которыми дела делаются раз в год. Там с трудом добиваются, что бы они не передавали данные по факсу, или устно по телефону, куда там интегрировать их систему в свою :-)бардак автоматизировать невозможно (с) Не пробовали им сайт сделать, пусть вводят сами?Угу, ушлые менеджеры нашли заводик, где можно разово взять пиломатериалу для стройки, недорого, а ты им такой "пусть сайтик делают" :-) Не люблю я эти рассуждения о "бардак автоматизировать". Это реальный бизнес, это жизнь; как вы дома не окружаете себя качественно спроектированным комплексным решением одного бренда (от фундамента и стен, до рубашек и вилок), причём испольуемое статично от рождения до смерти, так и бизнес работает десятилетиями (да и столетиями тоже), решая возникающие задачи теми методами и средствами, которые на данный момент времени существуют, и которые на данный момент времени кажутся наиболее эффективными. Понятие "автоматизировать бардак" или "костыли" правильны для одного замкнутого разового решения, действительно, с этим надо бороться, но когда так называют все процессы и активы, это термины неправильные, потому что не бывает полезного и настоящего бизнеса, которые спроектирован "из одного бренда". Если только что то совсем мелкое, одноразовое, типа "кафе-контейнер". Вот, ТС описал, что есть некая система, большая и сложная, ну и решили в неё не лезть, а сделать для простой задачи выгрузку штатными средствами в Эксель. Вполне разумное решение, конечно, оправданно для определённых ситуаций, в других нужно будет использовать какие то "шины", "коннекторы", лезть напрямую к таблицам и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2019, 15:49 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39790201&tid=1688060]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
147ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
1ms |
| others: | 280ms |
| total: | 572ms |

| 0 / 0 |
