mysql - 如何构建包含翻译和同义词的词典表

标签 mysql sql database-design

我从事数据库(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具有最低的关系,因此可以定义表wordslanguages,例如:

语言

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 |
<小时/>

View on DB Fiddle

关于mysql - 如何构建包含翻译和同义词的词典表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58394603/

相关文章:

具有固定列数的 MySQL Pivot 数据

database-design - Star Schema Fact 不应该存储价格 - 为什么?

具有两列组合的 SQLite 唯一键

mysql - (有点)复杂的数据库结构与简单的——带有空字段

mysql - 使用SQL获取具有相同id的最高项目

mysql - 如何在插入临时表时限制内部查询中的 select 语句

java - 如何使用Java从数据库返回单个数据?

mysql - 从结果集中读取每一行并设置值

sql - 在更新作业期间我需要 "lock"一个 SQL 表吗?

SQL:带有参数的WITH子句?