chippyash / db-plantuml
支持使用出色的 PlantUml 创建数据库逻辑和物理图
Requires
- php: ^8.0
- ext-dom: *
- ext-xsl: *
- symfony/console: ^5.0
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpunit/phpunit: ^8.5
README
chippyash/db-plantuml
什么是
- 提供 Plantuml !include 文件,可用于创建数据库逻辑和物理图
- 提供(PHP)实用工具,将图表转换为 DDL 文件以创建您的数据库。
PlantUml 支持
- 与 PlantUML V1.2021.12 - Graphviz 版本 2.43.0 进行测试
2 个定义文件
- DatabaseLogical.iuml
- DatabasePhysical.iuml
目标
快速创建逻辑数据库设计,以便最终用户理解,并将它们转换为具有额外功能的基本物理设计,例如 SQL 架构。
演示
- 打开
examples\User-Logical.puml
并显示绘图 - 打开
examples\User-Physical.puml
并显示绘图
查看这两个文件。它们之间的唯一区别是
- a/ 定义顶部定义中包含的文件
- b/ 物理绘图具有额外的功能
- 视图
- 触发器 & trigger()
- (存储)过程和 uses()
原始逻辑定义是从逻辑文件复制粘贴到物理文件,并自动以物理形式呈现。
查看 dist\*.iuml
文件。这是函数声明之间的细微差异,使得转换成为可能。
安装
实际上没有安装此代码库的真正需要。您可以使用 !includeurl
指令远程访问所需的文件。
但是,您需要安装 PlantUml!
用法
- 创建您的逻辑模型以表示客户/用户视图
- 将逻辑模型文件复制到物理模型文件,并更改 !include 语句。如有必要,进行修改。
- (可选)生成 SQL DDL 文件以创建您的数据库
逻辑模型
!include ../dist/DatabaseLogical.iuml
或
!includeurl https://raw.githubusercontent.com/chippyash/db-plantuml/master/dist/DatabaseLogical.iuml
组件
Table(alias, name="", description="") //preferred
or
Entity(alias, name="", description="") //psuedonym for Table
Type(alias, name="", description="") //data type (enum)
Set(alias, name="", description="") //data type (set)
数据类型
string(l=30)
char(l=12)
text()
date()
time()
datetime()
int(l=8)
real()
bool()
注意:字符串和整数长度不在逻辑模型中显示,但如果您知道它们,请指定它们,因为它们将在物理模型中显示。
您可以直接在实体类中显示其他数据类型,例如。
Table(t1, foo) {
bin_data blob
}
类型修饰符
not_null(name, type)
unsigned(name, l=8) //unsigned integer with a name
_unsigned(l=8) //unsigned integer, use with primary() etc
索引和键
primary(name = 'id', type=_unsigned(8), auto=1) //primary key
idx(name, type=int()) //non unique index - one member
idx2(name1, name2) //non unique index - two members
idx3(name1, name2, name3) //non unique index - three members
关系
zeromany(from, to, verb, tNum='n')
onemany(from, to, verb, tNum='n')
manymany(from, to, verbFrom, verbTo)
oneone(from, to, verb, keyname='id', type=int())
depends(from, to, colname) //enum and set dependencies
存在一个内部关系 _join
_join(from, to, verb, fNum, tNum)
e.g.
_join(a, b, has, 0, n)
您可以使用它来根据需要调整关系。fNum & tNum 接受整数或 'n'。
物理模型
!include ../dist/DatabasePhysical.iuml
或
!includeurl https://raw.githubusercontent.com/chippyash/db-plantuml/master/dist/DatabasePhysical.iuml
使用与逻辑模型相同的语句。此外,还有
组件
Trigger(alias, name)
e.g.
Trigger(t1, UserUpdate) {
beforeUpdate()
afterUpdate()
beforeInsert()
afterInsert()
beforeDelete()
afterDelete()
}
Proc(alias, name)
e.g.
Proc(p1, StoredProcs) {
addUser(uid, guid)
}
View(alias, name)
e.g.
View(v1, sessions) {
select(user_id, data\nfrom user, session\njoin id on user_id)
}
索引和键
foreign_key(tableName, to, type=int(), suffix='_id')
在模型中的表之间自动生成外键。您可能需要明确声明模型之外的表的外键。
关系
function triggers(from, to) //table actions trigger
function uses(from, to) //proc uses table
这些 uses
关系完全是信息性的。
用户定义数据类型
虽然许多 SQL RDMBS 本地支持用户定义数据类型,但许多不支持,包括始终受欢迎的 MySql/MariaDb。您可以在 PlantUml 中实现此功能。
!define guid() char(36)
!unquoted procedure orgId()
orgId int(8) UNSIGNED NOT NULL
index(orgId)
!endprocedure
然后可以在表定义中使用它们
Table(invpayee, cr_invoice_payee, Invoice Payee) {
primary(entityId, guid(), 0)
orgId()
}
有关更多想法,请参阅(PlantUml 预处理)[https://plantuml.com/preprocessing]
图到SQL转换
一个PHP命令行工具程序,可以将您的物理图转换为SQL DDL。
本版本支持MySQL。
- 安装 - "见下文安装 - 生成环境使用"
基本用法
bin/pumldbconv g ./examples/User-Physical.puml ./out.sql
这会将示例物理图转换为如下SQL
CREATE TABLE `user` ( `id` INT(8) PRIMARY KEY AUTO_INCREMENT, `tag` VARCHAR(30), `username` VARCHAR(30), `bar` TEXT NOT NULL, `password` VARCHAR(30) NOT NULL ); CREATE TABLE `session` ( `id` INT(8) PRIMARY KEY AUTO_INCREMENT, `data` text NOT NULL, `user_id` INT(8) ); CREATE TABLE `account` ( `logon` VARCHAR(30), `user_id` INT(8) ); CREATE TABLE `profile` ( `age` SMALLINT, `birthday` DATETIME NOT NULL, `id` INT(8) PRIMARY KEY, `gender` enum('MALE','FEMALE') NOT NULL, `fav_colours` set('RED','BLUE','GREEN') NOT NULL ); CREATE TABLE `group` ( `id` INT(8) PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(20) NOT NULL ); CREATE TABLE `user_group` ( `user_id` INT(8), `group_id` INT(8) ); CREATE INDEX idx_att34 ON user (`tag`); CREATE UNIQUE INDEX idx_att35 ON user (`username`); CREATE INDEX idx_att36 ON user (`username`,`password`); ALTER TABLE `session` ADD FOREIGN KEY fk_att40 (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; CREATE INDEX idx_att43 ON account (`logon`); ALTER TABLE `account` ADD FOREIGN KEY fk_att44 (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; ALTER TABLE `user_group` ADD FOREIGN KEY fk_att54 (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; ALTER TABLE `user_group` ADD FOREIGN KEY fk_att55 (`group_id`) REFERENCES `group` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; CREATE VIEW `sessions` AS SELECT user_id, data from user join session on (user.id = session.user_id); DELIMITER // CREATE PROCEDURE sp_StoredProcs_addUser(IN uid INT, IN guid INT) BEGIN # complete proc body and parameter typing END; DELIMITER ; CREATE DEFINER=`root`@`localhost` TRIGGER UserUpdate_beforeUpdate BEFORE UPDATE ON `user` FOR EACH ROW BEGIN # complete trigger body and declaration END; CREATE DEFINER=`root`@`localhost` TRIGGER UserUpdate_afterUpdate AFTER UPDATE ON `user` FOR EACH ROW BEGIN # complete trigger body and declaration END;
程序假定您的plantuml.jar位于
- Linux:/usr/share/plantuml/plantuml.jar
- Windows:"C:/Program Files/Java/jars/plantuml.jar"
如果情况不是这样,您可以使用-p
标志指定文件夹位置,例如:bin/pumldbconv g -p /usr/local/javajars ./examples/User-Physical.puml ./out.sql
安装 - 生成环境使用
使用此程序,您需要安装PHP8.0+并已安装xsl和xml扩展。
- 克隆/分支此仓库或获取存档并解压它
- 将bin/pumldbconv文件移动到您的路径中的目录中,例如
/usr/local/bin
- 使用
pumldbconv -V
检查您是否可以执行它 - 如果不再需要,请删除源文件
安装 - 开发环境
注意:以下说明假设使用Linux操作系统。(如果您是Windows/Mac用户,请考虑通过pull request的方式添加安装和用法说明到这个仓库。)
- 克隆/分支此仓库或获取存档并解压它
- 安装Composer
- 安装PHP XSL扩展,例如对于基于Debian的Linux
sudo apt install php-xsl
PHP通常内置XML扩展,但您可能需要手动安装它。
sudo apt install php-xml
- 运行
composer install
构建
make build
将在bin目录下构建一个新的PHAR可执行文件。您需要安装Box,并且需要修改您的php.ini
设置以构建PHAR文件(默认是关闭的)。
更改库
- 进行分支
- 编写测试
- 修改
- 发起pull request
发现了一个您无法解决的bug吗?
- 进行分支
- 编写测试
- 发起pull request
注意。在您的pull request之前,请确保rebase到HEAD
或者,在Github上记录一个问题票据。
在哪里?
库托管在Github。它在Packagist.org上可用。
许可证
本软件根据BSD-3 Clause许可证授权。
历史记录
V0.0.0 初步alpha版本发布
V0.0.1 Alpha版本,包含DDL生成器
V1.0.0 升级为使用PHP 8和最新版本的PlantUML
V1.1.0 添加UNSIGNED属性支持