我从事数据库(php/mySQL)工作很长时间了,但是经过两周的思考和尝试,我不得不承认我不知道如何实现我的目标。欢迎任何帮助或提示。
我有什么数据?
- A 语言中的单词及其相关同义词(如果有)以及 B 语言中的相关单词及其相关同义词(如果有)的列表。请参阅下面的示例(数据不是表格)(单词 2/4、单词 3/5/6、单词 C/D 是同义词)
languageA -->> languageB
--------------------------------------
word1 -->> wordA
word2, word4 -->> wordC, wordD
word3, word5, word6 -->> wordB
请注意,同义词的数量不限于任何数量(实际上大约是 6 个)。
我想实现什么目标:
(在 mySQL 中使用普通查询或一些 php 循环和 mySQL 查询的组合)
- A 语言中的单词及其同义词(如果有)以及 B 语言中的相关单词及其同义词(如果有)的列表。
- 反之亦然:语言 B 到语言 A。
languageA -->> languageB
--------------------------------------
word1 -->> wordA
word2, word4 -->> wordC, wordD
word3, word5, word6 -->> wordB
languageB -->> languageA
--------------------------------------
wordA -->> word1
wordB -->> word3, word5, word6
wordC, wordD -->> word2, word4
wordD, wordC -->> word2, word4
问题:
- 将数据存储在一个或多个表中并实现最小数据冗余的最佳方式是什么?
- 使用什么类型的查询(或 php 和查询的组合)可以输出上述列表?
我尝试过的:
我尝试了一些方法,例如两个表:TableA 和 TableB,其中我将 TableA.LangB 与 TableB.LangB 结合起来,如下所示:
TableA TableB
LangA | synA | LangB LangB | synB | LangA
--------------------- ---------------------
word1 | | wordA wordA | | word1
word2 | word4 | wordC wordC | wordD | word2
word4 | word2 | wordC wordD | wordC | word2
word3 | word5 | wordB wordB | | word3
word3 | word6 | wordB
最后一次尝试是使用如下所示的表格:
languageA | languageB
----------------------
word1 | wordA
word2 | wordC
word2 | wordD
word4 | wordC
word4 | wordD
word3 | wordB
word5 | wordB
word6 | wordB
(几乎)实现的目标是通过以下方式实现的:
- Q1:从表 GROUP BY languagA、languageB 中选择 languageA、languagB
- 问题 2:从表 GROUP BY languagB、语言 A 中选择语言 B、语言 A
在第一季度,我获得了 languageB 翻译和 languageA 单词的同义词,但我缺少 languageA 的同义词
在第二季度,我获得了 languageA 翻译和 languageB 单词的同义词,但我缺少 languageB 的同义词
最佳答案
您有 2 个实体,单词
和 语言
可以定义一个单词
,例如
id | word
可以定义语言
,例如
id | language
单词和语言之间的关系是这样的
- 对于 1 个唯一单词,只有 1 种语言
- 对于一种独特的语言,可以有很多单词
这是一个一对多或多对一关系
由于word
具有最低的关系,因此可以定义表words
和languages
,例如:
语言
id | language
单词
id | word | id_language
其中id_language
是表语言
的外键
一个单词可以有同义词,这意味着该实体单词
与其自身有关系
当一个单词有许多同义词时,它们有一个共同的含义,最终包含一个定义,就像在普通词典中一样
我们可以有一个新的实体含义
,例如:
id | definition
单词
和含义
之间的关系可以定义为:
- 对于 1 个唯一含义,可以有多个单词(同义词)
- 对于 1 个独特的单词,可以有多种含义(同音异义词)
这是一个多对多关系,表的定义如下:
文字(没有改变)
id | word | id_language
含义
id | definition
同义词
id_word | id_meaning
其中 id_word
是表 words
的外键,id_meaning
是表 meanings
的外键。
该表的主键是两个外键的组合
<小时/>由于表单词
保存了与语言的关系,因此表同义词
将具有相同含义的单词重新分组无论其语言如何
表示吃的法语动词是manger。有一个俚语同义词,bouffer。它们的意思都是一样的“nom nom nom”
有一个法语动词,sourire,意思是“当一个代码终于工作时”。它可以翻译成英语:微笑或微笑
架构 (MySQL v8.0)
CREATE TABLE languages
(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255)
);
CREATE TABLE words
(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
word VARCHAR(255),
id_language INT NOT NULL,
CONSTRAINT FOREIGN KEY (id_language) REFERENCES languages(id)
);
CREATE TABLE meaning
(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
definition VARCHAR(255)
);
CREATE TABLE synonym
(
id_word INT NOT NULL,
id_meaning INT NOT NULL,
CONSTRAINT FOREIGN KEY (id_word) REFERENCES words(id),
CONSTRAINT FOREIGN KEY (id_meaning) REFERENCES meaning(id),
PRIMARY KEY (id_word, id_meaning)
);
INSERT INTO languages (name) VALUES ('French'), ('English');
INSERT INTO words (word, id_language) VALUES ('Manger', 1), ('Bouffer', 1), ('Sourire', 1), ('To eat', 2), ('To smile', 2), ('To grin', 2);
INSERT INTO meaning (definition) VALUES ('Nom nom nom'), ('When one code is finally working');
INSERT INTO synonym (id_word, id_meaning) VALUES (1, 1), (2, 1), (3, 2), (4, 1), (5, 2), (6, 2);
<小时/>
查询#1
SELECT w.word AS 'Word',
l.name AS 'Language',
m.definition AS 'Definition'
FROM words w
INNER JOIN languages l
ON w.id_language = l.id
INNER JOIN synonym s
ON w.id = s.id_word
INNER JOIN meaning m
ON s.id_meaning = m.id
ORDER BY m.definition;
输出
| Word | Language | Definition |
| -------- | -------- | -------------------------------- |
| Manger | French | Nom nom nom |
| Bouffer | French | Nom nom nom |
| To eat | English | Nom nom nom |
| Sourire | French | When one code is finally working |
| To smile | English | When one code is finally working |
| To grin | English | When one code is finally working |
<小时/>
关于mysql - 如何构建包含翻译和同义词的词典表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58394603/