我确实使用数据库(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中选择SELECT languageA,languagB
Q2:SELECT语言B,languagA从表GROUP BY languagB,languageA
在第一季度中,我获得了languageB的翻译和languageA单词的同义词,但是我缺少languageA的同义词
在第二季度中,我获得了languageA单词的languageA翻译和同义词,但是我缺少languageB的同义词
最佳答案
您有2个实体,word
和language
可以定义word
,例如
id | word
可以定义
language
,例如id | language
单词和语言之间的关系如下
对于1个唯一词,只有1种语言
对于一种独特的语言,可以有很多单词
这是一对多或多对一关系
由于
word
保持最低的关系,因此可以定义表words
和languages
,例如:语言
id | language
话
id | word | id_language
其中
id_language
是表language
的外键一个单词可以有同义词,这意味着实体
word
与自身具有关系当一个单词有很多同义词时,它们有一个共同的含义,即像常规词典中那样,最终拥有一个定义。
我们可以有一个新的实体
meaning
,例如:id | definition
可以定义
word
和meaning
之间的关系,例如:对于1个唯一的含义,可以有很多单词(同义词)
对于一个唯一的单词,可能有很多含义(同音异义词)
这是一个多对多关系,并且表定义如下:
字词(不变)
id | word | id_language
意义
id | definition
同义词
id_word | id_meaning
其中
id_word
是表words
的外键,而id_meaning
是表meanings
的外键。该表的主键是两个外键的组合
由于表
words
与语言保持联系,因此表synonyms
将具有相同含义的词重新组合,无论其语言是什么吃的法语动词是马槽。有一个语同义词,bouffer。它们都表示同一事物“ nom nom nom”
有一个法语动词,surire的意思是“当一个代码最终起作用时”。可以通过微笑或咧着嘴笑翻译成英文
模式(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 |
View on DB Fiddle
关于mysql - 如何为带有翻译和同义词的字典建立表格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58394603/