如何为MySQL中的app实体添加本地化与版本管理功能
应用商店应用本地化与版本管理的数据库设计方案
原表结构
原app表存储应用基础信息,但无法满足多语言和多版本需求,其结构如下:
+--------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+-------+ | id | varchar(36) | NO | PRI | NULL | | | name | varchar(255) | YES | | NULL | | | developer | varchar(255) | YES | | NULL | | | description | varchar(255) | YES | | NULL | | | icon | varchar(255) | YES | | NULL | | | support | varchar(255) | YES | | NULL | | +--------------+--------------+------+-----+---------+-------+
需求梳理
需要新增两类核心功能,各字段的属性要求如下:
+--------------+--------------+------------+ | Field | Translatable | Versioned | +--------------+--------------+------------+ | id | NO | NO | | name | NO | NO | | developer | NO | NO | | description | YES | YES | | icon | NO | YES | | support | YES | NO | +--------------+--------------+------------+
同时需要实现两类CRUD API:
- 基于
id和language_code的应用本地化信息增删改查 - 基于
id和version的应用版本信息增删改查
数据库表拆分设计
将全局不变的字段保留在主表,把需要本地化、版本化的字段拆分到独立子表,实现数据解耦:
1. 应用主表 app
存储所有版本、所有语言下都一致的核心信息:
+--------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+-------+ | id | varchar(36) | NO | PRI | NULL | | | name | varchar(255) | YES | | NULL | | | developer | varchar(255) | YES | | NULL | | +--------------+--------------+------+-----+---------+-------+
2. 应用本地化表 app_localization
存储应用级的多语言信息(仅support字段,与版本无关):
+----------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+-------+ | app_id | varchar(36) | NO | PRI | NULL | | | language_code | varchar(10) | NO | PRI | NULL | | -- 如'en'、'es' | support | varchar(255) | YES | | NULL | | +----------------+--------------+------+-----+---------+-------+
- 联合主键
(app_id, language_code)确保每个应用的每种语言只有一条记录
3. 应用版本表 app_version
存储每个版本的非本地化信息(仅icon字段,与语言无关):
+--------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+-------+ | app_id | varchar(36) | NO | PRI | NULL | | | version | varchar(20) | NO | PRI | NULL | | -- 如'1.0'、'2.0' | icon | varchar(255) | YES | | NULL | | +--------------+--------------+------+-----+---------+-------+
- 联合主键
(app_id, version)确保每个应用的每个版本只有一条记录
4. 应用版本本地化表 app_version_localization
存储每个版本的多语言信息(仅description字段,同时关联版本和语言):
+----------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+-------+ | app_id | varchar(36) | NO | PRI | NULL | | | version | varchar(20) | NO | PRI | NULL | | | language_code | varchar(10) | NO | PRI | NULL | | | description | varchar(255) | YES | | NULL | | +----------------+--------------+------+-----+---------+-------+
- 联合主键
(app_id, version, language_code)确保每个应用的每个版本的每种语言只有一条记录
CRUD API实现思路
本地化信息CRUD
针对app_localization表操作,以app_id和language_code为查询/操作条件:
- 创建:插入新的
app_id + language_code组合记录 - 查询:根据
app_id和language_code获取对应support内容,或按app_id查询所有语言的support - 更新:根据
app_id和language_code更新support字段 - 删除:根据
app_id和language_code删除对应记录
版本信息CRUD
需联动app_version和app_version_localization表,以app_id和version为核心条件:
- 创建:先插入
app_version的版本基础记录,再插入对应版本各语言的app_version_localization记录 - 查询:根据
app_id和version关联查询版本的icon及各语言的description - 更新:分别更新
app_version的icon字段,以及app_version_localization对应语言的description字段 - 删除:先删除
app_version_localization中对应版本的所有记录,再删除app_version中的版本记录
示例数据说明
以某应用拥有1.0、2.0版本,需存储英文(en)、西班牙文(es)信息为例:
app表:仅存一条记录,包含id、name、developerapp_localization表:两条记录,分别为(app_id, 'en', 英文support内容)、(app_id, 'es', 西班牙文support内容)app_version表:两条记录,分别为(app_id, '1.0', 1.0版本icon地址)、(app_id, '2.0', 2.0版本icon地址)app_version_localization表:四条记录,分别为:(app_id, '1.0', 'en', 1.0版本英文description)(app_id, '1.0', 'es', 1.0版本西班牙文description)(app_id, '2.0', 'en', 2.0版本英文description)(app_id, '2.0', 'es', 2.0版本西班牙文description)
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

