假设我有一个数据库表
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 | |
+--------------+--------------+------+-----+---------+-------+
现在我想为应用程序添加本地化和版本。
例如,我想存储不同语言的
description
和 support
字段。另外,我想为不同的版本存储不同的 description
和 icon
字段。
可翻译和版本化字段列表如下所示:
+--------------+--------------+------------+
| 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.0 和 2.0,
description
和 support
的英语和西班牙语版本,以及 1.0 和 2.0 版本的英语和西班牙语的不同 descriptions
。请注意,id
、name
和 developer
对于所有语言和版本都保持不变。
首先,我会保持
app
表的结构不变,以确保如果翻译/版本缺少条目,您有备用值。
你可以有这样一张桌子:
localized_app(id, app_id, fieldname, fieldvalue, version_id, language_id)
所以,你创建一个这样的描述条目:
(<some app id>, 'description', 'version 2.0', <some version id>, <some language id>)
像这样的图标条目:
(<some app id>, 'icon', 'slkfhkshf', <some version id>, null)
最后是这样的支持条目:
(<some app id>, 'support', skfsfks', null, <some language id>)
自然,您需要一个版本表和一个语言表。然后,你可以运行这样的东西:
select ifnull(d.fieldvalue, app.description) as my_description ...
from app
left join localized_app d
on app.id = d.app_id and d.fieldname = 'description' and d.version_id = 1 and d.language_id = 2
left join localized_app i
on app.id = i.app_id and i.fieldname = 'icon' and i.version_id = 1
left join localized_app s
on app.id = s.app_id and s.fieldname = 'support' and s.version_id = 2
在 select 子句中,我们尝试读取字段值进行描述,如果不存在,则回退到应用记录中的默认值。您可以对其他字段进行类似操作。如果您担心性能,那么,您可以使用字段 id 代替 fieldname 并创建一个新表以及外键。