如何设计一对多,同时多又对多的数据表?

我想做一个通过拼音的声母查找词语的词库,比如我只知道W就可以查询到带W这个声母的“向往”这个词。
再比如,我通过W可以找到所有以W为声母的拼音,比如wang,wen等,再通过wang找到所有带wang的词语,比如“向往”,“成者为王”等。

这些数据是一对多,同时多又对多的类型,比如w对应所有的w是声母的拼音,如wang,wen等,然后wang又对应所有的带wang的词语。那么问题来了,如何设计这个数据表呢?

  • 方案一,建一张表,类似下面所示:

ID,ShengMu,Pinyin,Words

1, W ,wang ,向往
2, W ,wang ,大王
3, W ,wan ,今晚
……
101,T ,tan ,交谈
102,T ,tan ,商谈

但缺点就是,表会非常非常长,查询速度会不会很慢?

  • 方案二,建两张表,一张存w和wang,wan等,一张存wang和“向往”,“大王”等。
    但缺点就是,我需要先到第一张表查询,得到结果了再去第二张表进行查询,很麻烦。

目前我想到的方案就是这两个,跪求高手给指点,有没有更好的办法?

阅读 5.5k
评论 2015-09-01 提问
    3 个回答
    brayden
    • 4.6k

    第一, 你的方案一 的表 和方案二的 表二 里的记录数是一样多的. 方案一不过是做了个冗余, 加了字母字段.

    第二, 方案一. shengmu 字段是不需要的. 你可以在pingyin 字段建一个前缀索引.

    https://dev.mysql.com/doc/refman/5.7/en/create-index.html

    Indexes can be created that use only the leading part of column values, using col_name(length) syntax to specify an index prefix length: 
    

    查询用:

    select Words from table where pingyin like "W%";
    

    第三, 如果你的需要仅仅是 "通过拼音的声母查找词语的词库,比如我只知道W就可以查询到带W这个声母的“向往”这个词". 那你不需要 pingin 这个字段, 也许这样就够了吧.

    ID,ShengMu,Words
    
    1, W ,向往
    2, W ,大王
    3, W ,今晚
    ……
    101,T ,交谈
    102,T ,商谈
    评论 赞赏 2015-09-02
      RunSN
      • 1.5k
      tb1
      id c1 c2
      1 w wang
      2 w wan
      3 w wen
      pk id
      uq c2
      
      tb2
      id c1  c2
      1 wang 向往
      2 wang 大王
      3 wan 玩耍
      4 wen 问候
      pk id
      
      select t1.id, t2.id, t1.c1, t2.c1, t1.c2, t2.c2 from tb1 as t1
      right join tb2 as t2 on t1.c2=t2.c1
      where t1.c1='w'
      
      评论 赞赏 2015-09-02

        首先,一对多只需要两张表就可以了。而多对多必然要有一个中间表。

        建议你找个插件,自动把汉字转成拼音。
        https://github.com/hotoo/pinyin

        评论 赞赏 2015-09-02
          撰写回答

          登录后参与交流、获取后续更新提醒