多应用-jhId
120031、背景
- 什么情况下需要多应用使用一个数据库
多应用使用一个数据库适用于需要实现数据共享、保持一致性的状态、简化开发和维护流程、方便数据查询与分析、资源共享、一体化开发部署以及降低成本的情况。这种做法有助于确保不同应用间的数据一致性,提高系统整体的可维护性和协同性,同时降低硬件和维护成本,促进业务模块化和整体一体化的发展。
以JianghuJS的SEO项目为例,更具体地说明多应用使用一个数据库的情况。SEO项目分为两个模块:SEO前端演示和SEO后台管理。两个模块都使用了同一个数据库,以下是一些具体示例:
用户数据:
在该项目中,用户数据在前端演示和后台管理模块之间共享。例如,用户在前端演示模块中注册的账户信息同样可以被后台管理系统使用,这包括用户名、密码等。文章数据:
SEO项目通常涉及到大量的文章管理,这些文章数据在前端演示和后台管理之间需要共享。无论是前端展示的文章列表还是后台管理中的文章管理,都基于同一个数据库的文章表。分类和标签数据:
文章的分类和标签信息可能在前端演示和后台管理中都需要用到。这些信息可以共享在同一个数据库的分类表和标签表中。站点配置信息:
网站的常量配置信息,如标题、Logo、底部信息等,通常在前端演示和后台管理中都需要保持一致。这些配置信息存储在同一个数据库的配置表中。素材数据:
图片、文件、音频、视频等素材数据可能在前端和后台都需要使用。通过同一个数据库,可以方便地管理这些素材,确保它们在各个模块中的一致性。模板页面数据:
动态生成页面所需的模板数据可能需要在前端和后台中共享。这些数据可以存储在同一个数据库的模板表中。
这些示例说明了在SEO项目中,前端演示和后台管理两个模块之间存在着数据的共享和关联需求,因此选择共用一个数据库可以更好地满足这些需求。这种做法简化了数据管理和维护,提高了系统的整体一致性。
2、config中的配置
- 配置方式
在config.local.example.js文件中,jianghuConfig的配置如下:
jianghuConfig:{
jhIdConfig: {
// 是否开启
enable: false,
// 当前应用使用的 jhId,在使用配置表时,自动用该 jhId 做过滤
jhId: 'mingding_seo',
// 使用到 jhId 的配置表,一般保持默认即可
careTableViewList: [
'_cache',
'_constant',
'_file',
'_group',
'_page',
'_record_history',
'_resource',
'_resource_request_log',
'_role',
'_test_case',
'_ui',
'_user',
'_user_group_role',
'_user_group_role_page',
'_user_group_role_resource',
'_user_session',
'_view01_user',
],
},
},
配置属性说明
针对JianghuJS框架的配置项,其中 jhIdConfig 是用于多应用标识的配置。具体属性如下:
- enable:是否开启 jhId 的功能,决定是否启用多应用标识。
- jhId:当前应用使用的 jhId,即项目标识,用于区分不同的应用。
- careTableViewList:使用到 jhId 的配置表列表,这些配置表将根据应用的 jhId 进行过滤,确保数据的隔离。
3、数据库配置
- jhId
在多应用系统中,如果不同的应用需要共享同一个数据库,为了确保数据的隔离性,需要在数据表中引入一个标识符,用于标记数据属于哪个应用。这就是 jhId 的作用,它在JianghuJS框架中充当了这个标识符的角色。具体来说,使用 jhId 可以实现以下功能:
数据隔离: 不同应用的数据通过 jhId 进行标识,确保在共享数据库的情况下,各应用的数据互不干扰。
多应用共存: 允许在同一个数据库中存储多个应用的数据,通过 jhId 区分彼此。
配置过滤: 在使用配置表等功能时,系统可以根据当前应用的 jhId 进行过滤,确保获取到的配置是与当前应用相关的。
在配置中,可以通过开启 jhId 功能,指定当前应用使用的 jhId,以及定义使用到 jhId 的配置表列表。这样,框架就能够根据这些配置自动处理 jhId 相关的数据库操作,从而实现多应用数据管理的需求。
冲突处理(分离为业务表)
在JianghuJS数据配置中,分为配置表和业务表。配置表管理系统配置、缓存、权限管理等功能,通常不涉及具体业务数据,而更多地用于框架的运行和辅助功能。业务表则负责管理业务数据。
配置表: 用于管理系统的配置信息,包括系统常量、缓存设置、权限管理等。这些表通常不存储具体业务数据,而是用于支持系统的运行和各项功能。
业务表: 负责管理实际的业务数据,比如文章、用户信息、文件管理等。每个业务表都有清晰的定义和目的,用于存储和处理具体的业务逻辑。
在配置表和业务表中,都使用 jhId 作为过滤标识。通过在所有表中加入 jhId 字段,并在查询和操作时使用该字段进行过滤,可以实现数据的隔离和避免不同应用之间的数据冲突。具体实践包括:
数据隔离: 在每个表中加入 jhId 字段,确保每条记录都与特定的应用关联。这样,不同应用之间的数据在同一表中共存,但通过 jhId 的过滤,使得它们在逻辑上是相互独立的。
查询过滤: 在进行数据查询时,始终通过 jhId 进行过滤,确保只返回属于特定应用的数据。这样可以简化查询逻辑,使得每个应用只看到自己关心的数据。
数据插入和更新: 在插入和更新数据时,始终设置正确的 jhId,以确保新的数据与特定应用相关联。
权限控制: 在系统中可以利用 jhId 进行权限控制,确保每个用户只能访问其所属应用的数据。
4、逻辑说明
- jianghuKnex中对jhId的处理
在 JianghuKnex 中,jhId 的处理主要体现在对多应用数据隔离的支持。以下是对 jhId 的处理的关键点:
- 初始化 jhId 配置:
在 JianghuKnex 的初始化过程中,可以通过配置项指定是否开启 jhId 的支持以及相关的配置信息。
// 示例配置
const jianghuConfig = {
jhIdConfig: {
// 是否开启
enable: true,
// 当前应用使用的 jhId,在使用配置表时,自动用该 jhId 做过滤
jhId: 'example_app',
// 使用到 jhId 的配置表,一般保持默认即可
careTableViewList: [...],
},
};
const knex = require('knex')({
// ...其他配置
jianghuConfig,
});
- 表级别的 jhId 过滤:
JianghuKnex 在执行查询时会自动根据配置的 jhId 进行过滤,确保查询的数据属于当前应用。
const result = await knex('example_table').where({ /* ... */ }).select();
- 列级别的 jhId 处理:
JianghuKnex 还支持对表中的列进行 jhId 处理,例如,自动为表添加 jhId 列,或者在执行操作时自动带上 jhId 条件。
// 示例:为表添加 jhId 列
await knex.schema.table('example_table', (table) => {
table.string('jhId', 255).after('id');
});
// 示例:执行查询时自动带上 jhId 条件
const result = await knex('example_table').where({ /* ... */ }).select();
总体而言,JianghuKnex 在底层实现中对 jhId 进行了集成和封装,开发者在使用时只需配置相关选项,就能够方便地实现多应用数据隔离的需求。