操作系统

当前位置:金沙棋牌 > 操作系统 > with嵌套的渴求式加载,如何创建合理的数据库表

with嵌套的渴求式加载,如何创建合理的数据库表

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-22 11:10

今天在通过需求表A查询场地类型表B,然后通过表B的场地类型id去查询表C场地类型名的时候遇到了一个小的问题。

在创建数据库表之前,首先要考虑清楚以下几点:

需求表A的字段:id、user_id 、name等等;

1、程序要实现哪些功能?

规划好整体功能模块,例如我要做一个任务系统,那么需要这些功能:我接收的任务,我发布的任务,创建任务,编辑任务,删除任务,搜索任务,数据统计,用户管理,任务类型管理,客户管理,管理员管理,系统设置。

中间表B的字段:id、appeal_id、field_type_id;

2、细化每个功能,设计功能页面,或者写出静态页面

这一步设计或者写静态页面,是程序最终的一个表现形态。

场地类型表C的字段:id、display_金沙棋牌,name等等;

3、设计数据库

根据前两个步骤,考虑数据库设计:
a、需要创建几张表?
b、每张表需要哪些字段?
存在一对多关系的表,先建立好主从表中必备字段,然后考虑优化搜索需要用到的字段
c、每个字段是否有默认值?
d、主键是什么?
一般主键都只有一个,联合主键很少使用
e、是否需要建立索引?
主键字段默认是唯一索引。
如果需要建立非聚集索引(非唯一索引):
本着尽可能少的建立索引的原则,我们去考虑索引字段。
因为索引能够提升搜素效率,但是会影响写操作的效率,因为每次写操作,都会更新索引表。

Appeal模型中:

建索引有几条原则:

假如有学校、班级和学生,schoolid、banji、xuesheng三张表。
School:schoolid、name
Banji有字段:banjiid schoolid bjname
Xuesheng有字段:id schoolid banjiid name age

public function appeal_field_type() {
   return $this->hasMany('AppModelsAppealFieldType');
}

public function field_type() {
    return $this->belongsTo('AppModelsFieldType')->select('id','display_name');
}

Appeal控制器中;

$result = Appeal::select('id','name')
    ->where('id',$id)
    ->with('appeal_field_type.field_type')
    ->first();
以上都是看了laravel学院的嵌套的渴求式加载,然后按照他上面说的方法,模仿着写了一下,结果这个方法一直报错,报“field_type”方法不存在,一开始琢磨不透,看了一遍右边appeal模型,检查过单词有没有写错,有没有引入模型,等等,都检查过了,我就觉得不对啊,我就是严格按照学院上写的嵌套的渴求式加载,但是就是不对。后来,我想,既然appeal_field_type这个方法是通过关联模型访问的,那么是不是他还是要通过AppealFieldType这个模型,去访问field_type这个方法,果然,我把fiel_type方法写到AppealFielType模型中,再去访问的时候,成功~
最终成功的结果:
Appeal模型中:

public function appeal_field_type() {
   return $this->hasMany('AppModelsAppealFieldType');
}

AppealFieldType模型中:

public function field_type() {
    return $this->belongsTo('AppModelsFieldType')->select('id','display_name');
}
1、目前记录数量在100条以下,禁止建立索引。

Appeal控制器中:

2、有关联关系,且经常要被where筛选的字段要加索引。如:Banji中schoolid字段,Xuesheng中schoolid、banjiid字段
$result = Appeal::select('id','name')
    ->where('id',$id)
    ->with('appeal_field_type.field_type')
    ->first();

主要原因是学院上这一块讲的不是特别清楚,不知道后面的那个方法应该写在哪个控制器中,所以出现了这么一个困扰萌新的问题~
Sql语句中:

A and B and C,B会在A的筛选结果中搜索,C会在A and B的筛选结果中搜索。ABC的顺序建议是:能使筛选结果最小化的条件放在前面;带索引的字段放在前面;
A or B or C,假如ABC中有一个字段没有建立索引,那么就会引起全表扫描。

有无索引int类型字段千外级数据执行耗时测试:
//id是主键,即使用户id是最后要条数据,耗时也是0ms
select * from A_user where id=用户id
//roleid不是索引,会全表搜索,耗时在800ms左右
select * from A_user where roleid=角色id

本文由金沙棋牌发布于操作系统,转载请注明出处:with嵌套的渴求式加载,如何创建合理的数据库表

关键词:

上一篇:没有了

下一篇:没有了