chippyash/db-plantuml

支持使用出色的 PlantUml 创建数据库逻辑和物理图

安装: 2

依赖项: 0

建议者: 0

安全: 0

星级: 21

关注者: 2

分支: 2

开放问题: 1

类型:项目

1.1.2 2022-07-29 06:39 UTC

This package is auto-updated.

Last update: 2024-08-29 05:24:15 UTC


README

chippyash/db-plantuml

什么是

  1. 提供 Plantuml !include 文件,可用于创建数据库逻辑和物理图
  2. 提供(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!

用法

  1. 创建您的逻辑模型以表示客户/用户视图
  2. 将逻辑模型文件复制到物理模型文件,并更改 !include 语句。如有必要,进行修改。
  3. (可选)生成 SQL DDL 文件以创建您的数据库

逻辑模型

!include ../dist/DatabaseLogical.iuml

!includeurl https://raw.githubusercontent.com/chippyash/db-plantuml/master/dist/DatabaseLogical.iuml

examples/User-Logical.puml 逻辑模型将显示与物理模型表示不同的以下内容

组件
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

examples/User-Physical.puml

使用与逻辑模型相同的语句。此外,还有

组件
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文件(默认是关闭的)。

更改库

  1. 进行分支
  2. 编写测试
  3. 修改
  4. 发起pull request

发现了一个您无法解决的bug吗?

  1. 进行分支
  2. 编写测试
  3. 发起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属性支持