我确实使用数据库(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个实体,wordlanguage

可以定义word,例如

id | word


可以定义language,例如

id | language


单词和语言之间的关系如下


对于1个唯一词,只有1种语言
对于一种独特的语言,可以有很多单词


这是一对多或多对一关系

由于word保持最低的关系,因此可以定义表wordslanguages,例如:

语言

id | language




id | word | id_language


其中id_language是表language的外键



一个单词可以有同义词,这意味着实体word与自身具有关系

当一个单词有很多同义词时,它们有一个共同的含义,即像常规词典中那样,最终拥有一个定义。

我们可以有一个新的实体meaning,例如:

id | definition


可以定义wordmeaning之间的关系,例如:


对于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/

10-13 07:39