4、数据模型设计:实体定义、字段类型、关系映射、数据源配置
好,咱们进入第四章。数据模型设计,说白了就是低代码平台的“地基”。你盖楼,地基没打好,后面装修得再漂亮也得塌。我在做第一个低代码项目时,就吃过这个亏——当时急着上线,实体关系没理清楚,结果后期客户要加个“多对多”关联,差点把整个数据库重构了一遍。嗯,从那以后,我再也不敢轻视这一步了。
4.1 实体定义:一切业务的核心
实体是什么?说白了就是你要管理的“东西”。比如一个CRM系统,客户、订单、产品,这些都是实体。在低代码平台里,实体定义就是告诉系统:“嘿,我要管这些数据,你帮我建个表。”
我个人习惯,定义实体时先问三个问题:
- 这个实体是独立的吗? 比如“客户”就是独立的,“订单明细”通常依赖“订单”。
- 它有哪些核心属性? 别一上来就列几十个字段,先抓关键的。
- 它跟其他实体怎么关联? 一对一?一对多?多对多?
举个例子,一个简单的“员工”实体:
{
"entityName": "Employee",
"displayName": "员工",
"fields": [
{ "name": "name", "type": "string", "label": "姓名" },
{ "name": "email", "type": "string", "label": "邮箱" },
{ "name": "departmentId", "type": "relation", "label": "所属部门" }
]
}
你看,这里我只定义了三个字段。为什么?因为一开始别贪多,后面可以慢慢加。我在项目中见过有人一口气定义50个字段,结果一半都用不上,反而拖慢了页面加载速度。
4.2 字段类型:别小看这个选择
字段类型,听起来简单吧?字符串、数字、日期……但你真的选对了吗?
我遇到过最坑的事:有人把所有字段都定义成“字符串”。结果呢?排序时“10”比“2”小,日期比较全乱套。你想想看,这能不出问题吗?
低代码平台里,常见的字段类型我列一下:
| 类型 | 说明 | 使用场景 |
|---|---|---|
| string | 字符串 | 姓名、描述、备注等 |
| number | 数字(整数/浮点) | 价格、数量、年龄 |
| boolean | 布尔值 | 是否启用、是否删除 |
| date | 日期 | 创建时间、生日 |
| datetime | 日期时间 | 订单时间、操作日志 |
| enum | 枚举 | 状态(待审核/已通过/已驳回) |
| relation | 关联关系 | 外键、多对多关联 |
| json | JSON对象 | 扩展属性、动态配置 |
这里我要特别说一下 enum 类型。很多新手喜欢用字符串存状态,然后在代码里写死“0=待审核,1=已通过”。这其实很危险——一旦业务变了,你得改代码。用枚举类型,平台会自动生成下拉选项,改起来也方便。
4.3 关系映射:把数据串起来
实体之间怎么关联?这是低代码平台的核心能力之一。你想想看,一个订单没有客户信息,那还叫订单吗?
关系映射有三种基本类型:
- 一对一: 比如一个员工对应一个工位。很少用,但某些场景很关键。
- 一对多: 一个部门有多个员工。这是最常见的。
- 多对多: 一个学生可以选多门课,一门课也有多个学生。需要中间表。
在低代码平台里,我们通常这样配置:
{
"relations": [
{
"type": "oneToMany",
"sourceEntity": "Department",
"targetEntity": "Employee",
"foreignKey": "departmentId"
},
{
"type": "manyToMany",
"sourceEntity": "Student",
"targetEntity": "Course",
"throughEntity": "StudentCourse"
}
]
}
我曾经在一个项目中,客户要求“一个订单可以关联多个客户”。这听起来有点反直觉,但业务确实需要——比如一个家庭共同购买。这时候,多对多关系就派上用场了。
嗯,这里要注意:关系映射不要搞得太深。我见过有人把实体关联了七八层,结果查询时性能惨不忍睹。一般来说,三层以内就够了。
4.4 数据源配置:让数据流动起来
数据源配置,说白了就是告诉平台:“你的数据存在哪里?怎么连?”
低代码平台通常支持多种数据源:
- 内置数据库: 平台自带的,开箱即用。适合小项目或原型开发。
- 外部数据库: 比如 MySQL、PostgreSQL、SQL Server。适合企业级应用。
- API 数据源: 通过 RESTful 接口获取数据。适合对接第三方系统。
- 文件数据源: Excel、CSV 等。适合临时导入导出。
我个人建议,生产环境一定要用外部数据库。为什么?因为内置数据库通常性能有限,而且不好做备份和迁移。我之前有个客户,用内置数据库跑了半年,数据量一上来,查询慢得像蜗牛。后来迁移到 MySQL,问题才解决。
配置示例:
{
"dataSource": {
"type": "mysql",
"host": "192.168.1.100",
"port": 3306,
"database": "lowcode_demo",
"username": "admin",
"password": "encrypted_password",
"poolSize": 10
}
}
另外,数据源配置里还有一个容易被忽略的点——连接池。别小看这个参数,设得太小,高并发时数据库会崩;设得太大,资源浪费。我一般建议根据业务量来,初期设 10-20 个连接,后面再调优。
4.5 避坑指南:我踩过的那些坑
最后,分享几个我亲身踩过的坑,希望能帮你少走弯路:
- 字段命名不规范: 我曾经用中文做字段名,结果生成 SQL 时各种报错。后来统一用英文小写+下划线,再也没出过问题。
- 忽略索引: 有个项目上线后,查询越来越慢。一查,发现所有字段都没建索引。后来给常用查询字段加了索引,速度提升了 10 倍。
- 关系映射循环引用: A 引用 B,B 引用 C,C 又引用 A。序列化时直接栈溢出。解决办法是加一个“深度限制”或“忽略循环”。
- 数据源切换不灵活: 开发环境用 SQLite,生产环境用 MySQL,结果 SQL 语法不兼容。建议从一开始就用同一类数据库,或者用 ORM 做抽象层。
好了,这一章的内容就到这里。数据模型设计看似基础,但决定了整个平台的成败。下一章我们会聊“页面设计器”,到时候你会看到,数据模型定义得好,页面搭建起来有多爽。