如何更好地读开源软件之一:ERD工具简介

「时光不负,创作不停,本文正在参加2021年终总结征文大赛

阅读好的开源软件,是使自己的编码能力大增的方法之一。开源软件的项目有时非常大,如何阅读开源软件是有技巧可循的。

掘金有很多这样的文章,然而本文系列尝试就自己的一些心得和大家共享,以达到抛砖引玉的作用。本文先就ERD做些简单的说明。

概论

ER(entity relationship) 模型通常是系统分析的结果,用于定义和描述对业务领域中的流程重要的内容。它没有定义业务流程;它仅以图形形式呈现业务数据模式。它通常以图形形式绘制为由线(关系)连接的框( 实体 ),这些线( 关系 )表示实体之间的关联和依赖关系。ER 模型也可以用语言的形式表达,例如:一栋楼可以分成零个或多个公寓,但一个公寓只能位于一栋楼里。

实体不仅可以通过关系来表征,还可以通过附加属性( 属性 )来表征,其中包括称为“主键”的标识符。创建来表示属性以及实体和关系的图可以称为实体-属性-关系图,而不是实体-关系模型。

ER 模型通常作为数据库实现。在简单的关系数据库实现中,表的每一行代表一个实体类型的实例,表中的每个字段代表一个属性类型。在关系数据库,实体之间的关系是通过将一个实体的主键作为指针或“外键”存储在另一个实体的表中来实现的。

ERD 例子

ERD(entity relationship diagram) 就是ER的图形表示。ERD会更直接地帮助你理解ER,从而更好地把握一些开源项目。

我以spree为例子来说明。

spree是比较出名的电子商务开源软件,类似shopify。让我们来生成一个ERD。

git clone git@github.com:spree/spree_starter.git
cd spree_starter
bundle add rails-erd
bundle
复制代码

在ios平台需要安装 graphviz

brew install graphviz
复制代码

都安装好了以后执行

改相应的config/database.yaml 配置数据库,并创建相应的数据库

然后执行

bundle exec rake db:migrate
复制代码
bundle exec erd --notation=simple --direct  --orientation=vertical --splines=ortho --connected --attributes=false
复制代码

就可以看到如下的图

1638575308605.png

如果执行这个

 bundle exec erd --notation=simple --direct  --orientation=vertical --splines=ortho --connected
复制代码

会看到这个

1638575241892.png

问题来了,太多的entity model, 很难看清谁连的谁, 我做了一个基本的改进:增加了颜色。操作如下:

把根目录的Gemfile 找到 rails-erd 那行改成

gem 'rails-erd', github: "williamhatch/rails-erd"
复制代码

保存。在命令行执行

bundle
bundle exec erd --notation=simple --direct  --orientation=vertical --splines=ortho --connected
复制代码

会得到

1638575103286.png

如果执行

bundle exec erd --notation=simple --direct  --orientation=vertical --splines=ortho --connected --attributes=false
复制代码

会得到

1638575024959.png

颜色的区分是否更加清楚 🙂

下一步思路:

  1. 用yaml格式定义实体和实体之间的关系,然后自动生成rails的model,并生成ERD(彩色的)
  2. 或者用UI(web base的)通过拖拽生成yaml,然后再自动生成rails的model,并生成ERD(彩色的),这个可以参考strapi的admin dashboard。
  3. 做个web base的UI (基于nuxt3),可以选择(勾选)模块,只生成相关的模块的ERD。
  4. 最终的目标是用户只要在web拖拽,就可以实现建模,自动生成restful的api和graphql的api,加上简单配置,可以支持认证和log功能。这样后端基本就是DDD(domain driven design)。后续有机会会陆续介绍这方面的心得。

有兴趣的同学可以在下面留言,并关注我的github