代码之家  ›  专栏  ›  技术社区  ›  Flux

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

  •  1
  • Flux  · 技术社区  · 9 年前

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

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

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

    3 回复  |  直到 9 年前
        1
  •  2
  •   Dan Bracuk    9 年前

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

     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'
    
        2
  •  1
  •   Gordon Linoff    9 年前

    您使用两个表,一个表用于具有定义的外键关系的每个实体。表格如下:

    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)
    );
    
        3
  •  0
  •   filiprem    9 年前

    一张表格,上面写着:

    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”的所有同义词:

    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'
    );
    

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