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

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

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

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

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

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

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

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

     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    10 年前

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

    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    10 年前

    一张表格,上面写着:

    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数据库可能不是完成这类任务的最佳工具。这只是一个例子。

    推荐文章