Как вы думаете, почему я сегодня решил затронуть тему древнегреческих мифов? Подождите, я попробую угадать. :)
Наиболее вероятные ваши ответы (их всего два, да и то похожих):
- ХЕЗ (разновидности - АХЕЗ, "понятия не имею", "а мне почём знать?" и т.п.)
- потому что тебя (меня) сегодня "торкнуло" на древнегреков и их подвиги.
Вы, наверное, спросите - "ну и что интересного в навозе?". Отвечу, как могу. В самом навозе интересного (лично для меня) мало. Да и вообще... Просто я решил взять покрасивше название для поста. ;)
На самом же деле речь я поведу о коде, который я бы непрочь сравнить с навозом. Не обязательно с конским, но тоже ароматным. ;) Какой же код я готов сравнить с навозом? Как считаете? Тот ли, что криво написан? Да, наверное. Но причём тут тогда Авгий с его знаменитейшими конюшнями? А притом, что есть разные варианты кривого кода. Есть код, который крив по причине кривизны рук, а есть код, который довольно трудно написать красиво. И вот именно написание такого кода в красивом виде, имхо, задача сродни пятому подвигу божественного героя древних греков. Про первый же случай кривизны кода я разговор вести пока не хочу - тут и хирурги часто бессильны.
А вот про подвиги хотелось бы провести беседу. Желательно конструктивную. Для чего я постараюсь привести пример (по памяти) ситуации, в которой родился кривой код. Итак, краткое описание задачи:
Даны две базы данных с одинаковой структурой (данные могут быть разными и будут таковыми, но структура одна). Имеется таблица А, содержащая (значимых для нас) два поля - идентификатор и имя объекта. Имя должно быть уникальным в пределах базы. Есть таблица Б, также содержащая такие же поля (имена тут уже не обязаны быть уникальными; точнее, они должны быть уникальны в связке со ссылкой на таблицу А) и плюс поле с идентификатором из таблицы А. В обоих базах есть данные в указанных таблицах. Данные частично совпадают, частично перекрываются.
Задача: требуется проработать алгоритм импорта данных (содержимое таблиц А и Б), учитывая некоторые особенности. Данные не должны "теряться". Важны данные обоих баз (т.е., нельзя просто "перекрывать" данные). При импорте надо учитывать, что в таблице А главным является поле имени (идентификатор нужен только для ссылок на запись, т.к. имя может быть слишком уж длинным). Естественно, при импорте необходимо импортировать как запись таблицы А, так и все записи таблицы Б, которые связаны с этой записью. Теперь добавим сюда, что работа с базой данных идёт через SQL. Обычный такой, стандартный, который при INSERT'е с имеющимся в базе идентификатором ругается на чём свет стоит, а при UPDATE с несуществующим идентификатором тихо-мирно посапывает. Если в базе-назначении есть запись из А с таким же именем, то необходимо её заменить (все записи таблицы Б в этом случае тоже заменяются).
Вот, вроде бы, и всё. Если ещё что-то вспомню - допишу в комментариях. От уважаемой публики хотелось бы услышать, как в таком случае можно красиво организовать код (у меня он вышел жутким и не идей, как сделать его хотя бы нормальным).
Комментарии:
- said...
-
Жень, поясни пожалуйста - что ты имел ввиду(по моему два этих утверждения, малость, противоречат:
1)данные не должны "теряться". Важны данные обоих баз (т.е., нельзя просто "перекрывать" данные).
2)Если в базе-назначении есть запись из А с таким же именем, то необходимо её заменить (все записи таблицы Б в этом случае тоже заменяются). - said...
-
Пожалуйста:
В указанных утверждениях нет противоречия. Просто я выразился не совсем удачно и вложенный смысл затерялся под смыслом, наиболее простым для разумения. :)
Изначально я хотел сказать, что нельзя просто снести данные в базе-получателе и просто подменить их на данные из базы-источника. Причём, стоит заметить, что уникальность в таблице А устанавливается по имени объекта, а не по идентификатору. - said...
-
ясно. есть кое-какие идеи, но надо покумекать.
- said...
-
Да... похоже, идеи просто бьют ключом у всех присутствующих. :)
А жаль. Хотелось как-то улучшить свои навыки в плане создания хорошего кода. Ладно, ежели чего изобрету (ну там, велосипед какой-нибудь) - отпишусь. - said...
-
Жень - идейка есть, но сейчас времени нет. Вылезли кое-какие проблемы в CAN-Viewer'е. Пришлось полностью переписать блок выбора просматриваемых сообщений ;( А идейка по твоей теме требует проверки ( она пока тоьлько в голове ) Кроме того хотел ее выложить здесь, а это тоже требует времени( учитывая мой инет ;)
- said...
-
По поступающим вопросам делаю вывод, что логика импорт неясна. Привожу свои разъяснения:
1. поля таблиц
а (таблица):
а.ид - идентификатор для ссылок
а.имя - имя
уникальность записей отдельно по а.ид и отдельно по а.имя
б (таблица):
б.ид - идентификатор
б.имя - имя
б.а_ид - ссылка на объект из таблицы а
уникальность отдельно по б.ид и отдельно по двум полям - б.имя и б.а_ид2. экспорт
Экспортируем запись из таблицы а и все связанные с нею записи из таблицы б. Например, в хмл3. импорт
Импортируем запись в таблицу а, ища соответсвие по а.имя. Если с таким именем уже есть, то надо заменить. При этом связанные со старой записью из а (в базе-получателе) записи таблицы б надо снести, чтобы не было мусора. Если в таблице а не было - добавляем.
Затем импортируем привязанные записи таблицы б. Чаще всего добавляем, но желательно производить замену (если идентификаторы а.ид были одинаковы, то высока вероятность, что и записи в Б во многом совпадут).З.Ы. На всякий случай добавлю, что никакой ручной обработки базы данных перед импортом не производится - всё должна делать автоматика.
- said...
-
Да, ещё... а то тут мысли у людей всякий заумные появляются :)
Базы данных прямой связи (канала по лан, инэту и пр.) не имеют.
- said...
-
И ещё: импорт-экспорт встраивается в стандартную клиентскую программу (потому что он там нужен Заказчику) и это не позволяет просто написать небольшую утилитку перетаскивания данных из одной базы в другую. Зато есть весь остальной код и мы знаем, с какими объектами мы работаем (т.е., можно работать на уровне объектов, а не просто записей БД).
Читайте также
Последние новости
План занятий
Обучение детей от года до 3 лет плаванию, как правило, проходит в три этапа. На первом этапе ребенок должен адаптироваться к воде, избавиться от страха перед глубиной, неизвестной средой. Намного проще дети привыкают к бассейну, где есть бортики, вода теплая и прозрачная. Чуть сложнее дети адаптируются к открытым водоемам с темной и прохладной ...Читать далее »
Гимнастика от 2 лет до 2 лет 6 месяцев
1. Самостоятельная ходьба. 2. Бег вдогонку за взрослым или к взрослому в разном темпе. 3. Руки вверх, потянуться – «деревья большие большие», развести руки в стороны. 4. Ходьба по доске, приподнятой над полом на 15–20 см. 5. Приседания. 6. Подъем туловища с опорой на ладони в положении лежа на животе. 7. Хлопк...Читать далее »
Проблема: ожоги, ушибы, травмы
Немного повзрослев, ребенок начинает интересоваться источниками огня, что чревато ожогом. При незначительном ожоге необходимо поврежденный участок тела поместить под холодную проточную воду, а затем обработать антиожоговым аэрозолем. В период выздоровления применяют массаж, который способствует улучшению лимфо– и кровотока. В резуль...Читать далее »
Проблема: плоскостопие
Когда ребенок начинает ходить, его первые шаги могут быть омрачены плоскостопием. К сожалению, если эта болезнь наследственная, то волнения вполне обоснованны. И здесь без посещения детского врача ортопеда не обойтись. Его рекомендации относятся к укреплению подошвенного свода стопы вашего ребенка. Костная структура стопы ребенка ...Читать далее »
Рефлекторные движения
Рефлекторные гимнастические упражнения, В основе которых лежат врожденные двигательные рефлекторные реакции, проводятся первые три пять месяцев жизни ребенка, когда еще не утрачены безусловные двигательные рефлексы – «автоматическая походка», ладонно ротовой рефлекс, хоботковый рефлекс, сохранение равновесия, защитно оборонительные рефлексы. Рефлекторные гимнасти...Читать далее »
Техника выполнения: растирание
Прямолинейное растирание Выполняется концевыми фалангами одного или нескольких пальцев. Движение проводится прямолинейно одной рукой или обеими, иногда с отягощением. Круговое растирание Проводится с помощью круговых движений концевыми фалангами одного или нескольких пальцев. Кисть располагается с опорой на основании ладони, а манипуляции выполняют в сторону мизинца одной рук...Читать далее »
Проблема: пупочная грыжа
Пупочная грыжа – это патологическое состояние, в котором через несколько расширенное пупочное кольцо происходит выпячивание брюшины, сальника и даже кишечника. Причина заболевания следующая: вследствие дефекта передней брюшной стенки и пупочного кольца проявляется округлое или овальное выпячивание. Чаще факторами, провоцирующими повышение внутрибрюшного давления, являются кашель, запоры ...Читать далее »
