如何设计一对多,同时多又对多的数据表?
我想做一个通过拼音的声母查找词语的词库,比如我只知道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和“向往”,“大王”等。
但缺点就是,我需要先到第一张表查询,得到结果了再去第二张表进行查询,很麻烦。
目前我想到的方案就是这两个,跪求高手给指点,有没有更好的办法?
Answers
首先,一对多只需要两张表就可以了。而多对多必然要有一个中间表。
建议你找个插件,自动把汉字转成拼音。
https://github.com/hotoo/pinyin
第一, 你的方案一 的表 和方案二的 表二 里的记录数是一样多的. 方案一不过是做了个冗余, 加了字母字段.
第二, 方案一. 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 ,商谈