|
|
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НLeonidvМаксим Н, Я так понял, речь идет о системы миграции схемы БД. Чем плохи существующие решения - liquebase и dbmaintener ? Нет, не о ней. Просто об утилитке, которая поможет организовать удобное и продуманное хранение исходников БД, и дальнейшую работу с ними. А уже к этому всему можно и инструменты миграции применять и все что угодно. Я конечно ужасный зануда, но по поводу исходников есть же версионники, с методичками по их использованию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 09:21:32 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
GregTkМаксим Н, я стесняюсь спросить, но разве ваша задача не решается просто структурой каталогов и натравливанием git или mercurial ? Отчасти решается. К примеру разработчики могут договориться между собой хранить все исходники БД в какой-либо удобной для себя структуре. Например каждая таблица должна храниться в отдельной папке, форенкеи в отдельных файлах в этой же папке, в другом файле скрипты выдачи грантов, причем разделенные на несколько частей (для тестовой базы, для боевой, для другой боевой и т.д.), то же самое с содержимым таблицы (если это справочник, или тестовые данные) ну и т.д. Но проблема в том, что СКВ ничего не знает об этой договоренности. Т.о. за всю структуру файлов, за ее целостность, за правильность должен отвечать разработчик. Нет гарантии, что кто то не перепутает скрипты, положит их в нужное место и т.д. и тогда сборка будет не корректной. Вот я и задумлся о маленьком инструменте, который бы читал файлы со струтурой исходных файлов БД, мог контроллировать и поддержививать текущее состояние, а так же помогал бы при добавлении новых элементов и удалении старых. На основании конфигурации мог бы собирать любые скрипты для любых потребностей (скрипт создания тестовой базы, боевой базы, создать отдельно все таблицы без форенкеев, накатить только тестовые данные выбранных таблиц справочников и т.д.) ПС Об идее хранения информации о каждом файле в какой-нибудь бд или файле я действительно уже отказался, незачем, все и так лежит в репозитории. Пока остановился на 2-х конфигурационных xml-файлах: 1. типы объектов БД (из каких файлов состоит, в каких папках находится и т.д.) 2. модули приложения БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 12:51:47 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovМаксим Нпропущено... Нет, не о ней. Просто об утилитке, которая поможет организовать удобное и продуманное хранение исходников БД, и дальнейшую работу с ними. А уже к этому всему можно и инструменты миграции применять и все что угодно. Я конечно ужасный зануда, но по поводу исходников есть же версионники, с методичками по их использованию? Хороший вопрос, думаю в предыдущем посте ( 14243675 ) я на него ответил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 12:53:43 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим Н, - скриптов должна быть пара - накат и откат - скрипты группируют не по таблицам, а по атомарности - версии. Т.е. имя папки - версия. Для того чтобы не путали - есть системы контроля версий, сборщики, тестировщики, руководители проектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 13:04:09 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪ... Такая тулза есть, называется make, ну или аналоги. Пример мейкфайла: ... Кстати, в своё время думали и над make-ом, а также к нему и си-шный препроцессор или аналог прикрутить. Но не нашли счастья в таком решении. Я не приветствую здесь некоторую иронию в сторону автора этой темы, лично я разделяю его взгляды и попытки упростить жизнь. Ещё раз обращаю внимание, что речь идёт о существенных и тяжёлых проблемах при разработке БД, но с которыми, имхо, немалая часть разработчиков может и не сталкивалась в своей практике (возможно, лишь пока). Например, в моём случае есть огромные проблемы, когда целевая рабочая база для обновления не является условной копией (по метаданным) исходной эталонной (используемой при разработке). Т.е., как правило, чаще всего целевая база лишь некое подмножество исходного эталона, содержит только часть прикладных логических модулей (при этом взаимосвязанных). Кроме того, разработчики на местах могут расширять функционал, или вносить свои изменения. Причём существует вариантность одного и того же функционала в разных целевых базах, скажем, структура одной и той же таблицы отличается в зависимости от потребностей в каждом конкретном случае на местах, или код какого-нибудь триггера везде разный и т.д. и т.п. Утяжеляет ситуацию то, что целевых баз немалое количество, и процесс разработки/обновления, фактически, беспрерывный. Да и сами базы содержат немало логики внутри (такова историческая особенность), т.е. далеко не только таблицы с индексами, да и объектов в базе далеко не одна сотня и более. В этом случае многие стандартные/популярные средства вокруг серверов СУБД мало эффективны/неудобны или вовсе неработоспособны. В такой ситуации лично у меня большая нелюбовь ко всяким визуальным дизайнерам, от них гораздо больше мороки, чем пользы. Многие популярные средства для миграций типа liquebase, dbmaintener, dbdeploy и т.д. тоже хреновые помощники, ибо часто они не умеют работать с хранимками, триггерами и пр. (во всяком случае, адекватно) или требуют для этого того же ручного SQL-кодирования. Кроме того, они сами по себе нуждаются в некоем механизме для целеуказания, т.е. готовить "в лоб" вручную для них XML/json/sql-файлы и пр., требуемых на их входе, неудобно/проблематично. Это часть айсберга, сам по себе и процесс разработки БД требует эффективности. Я хочу попытаться поделиться (упрощённо) со своими идеями насчёт некоего универсального тулза для облегчения жизни, с учётом своего опыта и уже имеющихся решений. Вокруг этого тулза частенько летают мысли, но до конкретных действий всё дело не доходит. Может быть, автору этой темы что-то пригодится для своих потуг, а если будет критика и конструктив, то буду весьма признателен. Прежде всего, хочу отметить, почему именно такой подход (о нём ниже) взят на вооружение. В своё время пришло понимание того, что лучший DSL для разработки SQL-БД - это тот же SQL от самого же разработчика СУБД. Даже если делать свой велосипед, то, как правило, он будет вынужденно на него похожим и, чаще всего, функционально ограниченным. У меня приятные воспоминания о клиппере/фокспро (а с некоторыми древнейшими проектами и сейчас изредка приходится иметь дело), такого удобства для прикладного уровня производители платформ вокруг языков общего назначения, как жаба с нет-ом, так и не дали взамен (я имею в виду гармонию тех средств, об их технических особенностях и языковых проблемах речь не идёт). Имхо, если говорить о jvm, то, пожалуй, только у кложуры есть шансы, как у около промышленной платформы, включая и возможность интерактивной (а то и реактивной) разработки, и то, это для тех, кто может ужиться с лиспом. Но это всё лирика. Короче говоря, это решение для тех, кто нуждается непосредственно в SQL-кодировании. И при этом у предлагаемого решения нет привязки к какому-то диалекту или типу СУБД, теоретически, даже вместо SQL можно применять свой некий псевдо-SQL, к примеру, для разработки под разные СУБД (хотя это отдельная и ещё более плачевная песня). Итак, всё рассчитано на разработку SQL-исходников "вручную", с некоторыми помогалками (об этом ниже). Глобально исходники делятся на две части: для создания БД с нуля, назовём её как create-часть, и исходники для изменения БД (накаты версий) - update-часть. Забегая вперёд скажу, что я не буду говорить об операции отмены изменений, т.е. об откате версий. Прежде всего, по опыту - системы миграций используются в 99.99% случаев для наката последних изменений, т.е. для приведения базы в текущее актуальное состояние. Если требуется откаты изменений, то фактически это вырождается к созданию соответствующих новых правок в БД, и, как правило, всегда требует отдельной работы ручной кувалдой (ибо далеко не всегда просто это сделать). К тому же не всегда можно адекватно в общем случае отобразить парную операцию отката, скажем, для операции drop такой-то столбец в таблице - как для него написать парный откат, т.е. alter такой-то таблицы, где добавили столбец, но как восстановить данные? Т.е. требуются дополнительные телодвижения, специфичные для конкретного случая. Но на представленных здесь принципах вполне похоже реализуется и автоматическая операция отката, тем более закладывается возможность дополнительного программирования (см. ниже). Так что некий автоматический откат возможен, но я на нём не акцентирую отдельного внимания с целью здешнего упрощения. Итак, структура исходников важна. Предлагается sql-файлы располагать по подкаталогам в зависимости от логического деления функционала, т.е. выделять некие логические модули (типовое решение для многих случаев). При этом крайне желательно выделять каждый объект в БД или группу крепко связанных друг с другом объектов в каждом отдельном SQL-файле (но важно не смешивать объекты разных функциональных типов). Например, можно вместе указать парочку таблиц, которые друг без друга ни как. Можно вместе с таблицей поместить и её индексы, а в то же время может возникать потребность указать некоторые индексы отдельно, скажем, в другом прикладном модуле (т.е. индексы должны создаваться только при наличии в БД определенного модуля) и т.д. В "create-части" в SQL-файлах указываются операции DDL для создания объектов, причём всегда в текущем актуальном состоянии. "update"-часть содержит точно такую же структуру каталогов, как и "create-часть", и содержит sql-файлы для наката (возможно и отката) изменений в БД. При этом update-файл как бы является парным для соответствующего create-файла (т.е. некий аналог си-шного заголовка и его c/cpp-реализации). Внутри update-файла содержатся DDL-операции для модификации созданного объекта, в нужной последовательности с метками версий, при этом есть копия DDL для самого первого варианта облика этого объекта (т.е. стартовый DDL). Примерно так (для таблицы): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Синтаксис меток, что там должно быть указано - номер, дата, автор и т.д. - пока опускаем (всё должно настраиваться). При этом парный create-файл на данный момент должен содержать оператор "create table ..." согласно последней версии. Сейчас подобный подход используется на практике, но за исключением истории изменений. Сейчас каждая правка объектов оформляется отдельными файлами, формируется его спец-имя (содержащая инфу про версию), складываются изменения в спец-каталоги (в зависимости от дат, версий и пр., в общем, есть по-всякому). Мне кажется, что концептуально иметь только два файла - "create" и "update", т.е. как некий аналог си-шной разработки - проще, меньше плодятся файлы, к тому же в одном файле сразу можно изучить всю историю и т.д. Не исключено, что историю можно разделять на два и более файлов, главное, чтобы тулза понимала. Не все create-файлы могут иметь парный свой "update". Например, плодить текст процедуры/триггера как-то геморно, явно размазывая его по истории. В этом случае лучше поступать также как с обычными исходниками приложений, т.е. править только create-файл, он всегда содержит текущую версию. Если нужно получить какую-то версию, то извлекаем её из системы контроля версий исходников, в т.ч. можно извлечь в сторонке сразу весь набор sql-каталога требуемой версии. Когда тулза делает накаты изменений, то она должна понимать, что явной истории (update-файла) может не быть. В этом случае важно иметь правильный DDL-оператор (вида, "create or replace/alter ...", т.е. выполняемый многократно). Кроме создания явных объектов в БД файлы могут содержать некие вычисления, блоки кода, не сохраняемые в БД, или операции правки данных в таблицах и т.п. Они оформляются точно также (парные файлы), логически привязываясь к прикладным модулям. Тулза должна иметь как минимум две операции: создание базы с нуля и выполнить накат изменений. Для создания базы обрабатываются create-файлы, для накатов - update-файлы, с учётом того, что их может и не быть, и сам create-файл есть последняя версия. Естественно, внутри БД необходимы специфичные таблицы, где будут фиксироваться проведенные действия, в т.ч. и версии примененных sql-файлов (а точнее, версии действий внутри этих файлов). Кроме того, важно, чтобы была возможность выполнять частичные операции, т.е. отдельно в разрезе прикладных модулей. К примеру, обновить модули/подмодули только XX и YY, при этом тулза должна понять, что, например, модуля YY ещё нет в целевой базе, соответственно для него нужен "create". Или тулза должна понять при обновлении, что база содержит только модуля XX и YY, остальные в неё вносить нельзя. И т.д. Для тулса важно понять как строить последовательность действий. Для этого ей важно понимать тип sql-файла, т.е. что в нём может содержаться. Для этого можно применить несколько способов: - через стандарты именования файлов. К примеру, файлы для создания/модификации таблиц можно задать как-то так: xx_foo_tbl.sql, где "xx" - имя прикладного модуля/подмодуля, "foo" - имя таблицы, "tbl" - признак, что это таблица. Или таблицы не имеют суффикса, а все остальные имеют: sp - stored procedure, biu_03 - триггер before insert or update position 3 (добавляется к имени таблицы) и т.д. Или через расширения: xx_foo.tbl, или двойное - xx_foo.tbl.sql Короче говоря, всё настраивается; - с помощью дополнительного описания в виде каких-то файлов проекта, свой DSL-велосипед или стандарт а-ля XML/json; - с помощью явного управления файлами, к примеру, некоего оператора "input/include <файл>" (что часто имеется во многих sql-тулсах). Вариант без дополнительной механической писанины проще, меньше подвержен ошибкам в указании последовательности (хотя можно ошибиться при именовании файла, к примеру). Кроме того, чем меньше писанины в каких-то общих файлах между разработчиками, тем меньше элементарных конфликтов в рамках системы контроля версий исходников. Если тулса сама строит последовательность действий, то она должна понимать, что, например, сначала нужно выполнить глобальные объявления (типы/домены, переменные и пр.), затем, скажем, создать таблицы, потом - заголовки процедур/функций/пакетов или что-то в этом роде, затем - их тела и т.д., триггеры, где-то под конец строить индексы, выполнять пользовательские вычисления (тот же insert данных в таблицы) и т.д. Короче говоря, это настраивается, как минимум, эти правила СУБД-зависимые. Чтобы правильно выполнять все выкрутасы выше важно понимать зависимость между прикладными модулями. Задать можно по-разному. Частично что-то можно понять автоматически через инфу в метаданных у БД, т.е. зависимость между таблицами, какие таблицы использует такая то хранимка и т.д. Но это не та зависимость, эти механизмы лишь могут помочь для указания зависимости между своими логическими sql-модулями. К тому же, часто нет технической связи между объектами внутри БД согласно метаданным, но эти объекты используются приложением/сервером приложений, поэтому логические связи нужно указывать явно (или через помощников, об этом далее). И, если, скажем, указали, что модуль XX требует для своей жизни модуля YY, то тулса должна не забыть, что если ей при операции не указали явно модуль YY, то она должна его учитывать, причём в первую очередь, ну и все связи по цепочке. Сами связи можно указывать, к примеру, в файлах проекта, если они используются. Или, если стремиться к минимуму, то можно прописывать внутри исходников. Пусть файл вида "xxx.sql" (без лишних суффиксов/префиксов и пр.) означает логическое объявление самого модуля XXX, где, как правило, будет соответствующая описательная документация, некие глобальные объявления, настроечные вычисления и т.п. И где-то, пусть в начале, будет указан спец-оператор вида: #uses YY, ZZ (или import (хотя это как бы не то), using, require или что-то по вкусу). Зависимости указываются в разрезе логических единиц, т.е. модулей/подмодулей, которыми и оперируют в рамках создания/обновления баз. Далее о том, чего так категорически не хватает во всех типовых sql-тулсах. SQL- язык предметно-ориентированный, относительно мощный, но специализировано, у него нет широких универсальных вычислительных возможностей (это не его стихия), что сильно ограничивает в разработке "в лоб". Поэтому есть вполне оправданные в данном случае средства, которые здорово выручают (что проверено на практике): - препроцессор. Вполне сгодится по си-шным мотивам: #if, #ifdef, #elif, #else, #endif, #define, некий #undef и пр. Т.е. даётся возможность для условной компиляции, использованию макросов (в т.ч. с параметрами), можно реализовать некие настроечные параметры, задаваемые в исходниках и чьи значения можно устанавливать/переопределять через ключи в командах тулсы. Как это может выглядеть - см. ниже; - средства для автогенерации кода. На своей практике неплохо прижился подход, как в Cog - кодогенератор под питон. Вот картинка оттуда: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Что превращается в: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Думаю, идея понятна. Питон не обязателен, можно задействовать что угодно. Есть смысл подогнать синтаксис под препроцессор и увязать с прочими внутренними командами, т.е. как-то так: Код: sql 1. 2. 3. 4. 5. В общем, синтаксис нужно адаптировать, чтобы не было конфликтов с глобальным SQL. Возможно, что всё внутреннее для тулсы нужно именовать со своего внутреннего префикса, как это делают ряд универсальных инструментов, вида SQL Workbench/J . Пока сказанное только концепт, сейчас это не важно. Таким образом, кодогенерация реально упрощает жизнь, в т.ч. есть потенциал как для генерации текста sql-кода, так и исходников приложения на основе sql-файлов, структуры БД и т.п. Также в тулсе очень не помешает поддержка документации на основе комментариев. Я уже давал пример: pldoc . Вместо синтаксиса JavaDoc можно воспользоваться из LuaDoc, т.к. есть близость комментариев: "--" вместо "//". А если ещё будет поддержка средств для форматирования текста - вообще замечательно. Теперь о том, в каком соусе всё это (возможно) нужно. Если говорить о реализации под java, то ядро системы должно быть относительно независимо, т.е. иметь потенциал для создания как самостоятельного приложения (под консоль), так и куда-то встраиваться. Желательно иметь возможность для создания плагинов для всяких IDE, не помешает связь с уже имеющимися там плагинами для работы с SQL-серверами. Плюс желательна реализация самостоятельного сервера, по типу сервера в эмакс или JEdit, чтобы он висел себе и реагировал на команды, постоянно не перезапускаясь, не разрывал соединение с базой и т.д. Иными словами закладывается возможность работы как в командной строке, так и интерактивно из редакторов/IDE. Например, в своём любимом редакторе выделил текст, клацнул - и текст преобразовался - т.е. получил кодогенерацию. Или из редактора выполняешь запросы к базе с учётом обработки препроцессора, или получаешь обработанный текст запроса, и т.д. и т.п. При этом важно иметь расширяющийся функционал, в виде каких-то бинарных плагинов, а также в виде поддержки скриптования, как на BeanShell-е (чтобы "скриптовать" на самой java как языке), так и остального груви, руби, питона и пр. Это даст потенциал для создания универсальных плагинов под разные СУБД, библиотек/фреймворков и т.д. (хотя если вдруг проект потенциально пойдёт в жизнь, то потребность в развитии будет аховая, особенно если развивать интерактивную часть, типовые БД-консольные команды будут обязательными, форматированный вывод в виде текста, XML, HTML и т.д., хочется и автокомплита). Очень помогает (или фактически обязателен) для плагинов набор API для парсинга текста (он всё-равно есть в потрохах), чтобы анализировать имеющийся sql-текст и т.д. Вот такой концептуальный взгляд. В своё время много думалось над потенциальном упрощением, о некой реализации по мотивам крутых sql-инструментов. Например, реализовать полный разбор SQL. Тогда, скажем, есть возможность упростить написание "update"-части, сократив её до минимума. Например, тулса может сделать разбор оператора "create table ..." в sql-исходнике, с учётом препроцессора и кодогенерации, сравнить с тем, что есть в базе и выполнить или сформировать нужные "alter table ...". Вроде гораздо меньше писанины при разработке в итоге, но есть и минусы: - реализация полноценного и всеобхватывающего разбора SQL - задача неслабая, особенно под разные СУБД; - не всегда существует один единственный способ для операций, скажем, те же таблицы можно создавать по-разному, в т.ч. и через процедуры на сервере, которые сами генерируют текст SQL-кода и его исполняют (если СУБД такое позволяет). Иными словами тогда необходимо вводить ограничения для sql-вольности (хотя те же препроцессор с кодогенерацией частично облегчают жизнь); - операции по обновлению баз становятся непростыми (по технической реализации), довольно медленными, в некоторых случаях легко получить неприемлемое время для update базы, а то и вовсе всё может загнуться. А представленный текущий вариант имеет недостаток: весьма проблематично выявить, что после внесения изменений в базу их никто не правил, каждый следующий накат опирается на то, что состояние базы такое же, как и после внесения последних изменений. Проблема решается дополнительными телодвижениями, к примеру, можно создать базу из исходников, с учётом всех нужных настроек и сравнить с тем (через стандартный/типовой придворный инструментарий), что есть в рабочей базе (в её копии) после актуального наката. К чему этот весь эпос. Кроме того, чтобы дать пищу подумать автору этой темы и другим, было бы не плохо, если кто-то поделится своей практикой, подскажет, как всё выше сказанное можно заменить без гемора и т.д. Ниже я даю ссылку на архив, где есть пример SQL-препроцессора. Делала его когда-то некая конторка "Олис" в лохматых 90-х, он простой, но не потерял своей актуальности, это пример, как можно выкручиваться. В архиве также документик-проект по некоему стандарту проектирования БД от тех же авторов. Якобы всё заточено под InterBase, но там фактически только одна особенность: обрабатывается команда input <путь\файл>, в остальном - к SQL тулса нетральна. Есть особенность в синтаксисе самих директив и макросов препроцессора, ибо делалось по подобию Delphi. Сейчас сайта авторов давно нет, раньше всё было свободно доступным, поэтому надеюсь, что авторы заочно не против публикации их труда. P.S. Сорри, что много букв (меня самого задолбало набирать). Сорри, что возможно это и офтоп, хотя эта тема форума пошла в такое русло. Просто подобные темы задевают за живое, ибо адекватного решения проблем пока нет. Скачать: SQLPrecompile ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 18:34:06 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Есть такая тулза https://code.google.com/p/sqlmake/ под оракл, может быть вам будет интересно (я не пользовался). Вообще, конечно, у вас жесткая задача: разные СУБД, разные сборки одного продукта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 19:00:46 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪЕсть такая тулза https://code.google.com/p/sqlmake/ под оракл, может быть вам будет интересно (я не пользовался). Ага, спасибо. Посмотрю. На первый взгляд хорошо то, что нет лишней XML-лабуды. Йуный джавистЪВообще, конечно, у вас жесткая задача: разные СУБД, разные сборки одного продукта. Это да. Но основная проблема имеется с FireBird, ибо много инсталяций и каждая со своей особенностью. Если бы была потребность (а она и есть) в реализации этих продуктов одновременно под разные СУБД - то это полная вешалка, неподъёмная (поэтому и нет реализаций). Остальные проекты под другие СУБД имеют, фактически, индивидуальный характер для конкретного заказчика, поэтому меньше гемора. В качестве лирического офтопа. Если отбросить то, что процесс выбора СУБД в большинстве случаев - политический процесс, а уж потом технический, то я мечтаю о ликвидации зоопарка СУБД самым кардинальным способом - принять единую платформу без возможности качать права. Вроде как развиваемые технологии типа NoSQL дают некую пока туманную перспективу, и что-то есть привлекательное (концептуально), как та же упомянутая OrientDB (которая даже с транзакциями), но опять же, популярный их принцип schema-less, т.е. нет жёсткого каталога схем данных, тоже настораживает. С одной стороны - дают необходимую гибкость, это да, но с другой - тоже повод поломать голову над тем, как этот каталог реализовать самому. Я недавно наткнулся на такой проектик: Animotron , где интересно решают проблемы (точнее пытаются) разработки под той же джавой, в частности, есть и привлекательные способы для организации обработки данных, в данном случае графовых (проект работает поверх Neo4J, но концептуально такой подход применим и под другие соответствующие СУБД). Рекомендую глянуть, кому интересна эта проблематика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 20:08:42 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
PSV100, Большое спасибо за полезный пост. авторИтак, всё рассчитано на разработку SQL-исходников "вручную", с некоторыми помогалками (об этом ниже). Глобально исходники делятся на две части: для создания БД с нуля, назовём её как create-часть, и исходники для изменения БД (накаты версий) - update-часть. Согласен. Но вот update-часть я думал возложить на спец. средства (liquibase, etc), продумать интеграцию с ними. Но дальше будет видно. авторИтак, структура исходников важна. Предлагается sql-файлы располагать по подкаталогам в зависимости от логического деления функционала, т.е. выделять некие логические модули (типовое решение для многих случаев). При этом крайне желательно выделять каждый объект в БД или группу крепко связанных друг с другом объектов в каждом отдельном SQL-файле (но важно не смешивать объекты разных функциональных типов). Например, можно вместе указать парочку таблиц, которые друг без друга ни как. Можно вместе с таблицей поместить и её индексы, а в то же время может возникать потребность указать некоторые индексы отдельно, скажем, в другом прикладном модуле (т.е. индексы должны создаваться только при наличии в БД определенного модуля) и т.д. В "create-части" в SQL-файлах указываются операции DDL для создания объектов, причём всегда в текущем актуальном состоянии. Снова согласен. Еще думал оставить свободу размещения объектов (как и многие другие вещи) полностью за пользователем. Т.е. чисто теоретически можно хранить все исходники в одном единственном файле, и собирать любой билд именно из него. авторТулза должна иметь как минимум две операции: создание базы с нуля и выполнить накат изменений. Для создания базы обрабатываются create-файлы, для накатов - update-файлы, с учётом того, что их может и не быть, и сам create-файл есть последняя версия. Я думал об "опциях сборки", т.е. пользователь может определить свои собственные сборки, например: 1. Собрать продакшн-базу (достать скрипты таблиц, констрейнтов, индексов, процедур, заполнение боевыми данными и т.д., в нужном порядке) 2. Собрать тестовую базу (так же как и в 1, только с заполнением тестовыми данными) 3. Собрать какую либо специфическую базу (тоже самое, но например с другим набором пользователей, и соответственно грантов, справочных данных и др.); 3. Обновить тестовые данные на тестовом сервере - очищаются все рабочие таблицы (точнее достается соответствующий подготовленный скрипт(ы)) и достаются все dml, которые заполняют таблицы тестовыми данными. Своеобразный рефреш тестовых данных; 4. Достать все индексы для модуля ХХ; 5. Достать все скрипты для заполнения таблиц-справочников; 6. И т.д. в зависимости от потребностей пользователя. Предполагается, что скрипты буду именно "доставаться" и собираться вместе, ни о какой "накатке" речи не идет. Это может осуществлять либо пользователем самостоятельно или с помощью каких либо надстроек. Вот небольшой пример описания проекта. Описывается каждый тип объектов БД. Каждый тип объектов может иметь (а может и не иметь) дочерние элементы. Например тип "таблица", дочерние элементы: первичный ключ, ФК, констрейнты, индексы, триггеры, гранты, данные, тестовые данные и т.д. Тип "хранимая процедура", дочерние элементы: гранты, юнит тесты и т.д. Теоретически вложенность может быть любой, не только 2-х уровневой (если надо конечно). Пример описания типа "таблица": Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Имеем таблицу, хранящуюся в папке с имненм это таблицы и суффиксом tbl. У таблицы есть индексы, хранящиеся в одном файле в подпапке indexes. Так же есть ДМЛ для наполнения справочников нужными данными, тестовыми и боевыми соответственно, хранятся в корневой папке таблицы в файле с именем "имя таблицы"_data.sql, разделенные специальным указанным комментарием. Постараюсь поскорее выложить первые версии кода, можно будет повертеть и пощупать на деле. Идея про препроцессор тоже понравилась. Надо подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 23:10:15 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НЯ думал об "опциях сборки", т.е. пользователь может определить свои собственные сборки, например: 1. Собрать продакшн-базу (достать скрипты таблиц, констрейнтов, индексов, процедур, заполнение боевыми данными и т.д., в нужном порядке) 2. Собрать тестовую базу (так же как и в 1, только с заполнением тестовыми данными) 3. Собрать какую либо специфическую базу (тоже самое, но например с другим набором пользователей, и соответственно грантов, справочных данных и др.); 3. Обновить тестовые данные на тестовом сервере - очищаются все рабочие таблицы (точнее достается соответствующий подготовленный скрипт(ы)) и достаются все dml, которые заполняют таблицы тестовыми данными. Своеобразный рефреш тестовых данных; 4. Достать все индексы для модуля ХХ; 5. Достать все скрипты для заполнения таблиц-справочников; 6. И т.д. в зависимости от потребностей пользователя. Опции сборки в вашем понимании решаются с помощью фильтров в dbmaintainer, проблема не линейного версионирования там тоже решена очень гибко. ПМСМ, для описания таблиц РСУБД лучше SQL (DDL) вы все равно ничего не найдете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 23:29:44 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НЯ думал об "опциях сборки", т.е. пользователь может определить свои собственные сборки, например: 1. Собрать продакшн-базу (достать скрипты таблиц, констрейнтов, индексов, процедур, заполнение боевыми данными и т.д., в нужном порядке)Рабочая база не собирается. Она создаётся один раз и наполняется реальными данными пользователя.2. Собрать тестовую базу (так же как и в 1, только с заполнением тестовыми данными)Тестовая база не собирается. Она получается восстановлением одного из бэкапов рабочей базы на тестовом стенде.3. Собрать какую либо специфическую базу (тоже самое, но например с другим набором пользователей, и соответственно грантов, справочных данных и др.);Раздача прав - элемент настройки системы . И делается не расписыванием кучи "create user ..." или/и "grant ... to ...", а в человеческом UI, предусмотренном разработчиком для администраторов системы. Особенно, с учётом того, что АБД и администратор системы - могут быть, а часто будут, два совершенно разных человека.3. Обновить тестовые данные на тестовом сервере - очищаются все рабочие таблицы"Да за это убивать надо!" (ц) старый анекдот. Обновление структуры БД выполняется с реальными данными. Именно проверка корректности обновления структуры на реальных данных реальных клиентов и представляет основную заботу и головную боль разработчика СУБД. "Магия данных", знаете ли, страшная сила. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 02:45:55 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
LeonidvОпции сборки в вашем понимании решаются с помощью фильтров в dbmaintainer, проблема не линейного версионирования там тоже решена очень гибко. А ткните пожалуйста в доку маинтейнера по поводу фильтров, а то не нашел. LeonidvПМСМ, для описания таблиц РСУБД лучше SQL (DDL) вы все равно ничего не найдете. Я это уже понял, я и не предлагаю ничего кроме чистого SQL, но с возможностью описать структуру файлов, т.е. что где лежит, причем с любой степенью детализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 07:03:23 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НА ткните пожалуйста в доку маинтейнера по поводу фильтров, а то не нашел. Я перепутал термин. У них это называется qualifier http://www.dbmaintain.org/tutorial.html#Qualifier_inclusion__exclusion ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 09:15:12 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
авторНапример, в моём случае есть огромные проблемы, когда целевая рабочая база для обновления не является условной копией (по метаданным) исходной эталонной (используемой при разработке). Т.е., как правило, чаще всего целевая база лишь некое подмножество исходного эталона, содержит только часть прикладных логических модулей (при этом взаимосвязанных). Кроме того, разработчики на местах могут расширять функционал, или вносить свои изменения. Причём существует вариантность одного и того же функционала в разных целевых базах, скажем, структура одной и той же таблицы отличается в зависимости от потребностей в каждом конкретном случае на местах, или код какого-нибудь триггера везде разный и т.д. и т.п. Утяжеляет ситуацию то, что целевых баз немалое количество, и процесс разработки/обновления, фактически, беспрерывный. Управлять изменениями на такого рода проектах можно только путем интеграции системы хранения версий кода с системой управления бизнес-требованиями. Нужно эффективно понимать - какие требования реализует тот или иной код, какой код реализует требования. Но это тоже не самоцель - с точки зрения управления проектом полезно довешивать аналитики - кто и сколько времени разрабатывал, сколько было багов и какой критичности. ТЕ условно говоря - чего стоила разработка ф-ций. Если система автора позволяет накапливать и агрегировать такого рода информацию, и эффективно ориентироваться в ней - это хорошая, полезная, востребованная разработка. ТЕ сложность в том, что чисто-програмистские тулзы - хорошо, но мало. На мой взгляд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 09:50:57 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovУправлять изменениями на такого рода проектах можно только путем интеграции системы хранения версий кода с системой управления бизнес-требованиями. Вы про системы типа CaliberRM? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 12:38:18 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovУправлять изменениями на такого рода проектах можно только путем интеграции системы хранения версий кода с системой управления бизнес-требованиями. Нужно эффективно понимать - какие требования реализует тот или иной код, какой код реализует требования. Но это тоже не самоцель - с точки зрения управления проектом полезно довешивать аналитики - кто и сколько времени разрабатывал, сколько было багов и какой критичности. ТЕ условно говоря - чего стоила разработка ф-ций. Если система автора позволяет накапливать и агрегировать такого рода информацию, и эффективно ориентироваться в ней - это хорошая, полезная, востребованная разработка. ТЕ сложность в том, что чисто-програмистские тулзы - хорошо, но мало. На мой взгляд. Какой-то явной аналитики не предполагается. Основная цель - это дать возможность вести SQL-разработку на основе уже годами проверенных методик и с использованием сопутствующего инструментария, т.е. точно также, как и крупные java/c++ и т.д. проекты. Поэтому, системы контроля версий исходников, багтрекеры, пожелания пользователей, управление задачами, wiki и документация по проектам и т.д. - всё к услугам, точно также, как и для остальной не SQL-разработки. Если есть какая-то система аналитики поверх соответствующей инфраструктуры, то велком ту анализ, какой душе угодно. Хотя лично в моей практике какой-то политический анализ пригоден только для одного случая. В моём коллективе, к счастью, никаких корпоративных маразмов нет, а вот у заказчиков иногда случаются. Некоторые начальники считают, что процесс разработки и сопровождения/поддержки систем со стороны разработчика означает только то, что представители исполнителя должны с утра до вечера и каждый день присутствовать у них на предприятии. Поэтому они начинают вести подробнейшую "аналитику удовлетворения своих бизнес-требований", с посекудным учётом и пр. В ответ получают подробнейшую "бизнес-аналитику" с нашей стороны, где фиксируется каждый телефонный звонок, каждый чих и т.д. И вместо человеческих отношений, оперативного реагирования по телефону, экстренной помощи (когда нужно всё бросить и спасать заказчика, у которого стало производство, или где продукцию не могут отгружать и т.д.) имеется долгая и нудная официальная переписка-отписка, никаких устных отношений и т.д. и т.п. Короче, это лирика, имхо, многим знакома. Для всего остального выдумать какаю-то, именно реально полезную, аналитику - я не знаю как. Далеко не всё в экосистеме определяется через затраты на само кодирование. Один программист может, скажем, месяц работать над какой-то задачей, но потом он же на другой задаче может заменить троих, не менее квалифицированных, и всё сделать за пару дней, т.к. в отличие от них он уже хорошо знаком с целевой предметной областью. К тому же лично я не понимаю, какие нужны показатели. Считать количество символов, вводимых оператором в терминале, что было в основе методик в прошлом веке на заре IT - думаю, что уже не актуально. Я понимаю технический анализ кода - выявление проблемных мест по производительности, анализ зависимостей, выявление неиспользуемого кода, ошибок и т.д. Возможно в рамках предложенного концептуального проекта что-то и можно накопать, скажем, посчитать количество версий/накатов изменений объекта (и то, это как бы только результат разработки, он не отображает все попытки и прочего, что творилось на этапе проектирования), выявить места, где есть многовато макросов или условных компиляций (и то, не факт, что это именно проблемные места), ну и что-то в таком духе. Возможно и есть пища для какого-то политического анализа. Я как-то хреново знаком с методиками количественного и качественного анализа, ибо на практике пока не нагибало. Если кто-то укажет, в какую сторону смотреть, то может и есть смысл подумать над какой-то потенциальной поддержкой чего-то. Собственно, речь идёт о том, чем можно дополнить типовые управленческие данные о проектах (баги, списки задач, требования и т.д.) на основе анализа SQL-кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 13:52:50 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим Н... Я думал об "опциях сборки", т.е. пользователь может определить свои собственные сборки, например: 1. Собрать продакшн-базу (достать скрипты таблиц, констрейнтов, индексов, процедур, заполнение боевыми данными и т.д., в нужном порядке) ... Вот небольшой пример описания проекта. Описывается каждый тип объектов БД. ... Здесь выше правильно подметили насчёт dbmaintainer, он вроде как нечто подобное и реализует. Требует sql-файлы предопределенной структуры и через спец-имена файлов может их включать/исключать из сборки. Теоретически для него можно генерировать файлы на входе (но с учётом того, что он отслеживает их изменение). Я по нему не спец, нас он не устроил. Максим НИдея про препроцессор тоже понравилась. Надо подумать. Рекомендую подумать. Даже тот препроцессор, который я выложил, в своём таком виде позволяет удобно решать не мало проблем. У него есть неудобства: он только под винду и не совсем консольный. Он у нас активно юзается, рядом с ним живёт самопальная система для кодогенерации (по описанным в том посте мотивам, вместо питона свой специфичный DSL, используемый для многих задач). Т.е. у нас такой зоопарк - отдельные тулзы для первичной обработки каталога исходников SQL, которые готовят выборку файлов, делают кодогенерацию, формируют обвязку для входа на препроцессор, запускается препроцессор, дальше на основе выхлопа работают тулзы для выполнения sql-скриптов и пр. Всё костыльно повязано. Поэтому есть потребность в своей реализации с нуля, гармоничной, с учётом наработанных граблей. У препроцессора, как такового, есть некие специфичные проблемы насчёт макросов, как и у си-шного - т.е. это банальная текстовая подстановка, без контроля синтаксиса, типов данных и т.п. Но по опыту, в SQL-кодировании нет потребности в их огромном количестве, т.е. нет почвы для злоупотребления. Препроцессор гармонично дополняется кодогенерацией, т.к. в одних случаях проще/удобнее написать условную компиляцию, где-то простой макрос, где-то как-то нагенерить и т.д. Поэтому нужно всё, с одним согласующимся синтаксисом, с расширенным охватом вычислений (к примеру, в условных директивах компиляции нужны полноценные вычисления, не только анализ define-имён). При этом необязательно то, что код по генерации будет громоздким внутри sql-файла. Т.е. в большинстве случаев он оформляется как-то так: Код: sql 1. 2. 3. 4. 5. 6. Т.е. указывается вызов функции/процедуры, сама функция где-то реализована в своем скрипт-файле. Желательно фиксировать моменты, когда чего-то генерили, с контрольными сумами, чтобы в случае чего понимать, что после генерации код правился ручками (кстати, также нужно контролировать и версии update-накатов, чтобы не было случайных правок текста после отправки поезда). Очень приятно, когда есть возможность интерактивно в редакторе на месте по одному клику быстро генерить код. Фактически, эта фишка становится, прежде всего, удобной помогалкой для ручной SQL-долбайки, а уж потом для какой-то генерации кода на основе вариантов сборки. У нас много чего приятно генерируется, причём как SQL-кода (на основе данных из БД, на базе кода прикладного приложения, где первично может описываться модель данных, и пр.), так и кода приложений (на основе БД, SQL-кода и др. - есть наработки для лёгкого разбора текста, достойные для простого скриптования). Неоднозначен выбор языка для скриптовой кодогенерации. Если сделать неограниченную вольность и полный зоопарк, то тоже это не ахти. По опыту использованию других продуктов, тех же текстовых редакторов, не кайф, когда есть куча плагинов, что-то на встроенном велосипеде, что-то на питонах с руби и т.д., и это ещё всё одновременно запускается (а то и перезапускается на каждый чих). Иногда влом или нет времени с чем-то разбираться, где нет опыта. Т.е. зоопарк ограничивает наборы универсального кода для широкого применения среди масс. Если ограничиться BeanShell или груви - то это якобы расчёт только для джавистов. Есть смысл оставить только один вариант - простой язычок, lua-подобный, близкий к некоему универсальному SQL (т.е. к процедурным расширениям), т.к. это именно SQL-разработка. Есть некие наработки, но тут может большую роль сыграть техническая реализация, ибо может проще/быстрее взять груви и не морочить никому голову. В случаях, когда нужны масштабные "фреймворки", типа универсальное дополнение под какой-то сервер СУБД, то проще и лучше делать бинарный плагин, на привычных средствах, с отладчиками и т.д. В общем, как-то так. Это просто к слову, если вдруг имеется чуть больший интерес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 15:50:41 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
автор"Магия данных", знаете ли, страшная сила. Конечно страшная. Есть еще слой нормативно-справочной информации, плотно увязанный с кодом, есть описания доп-реквизитов сущностей (в ОЕБС - "гибкие поля"). Они тоже увязаны. Все это поддерживается вместе со структурой БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 16:36:29 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovВсе это поддерживается вместе со структурой БД."Программа не умнее своего создателя". Если задекларировано одно, а в реальных данных оказалось другое - будет плохо. И хорошо ещё, если клиент обнаружит это на (своём) тестовом стенде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 20:25:00 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovМаксим НЯ думал об "опциях сборки", т.е. пользователь может определить свои собственные сборки, например: 1. Собрать продакшн-базу (достать скрипты таблиц, констрейнтов, индексов, процедур, заполнение боевыми данными и т.д., в нужном порядке)Рабочая база не собирается. Она создаётся один раз и наполняется реальными данными пользователя.2. Собрать тестовую базу (так же как и в 1, только с заполнением тестовыми данными)Тестовая база не собирается. Она получается восстановлением одного из бэкапов рабочей базы на тестовом стенде.3. Собрать какую либо специфическую базу (тоже самое, но например с другим набором пользователей, и соответственно грантов, справочных данных и др.);Раздача прав - элемент настройки системы . И делается не расписыванием кучи "create user ..." или/и "grant ... to ...", а в человеческом UI, предусмотренном разработчиком для администраторов системы. Особенно, с учётом того, что АБД и администратор системы - могут быть, а часто будут, два совершенно разных человека.3. Обновить тестовые данные на тестовом сервере - очищаются все рабочие таблицы"Да за это убивать надо!" (ц) старый анекдот. Обновление структуры БД выполняется с реальными данными. Именно проверка корректности обновления структуры на реальных данных реальных клиентов и представляет основную заботу и головную боль разработчика СУБД. "Магия данных", знаете ли, страшная сила. Все эти пункты это просто примеры, чтобы объяснить смысл утилиты. Кому то нужны будут кому то нет, все можно настроить. авторРабочая база не собирается. Она создаётся один раз и наполняется реальными данными пользователя. Разве процесс создания и ее сборки из исходников, хранящихся в СКВ, это не одно и то же? А как же ночные билды? авторТестовая база не собирается. Она получается восстановлением одного из бэкапов рабочей базы на тестовом стенде. За частую разработчики не имеют никакого доступа к продакшн-базам (коммерческая тайна, соображения безопасности, 152-й фз и т.д.), не говоря уже о рабочих бэкапах и т.д. авторРаздача прав - элемент настройки системы. И делается не расписыванием кучи "create user ..." или/и "grant ... to ...", а в человеческом UI, предусмотренном разработчиком для администраторов системы. Особенно, с учётом того, что АБД и администратор системы - могут быть, а часто будут, два совершенно разных человека. На счет интерфейса согласен, но это если говорить о дополнительной настройке и сопровождении рабочей базы у заказчика (возможно самим разработчиком). Причем приложения часто не используют родную базовскую систему авторизации, а юзают что то свое. Я же говорю о системных грантах, системных пользователях, для разработчиков, тестировщиков администраторов и т.д. Кто то может править процедуры, кто то таблицы, кто то только для отдельных модулей и т.д. автор"Да за это убивать надо!" (ц) старый анекдот. Обновление структуры БД выполняется с реальными данными. Именно проверка корректности обновления структуры на реальных данных реальных клиентов и представляет основную заботу и головную боль разработчика СУБД. "Магия данных", знаете ли, страшная сила. Про реальные данные я уже написал. И почему не может быть скриптов, которые обновляют тестовые данные (да и вообще всю структуру), покореженные разработчиками и тестировщиками за рабочий день? Причем данные могут совершенно разные, из разных баз и т.д. Почему я не могу собрать свежую версию базы (у которой еще нет рабочего дампа, нет релизы), развернуть на отдельной машине например для тестов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 21:02:39 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovУправлять изменениями на такого рода проектах можно только путем интеграции системы хранения версий кода с системой управления бизнес-требованиями. Нужно эффективно понимать - какие требования реализует тот или иной код, какой код реализует требования. Но это тоже не самоцель - с точки зрения управления проектом полезно довешивать аналитики - кто и сколько времени разрабатывал, сколько было багов и какой критичности. ТЕ условно говоря - чего стоила разработка ф-ций. Если система автора позволяет накапливать и агрегировать такого рода информацию, и эффективно ориентироваться в ней - это хорошая, полезная, востребованная разработка. ТЕ сложность в том, что чисто-програмистские тулзы - хорошо, но мало. На мой взгляд. Если честно я об этом не думал и не совсем себе представляю как это могло бы выглядеть технически, но если вдруг дело пойдет и возникнет реальная потребность, то можно подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 21:05:56 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Petro123Максим Н, - скриптов должна быть пара - накат и откат С этим согласен. Petro123- скрипты группируют не по таблицам, а по атомарности - версии. Т.е. имя папки - версия. А вот это не очент понял. Если вы говорите о готвом патче (альтере объектов) для конкретной боевой базы, то да. Но есть еще текущее состояние базы, тот код из которого можно собрать актуальную версию (ну или любую другую, используя возможности СКВ). И здесь удобно хранить объекты в какой-либо структуре, иметь возможность удобного доступа к ним, контроля, модификации с учетом бизнесс логики приложения, внутренних правил разработчиков, поддержания нескольких веток (например базовой и нескольких побочных) и т.д. Вот есть бумага интересная по этому поводу, пункт "Source files". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 21:17:34 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
LeonidvОпции сборки в вашем понимании решаются с помощью фильтров в dbmaintainer Спасибо, ознакомился. Похоже, но навреное не то. Да можно помечать имена файлов метками и потом управлять сборкой на их основе. Ну и на сколько я понял это все. Нет возможности задания структуры проекта, модулей, структуры хранения каждого типа файлов. Нет возможности контроля за этим делом. Если будет несколько фильтров, то имя файла уже будет тяжело читаемым для человека. Метка распространяется на весь файл целиком, нельзя выделить его часть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 21:42:33 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим ННет возможности задания структуры проекта, модулей, структуры хранения каждого типа файлов. Это решается средствами типа maven, при большом желании. Непонятно, какие именно файлы кроме sql вы будете хранить если уже решили, что все это sql. Максим ННет возможности контроля за этим делом. Если будет несколько фильтров, то имя файла уже будет тяжело читаемым для человека. В принципе, да. Но зачем вам несколько меток? Там можно на основе каталогов много чего полезного сделать, в том числе и версионирование. Максим НМетка распространяется на весь файл целиком, нельзя выделить его часть. Ну так несколько файлов. В общем, мне лично не понятно, что вы хотите делать и какие цели преследуюте, но понятно, что имеющиеся инструменты вы в полной мере не изучили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 23:08:15 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Leonidv, авторЭто решается средствами типа maven, при большом желании. В точку. Я как раз начинал с Ant'а (потом даже пробовал заюзать Thor)(Maven наверное тоже подошел бы, но он имхо немного для других целей...). И меня даже устраивало. Например был у меня таргет, который создавал структуру каталогов для типа объекта "таблица". В нем были определены элементы(файлы): - сам ДДЛ таблицы; - отдельно ПК, ФК, констрейнты; - сиквенсы (они же генераторы); - индексы; - тестовые данные; - боевые данные (если это справочник например); - что то еще. Т.о. я мог запустить этот таргет, указав имя таблицы, и он создавал мне готовый каркас для хранения таблички. Потом я мог (не задумываясь, что в каком файле лежит) получить исходный код создания всей таблицы (таблиц), получить только тестовые данные, получить только ДДЛ (без ФК и ПК, чтобы например легко накатить таблицы на новую базу, не соблюдая их последовательность из-за ФК) ну и т.д., на что фантазии хватит. Для другого объекта БД (процедура, пакет, пользователь и др.) нужно создать другой таргет и описать его структуру, а так же действия с ним. Т.е. ручная работа, кодирование, поэтому появилась идея о маленьком, незаметном, декларативном инструменте, который работал бы на основании неких правил. авторНепонятно, какие именно файлы кроме sql вы будете хранить если уже решили, что все это sql. Де нет, только SQL. авторВ принципе, да. Но зачем вам несколько меток? Там можно на основе каталогов много чего полезного сделать, Есть желание не просто пометить имена файлов, чтобы потом фильтровать их, а именно описать структуру всего проекта (на сколько это необходимо конечно). Чтобы при размещении нового объекта в СКВ, можно было сразу сгенерить структуру файлов и каталогов (заранее описанных и утвержденных) для его хранения. Возможность описать зависимости между объектами, т.е. если я удаляю пользователя из СКВ, то должны погрохаться (или пометиться к удалению) все его гранты на его объекты (понятно, что при накатке в базе все гранты и так автоматически погрохаются, но СКВ об этом не узнает). Т.е. тулза, которая поможет привить культуру работы с исходниками БД в данном проекте (например для нового сотрудника). Знаю, в некоторых проектах используют следующий механизм: некая утилита переодически выгружает весь изменившийся код из разработческой базы в СКВ. Но это уже другой подход, я его не рассматриваю. авторв том числе и версионирование. Версионирование и миграцию я как бы особо и не рассматривал (пока по крайней мере), т.к. знаю, что есть готовые инструменты типа liquebase, dbmaintainer и т.д. они заточены под это, я же говорю о другом. Смысл в том, чтобы орагнизовать работу с текущими объектами БД. Т.е. как в какой-нибудь GUI IDE, в правой части экрана маячит дерево, в котором можно добраться до любого элемента, посмотреть его код, сделать правку, посмотреть его зависимые элементы на специальных вкладках (гранты, ФК, ПК, содержимое, триггера и т.д.). Все очень удобно и комфортно, по началу, но есть минусы (я в принципе об этом писал, но попробую еще раз): - это совершенно не настраивается, как разработчики зашили так и есть; - ИДЕ совершенно ничего не знает о логике вашего приложения; - (имхо самый главный) ИДЕ выковыривает исходный код объектов из системных представлений (это похоже на декомпиляцию приложения, я тут когда то изливался на эту тему, если интересно можно глянуть ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2013, 09:39:07 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38245806&tid=2129029]: |
0ms |
get settings: |
13ms |
get forum list: |
28ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
52ms |
get topic data: |
24ms |
get forum data: |
6ms |
get page messages: |
139ms |
get tp. blocked users: |
3ms |
| others: | 332ms |
| total: | 611ms |

| 0 / 0 |
