首页 养生问答 疾病百科 养生资讯 女性养生 男性养生

关于数据库多对多结构的设计和SQL语句的复杂问题!

发布网友 发布时间:2022-04-24 11:04

我来回答

2个回答

热心网友 时间:2022-04-10 09:04

你这个的前提是
水果个数基本固定
不超过10个,人的个数是不定的,无穷多个
1、不合理
效率很低,用了字符串匹配和全表扫描
都是耗时的操作
2、形成了两个百万级的大表,关联查询效率会很低
我建议三种方案,你自己试验一下哪种效率最高,因为设计和语句本身没有效率高低只说,和使用方式和数据量级别有很大的关系,几万和百万优化的策略是完全不同的
建议1:在你的第2种方案的基础上改进一下,建一个水果字典表C,给每个水果定义一个类似人员的ID号,然后表B存储变成存两个ID关联,并且这两个字段都是索引,表A的人员ID要是主键并且是唯一索引,然后语句如下:
select
*
from
表A
t
where
exists
(select
*
from
表B
where
水果ID
in
(1,3,4)
and
人员ID
=
t.人员ID)
建议2:用空间换效率,union在百万级的效率应该比or要高,所以作为第二种建议,类似于表A的表结构,每类水果都建一个表,然后喜欢这个水果的人就存入这个表,例如表-苹果,表-西瓜,里面存的是喜欢这类水果的人员ID和名称,这种方式是避免了查询,语句如下:
select
*
from
表-苹果
union
select
*
from
表-西瓜
union
select
*
from
表-香蕉
……
建议3:也是用空间换效率,不过用到了or,我估计在百万级效率会最低,在表A(不要存水果的字符串字段了)的基础上扩展10个字段,integer类型,分别对应10种水果,每个字段存0和1两个值,这10个字段都建上索引,语句如下:
select
*
from
表A
where
苹果=1
or
香蕉=1
or
……

热心网友 时间:2022-04-10 10:22

表A
id
name
1
张三
2
李四
3
赵武
4
刘七

表b
id
val
1 苹果
2
香蕉
3
石榴
4
山楂

表c
name_id
val_id
1
1
1
2
1
3
2
2
2
3
2
4

这样建表

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com