【发布时间】:2015-06-09 12:25:11
【问题描述】:
我是 SQL 的初学者,正在尝试设计一个查询。我使用我的数据库来存储不同字符串的翻译(用于不同产品的 UI)。
我的数据库包含 4 个表:
- 字符串(id、名称、lang_id):
“lang_id”是“语言”表中的 FK 引用“id”
复制(id、姓名)
语言(id、姓名)
翻译(id、string_1、string_2):
“string_1”和“string_2”是从“String”表中引用“id”的FK。
我所有的表都使用 InnoDB 引擎,除了 Copy 表使用 MyISAM 引擎并在“名称”列上包含全文索引。我有触发器来确保“字符串”和“复制”表中的字符串 ID 匹配。
用例:
用户想要将新的字符串(还没有在数据库中)从英语翻译成德语。用户希望找到字符串“Login”的参考翻译,以便重复使用并保持一致性。
用户提交数据(例如使用网站上的表单):
- 输入语言:英语
- 输出语言:德语
- 字符串:登录
用户想要得到什么:
来自 DB 的所有字符串,其中包含单词“Login”及其对应的德语翻译。
到目前为止我所拥有的: 英文ID为1, 德语的ID是2
SELECT * FROM String s
JOIN (SELECT id FROM Copy
WHERE MATCH (name) AGAINST ('Login')) r
ON s.id = r.id WHERE s.language = 1
返回所有英文字符串,包含“Login”。
我不知道下一步该做什么,我想我应该以某种方式将这个结果与“翻译”表结合起来。
有人能指引我正确的方向吗?
附:我正在使用 MySQL 5.5(这就是我有这个“复制”表的原因),我知道使用搜索引擎来完成这些任务可能会更好,但我想在没有搜索引擎的情况下完成它。
提前谢谢你。
编辑
例如我有:
String Translation Language
|id| name | lang_id | |id| string_1 | string_2 | |id| name |
------------------------- -------------------------- -----------
| 1| Good | 1 | |1 | 1 | 2 | | 1| En |
| 2| Gut | 2 | |2 | 4 | 3 | | 2| De |
| 3| Good day | 1 |
| 4| Guten Tag| 2 |
我搜索“Good”,输入lang“En”,输出lang“De”,想要得到结果:
| Good | Gut |
| Good day | Guten Tag |
编辑
【问题讨论】:
-
如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
-
你能为你的测试数据提供一个插入脚本吗?顺便说一句,你的桌子上只有英语和德语吗?否则这将是一个非常低效的数据库设计(您翻译的每个字符串都必须与翻译表中的所有其他语言连接)
-
Translation表是否可以同时保存string_1或string_2中英文单词的ID,或者它总是其中之一? -
@MartinParkin 总是其中之一,可以在
string_1或string_2。 -
@JeremyC。很多语言。对不起,我明天会提供脚本,它们在我的工作电脑上。基本上,我只是将英文字符串和所有翻译分别插入
String,然后将它们之间所有可能的连接插入Translation,而不重复。