В последнее время я работаю с группой клиентов на долгосрочной основе, что дало мне время для изучения новых инструментов с использованием их сред. Один инструмент, который я считаю очень полезным, называется SchemaSpy .
SchemaSpy — это инструмент на основе Java (требуется Java 5 или выше ), который анализирует метаданные схемы в базе данных и генерирует ее визуальное представление в формате, отображаемом браузером. Он позволяет пролистывать иерархию таблиц базы данных через связи дочерних и родительских таблиц, представленные как ссылками HTML, так и диаграммами отношений сущностей. Он также предназначен для устранения тупых ошибок, которые база данных иногда выдает, связанных со сбоями из-за ограничений.
В инструментах ERD мне нравится то, что я могу быстро сгенерировать графическое представление базы данных, чтобы увидеть, на какие таблицы чаще всего ссылаются, а какие являются кандидатами на удаление (зачем сохранять старые данные, если вам это не нужно? ). Я гораздо быстрее набираю скорость и могу более эффективно участвовать в процессе разработки, когда знаю взаимосвязи между таблицами и только наблюдение за запросами. Дополнительным преимуществом является то, что SchemaSpy управляется из командной строки и создает html после каждого запуска, поэтому я считаю удобным настроить его на crontab, чтобы изменения схемы автоматически регистрировались. Хорошо, а?
Использование этого инструмента очень простое и делает большую работу за вас. По сути, если в вашей базе данных есть Foreign Keys, вы смеетесь, если не отчаиваетесь, у вас впереди еще немного работы. В большинстве случаев SchemaSpy «делает правильные вещи», но иногда вам нужно немного помочь в виде файлов метаданных.
Установка SchemaSpy и зависимостей
- Загрузите последнюю копию jar-файла SchemaSpy (5.0.0 на момент написания)
- Убедитесь, что у вас установлена последняя версия Java JRE для вашей платформы
- Вам понадобится драйвер Java для вашей базы данных — я использую MySQL Connector / J
- Установите пакет graphiz
Создание файла mysql.properties
Хотя это и не требуется явно, я предпочитаю создавать это один раз, чтобы командная строка была короче и аккуратнее. В моем случае вот файл свойств, используемый для моей песочницы Percona Server 5.6.10:
description=MySQL driver=com.mysql.jdbc.Driver connectionSpec=jdbc:mysql://127.0.0.1:5610/schemaspy driverPath=/usr/share/java/mysql-connector-java.jar
Пример схемы
CREATE TABLE `parent` ( `parent_id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `child_A` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `child_B` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`), CONSTRAINT `child_B_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
Обратите внимание, что в случае child_A существует неявное отношение FK к родительскому элементу через parent_id, однако в child_B оно является явным. Это влияет на то, как SchemaSpy идентифицирует отношения, и нужно ли вам давать подсказку или нет.
Запуск SchemaSpy (с внешними ключами)
Когда вы запустите schemaSpy без файла метаданных, вы увидите, что отношения между parent и child_B отображаются правильно:
Таблицу child_A можно отобразить, если вы отметите поле Подразумеваемые отношения, но это обычно работает только в том случае, если вы использовали точно такое же имя (в данном случае parent_id) в дочерней и родительской таблицах. Ваша среда может походить на множество магазинов, которые мы видим, где родительская таблица называется id, а в дочерних таблицах они ссылаются на нее как parent_id — это может иметь смысл для разработчиков, но это совсем не помогает SchemaSpy. Это где файлы метаданных приходят для воспроизведения
Создание файла метаданных
Формат файла метаданных основан на XML. Я включил файл метаданных, который использовал, чтобы правильно связать child_A с родительской таблицей:
<?xml version="1.0" encoding="UTF-8"?> <schemaMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schemaspy.sourceforge.net/xmlschema/2011/02/05/schemaspy.meta.xsd"> <comments> Main Production Database. Percona, Michael Coburn </comments> <tables> <table name="parent" comments="Parent table"> <column name="parent_id" primaryKey="true"> </column> </table> <table name="child_A" comments="Non-FK relationship, implicit relationship to parent"> <column name="id" primaryKey="true"> </column> <column name="parent_id"> <foreignKey table="parent" column="parent_id"/> </column> </table> </tables> </schemaMeta>
Если вы ищете другие примеры, вы можете найти более полный пример здесь .
Запуск SchemaSpy
Приведенный ниже синтаксис специфичен для MySQL, но обратите внимание, что SchemaSpy работает практически для всех популярных СУБД.
java -jar schemaSpy_5.0.0.jar -t mysql -u msandbox_ro -p msandbox -meta schemaspy.meta.xml -o /var/www/schemaspy/
Директива -o указывает SchemaSpy, куда записывать выходные данные, убедитесь, что это каталог, к которому затем может обращаться веб-сервер. Также обратите внимание, что, поскольку я создал файл mysql.properties в том же каталоге, что и файл jar, мне не нужно передавать какую-либо информацию host: port или имя схемы.
Просмотр выходных данных SchemaSpy
Завершенное представление взаимосвязей этих трех таблиц должно выглядеть следующим образом:
Последние мысли
Хотя я считаю вкладку «Отношения» наиболее полезным компонентом SchemaSpy, я не хочу оставлять у вас впечатление, что это единственный компонент инструмента. Есть дополнительные вкладки:
- Таблицы — имена, количество детей, родителей, количество столбцов, количество строк и комментариев — отличный способ для общего обзора размеров таблиц и простой способ использовать функцию поиска вашего браузера, чтобы сосредоточиться на конкретном стол
- Ограничения — перечисляет явные ограничения внешнего ключа в базе данных (это не включает ограничения, идентифицированные с помощью файлов метаданных!)
- Аномалии — Определяет возможные отношения между столбцами / таблицами на основе имен, таблиц без индексов, столбцов, помеченных как ‘обнуляемые’ и ‘должны быть уникальными’ (woops!), Таблиц с одним столбцом, увеличивающихся имен столбцов в таблицах и таблиц со строкой NULL вместо фактического значения SQL NULL. Это в основном быстрая проверка работоспособности вашей схемы на наличие значительных ошибок или элементов, требующих проверки.
- Столбцы — список всех столбцов в схеме, которые очень удобно отсортировать по имени, чтобы увидеть, есть ли у вас какие-то неявные ограничения, которые вы могли пропустить, и затем можете записать их в файл метаданных.
- Пожертвовать — это бесплатное программное обеспечение, и Джон Керриер просит пожертвований, чтобы он мог оправдать время, потраченное на поддержание SchemaSpy своей жене
Наконец, не забудьте автоматизировать SchemaSpy через crontab, как только вы закончите.
Какие инструменты ERD вы используете и как они сравниваются со SchemaSpy? Не стесняйтесь отвечать через комментарии. Спасибо за чтение!