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


我想做一个通过拼音的声母查找词语的词库,比如我只知道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和“向往”,“大王”等。
    但缺点就是,我需要先到第一张表查询,得到结果了再去第二张表进行查询,很麻烦。

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

数据库 数据库设计 数据

愛dr約綀 9 years, 5 months ago

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

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

三倍速的番茄 answered 9 years, 5 months ago


 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'

十六夜鈴仙 answered 9 years, 5 months ago

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

第二, 方案一. 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 ,商谈

Xuper answered 9 years, 5 months ago

Your Answer