如何向 MySQL 实体添加本地化和版本

问题描述 投票:0回答:1

假设我有一个数据库表

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
对于所有语言和版本都保持不变。

mysql sql database-design localization database-schema
1个回答
0
投票

首先,我会保持

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 并创建一个新表以及外键。

© www.soinside.com 2019 - 2024. All rights reserved.