Mysql 如何在SQL中存储本质上是绑定到唯一值的列表的数据

Mysql 如何在SQL中存储本质上是绑定到唯一值的列表的数据,mysql,sql,list,store,synonym,Mysql,Sql,List,Store,Synonym,这个问题可能已经被问了一千次了,但我不知道如何在谷歌中表达出来,所以我没有得到任何好的答案 假设我在SQL中有一个表“words”,它在每行的第一列中存储一些单词。我想在这里做的是存储该单词的所有同义词,并将它们链接到第一列中的该单词。例如,如果我有“愤怒”这个词,我想将“疯狂、痛苦、愤怒、愤怒、恼怒”等词与这个词联系起来,因此如果我想获得SQL查询的所有同义词,我可以很容易地做到这一点 据我所知,试图在单元格中存储列表是不可能的。我能想到的唯一一件事就是为每个同义词都设置一个“愤怒”的行条目。

这个问题可能已经被问了一千次了,但我不知道如何在谷歌中表达出来,所以我没有得到任何好的答案

假设我在SQL中有一个表“words”,它在每行的第一列中存储一些单词。我想在这里做的是存储该单词的所有同义词,并将它们链接到第一列中的该单词。例如,如果我有“愤怒”这个词,我想将“疯狂、痛苦、愤怒、愤怒、恼怒”等词与这个词联系起来,因此如果我想获得SQL查询的所有同义词,我可以很容易地做到这一点


据我所知,试图在单元格中存储列表是不可能的。我能想到的唯一一件事就是为每个同义词都设置一个“愤怒”的行条目。但是如果一个单词有很多同义词,或者我有很多单词,感觉会有很多条目(每个单词都有很多不必要的重复)。有没有比这更好的实践来实现我的目标?

您使用两个表,每个表对应一个定义了外键关系的实体。这些表看起来像:

create table words (
    WordId int not null primary key auto_increment,
    Word varchar(255)
    . . .
);

create table synonyms (
    SynonymId int not null primary key auto_increment,
    WordId int not null,
    Synonym varchar(255),
    . . .
    constraint fk_wordid foreign key (WordId) references Words(WordId)
);
如果同义词必须是单词,则应使用第二个表中的id:

create table synonyms (
    SynonymId int not null primary key auto_increment,
    WordId int not null,
    SynonymWordId int not null,
    . . .
    constraint fk_wordid foreign key (WordId) references Words(WordId),
    constraint fk_synonymwordid foreign key (SynonymWordId) references Words(WordId)
);

我也会用两张桌子,但我的第二张桌子和戈登的不同

 table word
 wordID  int pk
 word varchar
 other fields

table synonym
wordID int FK to word
synonymID int FK to word
pk is both fields
愤怒的同义词查询

select s.word
from word w join synonym sy on w.wordID = sy.wordID
join word s on sy.synonymID = s.wordID
where w.word = 'angry'
有文字的表格:

CREATE TABLE words (
  id integer PRIMARY KEY,
  word varchar(100) NOT NULL
);
INSERT INTO words VALUES (1,'angry'), (2,'mad'), (3,'bitter'),
(4,'enraged'), (5,'furious'), (6,'irritated'),
(7,'nice'), (8,'pleasant'), (9,'cute');
具有同义词组的表

CREATE TABLE synonymgroups (
  id integer PRIMARY KEY,
  description varchar(100)
); 
INSERT INTO synonymgroups VALUES (1,'synonyms for "angry"'),
(2,'synonyms for "nice"');
和一个具有组字映射的表

CREATE TABLE synonyms (
  synonymgroupid integer NOT NULL REFERENCES synonymgroups,
  wordid integer NOT NULL REFERENCES words,
  PRIMARY KEY (synonymgroupid,wordid)
); 
INSERT INTO synonyms(synonymgroupid,wordid) VALUES (1,1), (1,2), (1,3),
(1,4), (1,5), (1,6), (2,7), (2,8), (2,9);
查找单词“mad”的所有同义词:


SQL数据库可能不是完成这类任务的最佳工具。这只是一个例子

在使用合成主键和复合主键的问题上,我们可能总是存在分歧。这两种方法都有各自的优点。干杯。当两个人意见不同时,你唯一能确定的是每个人都有能力形成一个意见。
SELECT s.wordid, w.word, s.synonymgroupid, sg.description
FROM synonyms s
  JOIN words w ON w.id=s.wordid
  JOIN synonymgroups sg ON sg.id=s.synonymgroupid
WHERE s.synonymgroupid IN (
  SELECT synonymgroupid
  FROM synonyms
  JOIN words ON words.id=synonyms.wordid
  WHERE words.word='mad'
);