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

发布于 2022-09-01 17:25:55 字数 629 浏览 5 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

这个俗人 2022-09-08 17:25:55

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

第二, 方案一. 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 ,商谈
魂牵梦绕锁你心扉 2022-09-08 17:25:55
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'
幼儿园老大 2022-09-08 17:25:55

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文