数据库多表间的联系是所有一对多关系都连上效率最高吗
1个回答
展开全部
你这个的前提是 水果个数基本固定 不超过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 ……
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 ……
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询