← Все гайды

DBML в XSD: XML-схема по модели базы данных

· 2 мин чтения

DBMLXSD

Как получить XSD из модели DBML: таблицы — составные типы, типы SQL — встроенные типы XSD, длины и перечисления — ограничения, NULL — nillable, корневой элемент для выгрузки.

Обмен данными в XML до сих пор встречается повсюду: SOAP-сервисы, файловые выгрузки, интеграции с банками и государственными системами. Структура таких сообщений часто повторяет таблицы базы. Если модель уже описана в DBML, черновик XML-схемы можно получить из неё автоматически.

Как преобразовать

  1. Откройте модель в редакторе DBML.
  2. Выберите Файл → Преобразовать в → XSD — структуры таблиц.
  3. Проверьте предпросмотр, выберите папку проекта и название — появится новый артефакт XSD. В песочнице результат откроется в редакторе XSD.
Окно преобразования DBML в XSD с предпросмотром схемы
Предпросмотр XSD перед сохранением в проект

Как переводятся типы

SQL (DBML)XSD
int, bigint, serialxs:integer
numeric, decimal, float, moneyxs:decimal
varchar(n), char(n)xs:string с ограничением xs:maxLength
text, uuidxs:string
booleanxs:boolean
date / time / timestamp, timestamptzxs:date / xs:time / xs:dateTime
bytea, blobxs:base64Binary
json, jsonbxs:anyType
Enumименованный простой тип с xs:enumeration

Что получается

  • Каждая таблица — именованный составной тип (xs:complexType), каждая колонка — элемент последовательности в том же порядке.
  • Колонки not null и первичный ключ — обязательные элементы. Остальные — minOccurs="0" и nillable="true": элемент можно пропустить или передать пустым с xsi:nil.
  • Заметки таблиц и колонок, внешние ключи («→ customers.id») и значения по умолчанию — в xs:documentation.
  • Корневой элемент назван по имени проекта (Project blog { … }) или по названию документа и содержит строки всех таблиц (maxOccurs="unbounded") — схема сразу подходит для выгрузки данных.
  • Таблицы из схем БД (sales.orders) получают имена с подчёркиванием: sales_orders.

Пример

Enum order_status { new
 paid }

Table orders {
  id int [pk, increment]
  customer_id int [ref: > customers.id, not null]
  status order_status [not null]
  total numeric(10,2)
}

превращается в:

<xs:simpleType name="order_status">
  <xs:restriction base="xs:string">
    <xs:enumeration value="new"/>
    <xs:enumeration value="paid"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="orders">
  <xs:sequence>
    <xs:element name="id" type="xs:integer"/>
    <xs:element name="customer_id" type="xs:integer">
      <xs:annotation>
        <xs:documentation>→ customers.id</xs:documentation>
      </xs:annotation>
    </xs:element>
    <xs:element name="status" type="order_status"/>
    <xs:element name="total" type="xs:decimal" minOccurs="0" nillable="true"/>
  </xs:sequence>
</xs:complexType>

Что сделать после

  • Посмотрите схему графически в редакторе XSD — см. «Просмотр XSD-схемы графически».
  • Сгенерируйте пример XML для согласования с потребителем — см. «Пример XML по XSD».
  • Уберите служебные колонки, задайте пространство имён (targetNamespace) и сгруппируйте связанные данные: сообщение интеграции — не копия таблиц.

Вопросы и ответы

Переносятся ли индексы, уникальность и внешние ключи? Как ограничения — нет: XSD описывает структуру документа, а не целостность базы. Внешние ключи остаются в документации элементов.

Нужна схема для JSON? Пункт JSON Schema — структуры таблиц в том же меню, см. «DBML в OpenAPI и JSON Schema». Между JSON Schema и XSD можно переходить и дальше — см. «JSON Schema в XSD».