Статьи

Навигация по схеме базы данных в Java

Важной частью jOOQ является jooq-meta, модуль навигации по схеме базы данных. Это используется генератором кода для обнаружения соответствующих объектов схемы. Меня несколько раз спрашивали, почему я свернул свои собственные вместо использования других библиотек, таких как SchemaCrawler или SchemaSpy , и действительно жаль, что я не могу положиться на другие стабильные сторонние продукты.

Вот несколько соображений относительно навигации по схеме базы данных:

стандарты

Стандарт SQL-92 определяет, как СУБД должна реализовывать INFORMATION_SCHEMA, содержащую их словарные таблицы. И действительно, некоторые РСУБД реализуют части стандартной спецификации. Эти СУБД поставляются с некоторой реализацией стандарта.


Близко к стандарту

  • HSQLDB: очень близко к истинному стандарту
  • Postgres: близко к стандарту, с некоторыми изменениями (также есть собственные словарные таблицы)
  • SQL Server: близко к стандартному, но довольно неполный (также имеет собственные таблицы словарей)

Либеральная интерпретация стандарта

  • H2 (некоторые назад несовместимые изменения, в последнее время)
  • MySQL (только начиная с 5.0, также есть собственные словарные таблицы)

Другие СУБД предоставляют свое собственное представление о словарных таблицах. Это очень сложно для инструментов навигации по схеме, таких как jOOQ. Пейзаж словарной таблицы можно описать так (мое предвзятое мнение):

Аккуратные и хорошо документированные словарные таблицы

  • DB2: Эти словарные таблицы как-то похожи на стандартные с разными именами. Они чувствуют себя интуитивно.
  • Oracle: По моему мнению, набор словарных представлений лучше, чем те, которые предлагаются стандартом. Очень легко понять и хорошо задокументировано по всему Интернету
  • SQLite: нет словарных таблиц, но хранимые процедуры SQLite очень просты в использовании. Это простая база данных, в конце концов

Трудно понять, плохо документированные словарные таблицы

  • Дерби: Создано понятие конгломератов вместо использования обычных баз данных, таких как отношения, ключи и т. Д.
  • MySQL: старая схема mysql была довольно болезненной. К счастью, это больше не относится к MySQL 5.0
  • Ingres: Ну … Ingres — это старая база данных . Юзабилити не была одной из главных вещей в 70-х годах…
  • Sybase SQL Anywhere: множество объектов, которые необходимо объединить в сложные отношения. Документация недостаточна
  • Sybase ASE: еще сложнее, чем SQL Anywhere. Некоторые данные можно получить только с помощью «хитростей»

JDBC абстракция

Разнообразие таблиц словаря, кажется, требует стандартной абстракции. Хотя стандарт SQL-92 может быть реализован на большинстве этих СУБД, абстракция JDBC еще лучше. JDBC знает об объекте DatabaseMetaData и позволяет легко перемещаться по схемам базы данных. К сожалению, время от времени этот API создает исключение SQLFeatureNotSupportedException . Не существует общего правила о том, какой драйвер JDBC реализует объем этого API и когда требуется обходной путь. Для генерации кода jOOQ эти факты делают этот API совершенно бесполезным.

Другие инструменты

Как уже упоминалось ранее, в мире открытого исходного кода есть и другие инструменты. Вот некоторые недостатки использования этих инструментов в jOOQ:

  • Оба инструмента, о которых я знаю, лицензированы LGPL , который несовместим с лицензией Apache 2 от jOOQ.
  • Оба инструмента очень хорошо ориентируются в отношениях между сущностями, но, похоже, им не хватает поддержки многих нестандартных конструкций, таких как UDT, расширенное использование хранимых процедур (например, возврат курсоров, UDT и т. Д.), ARRAY.
  • SchemaCrawler поддерживает только 8 RDBMS, в jOOQ теперь 12
  • Оба инструмента довольно неактивны. Смотрите здесь и здесь

Для получения дополнительной информации посетите их сайты:

jooq-мета

По вышеуказанным причинам jOOQ поставляется с собственной навигацией по схеме базы данных: jooq-meta. Этот модуль может использоваться независимо в качестве альтернативы JDBC DatabaseMetaData, SchemaCrawler или SchemaSpy. jooq-meta использует созданные jOOQ запросы для навигации по метаданным базы данных, поэтому он также является частью набора интеграционных тестов. В качестве примера посмотрите, как отношения внешнего ключа Ingres перемещаются с помощью jooq-meta:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Result<Record> result = create()
    .select(
        IirefConstraints.REF_CONSTRAINT_NAME.trim(),
        IirefConstraints.UNIQUE_CONSTRAINT_NAME.trim(),
        IirefConstraints.REF_TABLE_NAME.trim(),
        IiindexColumns.COLUMN_NAME.trim())
    .from(IICONSTRAINTS)
    .join(IIREF_CONSTRAINTS)
    .on(Iiconstraints.CONSTRAINT_NAME.equal(IirefConstraints.REF_CONSTRAINT_NAME))
    .and(Iiconstraints.SCHEMA_NAME.equal(IirefConstraints.REF_SCHEMA_NAME))
    .join(IICONSTRAINT_INDEXES)
    .on(Iiconstraints.CONSTRAINT_NAME.equal(IiconstraintIndexes.CONSTRAINT_NAME))
    .and(Iiconstraints.SCHEMA_NAME.equal(IiconstraintIndexes.SCHEMA_NAME))
    .join(IIINDEXES)
    .on(IiconstraintIndexes.INDEX_NAME.equal(Iiindexes.INDEX_NAME))
    .and(IiconstraintIndexes.SCHEMA_NAME.equal(Iiindexes.INDEX_OWNER))
    .join(IIINDEX_COLUMNS)
    .on(Iiindexes.INDEX_NAME.equal(IiindexColumns.INDEX_NAME))
    .and(Iiindexes.INDEX_OWNER.equal(IiindexColumns.INDEX_OWNER))
    .where(Iiconstraints.SCHEMA_NAME.equal(getSchemaName()))
    .and(Iiconstraints.CONSTRAINT_TYPE.equal("R"))
    .orderBy(
        IirefConstraints.REF_TABLE_NAME.asc(),
        IirefConstraints.REF_CONSTRAINT_NAME.asc(),
        IiindexColumns.KEY_SEQUENCE.asc())
    .fetch();

Вывод

Еще раз можно сказать, что мир RDBMS очень разнороден. Абстракция базы данных в Java установлена ​​только в определенной степени в таких технологиях, как JDBC, Hibernate / JPA и сторонних библиотеках, таких как SchemaCrawler, SchemaSpy и jooq-meta.

Ссылка: навигация по схеме базы данных на Java от нашего партнера по JCG в блоге «Java, SQL и jOOQ» .

Статьи по Теме :