这节课,我们来学习数据库设计。
前面我们说过,模型驱动设计可以分成两大部分:模型的建立和模型的实现。模型的建立要求模型和业务需求一致,模型的实现要求实现和模型一致。现在,咱们已经建立了领域模型,并且从理论层面对模型驱动设计的概念进行了总结,这些都属于模型的建立。而我们这节课要做的数据库设计,则属于模型的实现。
那么,怎样由领域模型,一步一步地推导出数据库的设计呢?这种方法和以前的方法有什么不同呢?这节课我们就来讨论这两个问题。在这个过程中,我们要着重体会数据库设计是如何与领域模型保持一致的。
今天讲的内容,在软件工程中叫做建立物理数据模型(physical data model, PDM),主要目的就是对数据表进行设计。具体来说,包括以下几点:
建立哪些表;
表中有哪些字段;
表的主键和外键是什么;
字段的数据类型以及约束。
还有一点要说明,虽然我们的例子是用 MySQL 完成的,但我们讲的是通用原理,所以采用其他数据库引擎的话,道理也是一样的。
我们在领域建模的时候把模型分成了四个模块,下面,我们就一个模块一个模块地进行数据库设计。
“租户管理”的数据库设计
咱们就从最简单的租户管理模块开始吧,下面是这个模块的模型图:
一般来说,一个实体可以映射为一个数据库表。所以,咱们可以先根据租户实体设计出租户表。可以用下面的符号表示:
前面说过,今天的内容,是建立物理数据模型。和 UML 不同,物理数据模型的图示法并没有统一的国际标准。所以不同的专家、不同的工具,画出来的都不太一样。这里我用了绘图工具(draw.io)中提供的符号。
另外,还可以用建表语句(create table) 表示表的结构。建表语句和图形符号是同一个意思的两种等价的表示方法,比如上图可以直接翻译成下面的建表语句:
CREATE TABLE tenant ( id INT PRIMARY KEY );
所以,原则上直接用建表语句进行数据库设计也是可以的。不过为了直观,我们的课程中还是用图示的方法。
下面我们仔细看看表示数据表的符号。
首先看这个符号的第一行,这里的 tenant 是表的名称。在领域建模阶段,为了和领域专家进行沟通,模型中使用的都是中文。但建表时,一般要用英文来命名。那问题就来了,怎么保证中英文的一致,从而在实现层面贯彻统一语言呢?
答案就是使用我们前面建的词汇表。在词汇表里,我们规定了每个中文词汇对应的英文全称和简称。在为数据库表以及字段等命名时,如果词汇表中有简称就用简称,否则就用