Название: БД с самоописанием Отправлено: QuAzI от Декабрь 18, 2012, 11:44 Т.к. 90% справочников в духе "Справочник банков", "Справочник сотрудников", "Справочник справочников" и прочая лапша сводятся к тупой таблице с редактированием полей, хочется сделать абстрактный шаблон, который можно было бы вызвать передав имя таблицы, а дальше чтобы он сам подтянул имена, ширину и тип колонок в таблице. Т.к. мысль собственно сама напрашивается при долгом возюкании с базами, стало интересно, может кто уже делал? Как храните в БД или получаете информацию о полях, о их внешних ключах (для автозабивания в comboBox), ведёте ли версионность всей базы. А то что-то потыкался и ничего интересного на эту тему не нашёл, только про организацию версионных миграций на хабре чутка есть.
Ну и может кто потычет в литературку на мотив Coding Convention но только для SQL? А то постоянно чуйство, что что-то не так делаю ;D Название: Re: БД с самоописанием Отправлено: alex312 от Декабрь 18, 2012, 12:00 Все твои хотелки называются ORM (http://ru.wikipedia.org/wiki/ORM).
Вот какой-то обзорчик - http://habrahabr.ru/post/105191/ Название: Re: БД с самоописанием Отправлено: QuAzI от Декабрь 18, 2012, 12:20 ORM - это обвязка каждой таблицы как отдельного объекта, тот же hibernate используют для описания каждой таблицы отдельную xml-ку, меня же как раз не устраивает такое возюкание кучи файлов, потому что в таком случае к контролю за версией ПО и версией БД надо ещё добавлять отслеживание этой мелкой лапши, на всех хостах.
И даже если я решу обвязать таблицу в объект... ну всё равно же имена полей надо откуда-то тянуть. Т.е. меня сейчас не интересует таблица, как объект, меня интересует получение информации о таблице, о каждом её поле. Некоторые умудряются тянуть данные из schema, видел как-то давно даже пару примеров, где народ в COMMENT указывал имя поля, которое потом выводилось юзверю. Но это было весьма коряво и не на всех СУБД провернёшь. Я пока склоняюсь создать табличку tables, в которой буду хранить всё нужное, но это конечно велосипед, который стопудово уже кто-нить делал. Чтобы было более понятно, от чего хочу избавиться: сотен записей вида Код: model->setHeaderData(0, Qt::Horizontal, tr("IFI")); Иже в примере к вашей QsT, на каждую таблицу есть Код: << QstField("LastName", FieldVisible, "Фамилия", 100) Название: Re: БД с самоописанием Отправлено: panAlexey от Декабрь 18, 2012, 14:47 Т.к. 90% справочников в духе "Справочник банков", "Справочник сотрудников", "Справочник справочников" и прочая лапша сводятся к тупой таблице с редактированием полей, хочется сделать абстрактный шаблон, который можно было бы вызвать передав имя таблицы, а дальше чтобы он сам подтянул имена, ширину и тип колонок в таблице. Т.к. мысль собственно сама напрашивается при долгом возюкании с базами, стало интересно, может кто уже делал? Делал (http://code.google.com/p/uoreceptorru/): Код: void uoMainWindow::createTables() Название: Re: БД с самоописанием Отправлено: QuAzI от Декабрь 18, 2012, 16:44 Я как раз вот от этого хочу уйти.
Код: tmlpTabl->addField("ЛатИмя",fieldType_String,70)->m_descr = "Латинское наименование"; 2) Именование/оформление может плыть в зависимости от версии софта (хотя одна БД казалось бы должна одинаково везде смотреться) 3) Когда ПО не одно (например админка отдельно, генератор отчётов отдельно, ещё какая-нить веб-морда отдельно), это вообще заканает когда число таблиц перевалит за пол ста. Название: Re: БД с самоописанием Отправлено: panAlexey от Декабрь 18, 2012, 20:24 Я как раз вот от этого хочу уйти. Код: tmlpTabl->addField("ЛатИмя",fieldType_String,70)->m_descr = "Латинское наименование"; 2) Именование/оформление может плыть в зависимости от версии софта (хотя одна БД казалось бы должна одинаково везде смотреться) 3) Когда ПО не одно (например админка отдельно, генератор отчётов отдельно, ещё какая-нить веб-морда отдельно), это вообще заканает когда число таблиц перевалит за пол ста. Я уже понял. По: хочется сделать абстрактный шаблон, который можно было бы вызвать передав имя таблицы, а дальше чтобы он сам подтянул имена, ширину и тип колонок в таблице. Ты хочешь просто софтине указать таблицы в имеющейся БД что-бы она построила интерфейс. Нормальное желание. Теоретически можно доделать мою софтину, указав ей БД/юзера/пассворд и задав задачу "Считай ка мне в m_dbMan структуру и построй интерфейсы" А откуда приемлемые имена/колонки для таблиц найдешь? В комментариях к полям? Можно завести пару табличек вроде словаря с сопоставлением и т.п. Это не проблема. Хотя моя на скулайт настроена. Название: Re: БД с самоописанием Отправлено: xokc от Декабрь 19, 2012, 08:29 В Delphi есть похожий функционал - там DBGrid самостоятельно умеет вытаскивать наименование, тип колонок и ширину полей из БД. Но всё равно нужно настраивать кучу вещей - начиная от видимости только нужных полей, регулировки ширины и т.п. Там правда это всё мышкой делалось, но всё равно доставало.
Так что искомое решение было бы полезным. Название: Re: БД с самоописанием Отправлено: QuAzI от Декабрь 19, 2012, 11:35 В общем для MySQL прокатывает что-то типа такого:
1) Строим список справочников Код: select TABLE_NAME, TABLE_COMMENT Код: SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, COLUMN_COMMENT В *_COMMENT соответственно описание объекта, которое можно вывернуть пользователю как имя справочника/колонки. По минимуму как-то так. Ну и опять же для MySQL, на остальном надо проверять какие приколы будут. А вот если хочется большего, как например ширину колонки, видимость, детальное описание (для подсказки), маску ввода и т.п. хранить - придётся держать отдельно таблицу-справочник под всё это дело. И это будет работать уже на любых СУБД. Название: Re: БД с самоописанием Отправлено: алексей от Декабрь 20, 2012, 10:13 Хранимая процедура (Firebird) - получение типа поля, порядкового номера
Код: SET TERM ^ ; Название: Re: БД с самоописанием Отправлено: QuAzI от Декабрь 21, 2012, 16:41 Код: CREATE TABLE IF NOT EXISTS columns_description( 1) Для полей полученных через SELECT не устанавливается COMMENT; 2) Поля не полученные через SELECT оказываются впереди остальных полей. Т.е. порядок полей при создании таблицы не соответствует тому, что получается в итоге. Это немного раздражает и хотелось бы иметь порядок который я сам задал. Дальше простенькая вьюха Код: CREATE OR REPLACE SQL SECURITY INVOKER VIEW columns_schema Код: select * from columns_schema where TABLE_NAME='CONTRACTS'; Название: Re: БД с самоописанием Отправлено: Nimbus от Январь 20, 2013, 10:23 Все твои хотелки называются ORM (http://ru.wikipedia.org/wiki/ORM). У фреймворка Wt (http://www.webtoolkit.eu/wt/blog/2009/11/26/wt__dbo__an_orm__c___style) есть клёвый ORM. Про него почему-то забылиВот какой-то обзорчик - http://habrahabr.ru/post/105191/ |