发表于: 2017-07-24 16:13:36
2 984
今天完成的:
设计项目DB,通过复盘评审
收获:
1.子查询和表关联查询的效率问题
①表关联的效率要高于子查询,因为子查询走的是笛卡尔积
②表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
select里子查询一个字段的话没问题,但如果子查询中有多个字段,会后成一种类似嵌套循环的查询,外表查询一次,子表就要进行多次查询。另外还有一种查询,使用in关键字,in后面的字段如果没建索引,会需要全表查询。因此最好使用联表查询以提高性能。
2.单表查询和表关联查询的效率问题
【强制】 超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致;多表关联查询 时,保证被关联的字段需要有索引。 说明:即使双表 join 也要注意表索引、SQL 性能----alibaba规约
单表查询相对于关联查询的优点:
大多数情况下可以使用关联查询提高效率,但最好在关联关键字段加索引优化。如果表连接数超过3张就要考虑单表了。萝卜多项目里数据量太少了,甚至加不加索引都不会影响效率,所以没什么影响。
3.多对多表关系设计方案
复盘项目中公司和标签是多对多关系。
①建立第三个表--公司/标签关系表,用一张关系表连接两张信息表。
关系表中保存公司id和标签id。便于表的维护与重复利用。类似:
由于标签tag和公司的变动较多,这部分使用外键来约束数据的完整性。外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的“参照完整性”的数据库实现方式。
在关系表中建立公司表和tag表的外键,并建立索引。
好处:1.当公司或tag的id变动时,关系表自动调整关系。
2.当公司或tag被删除时,关系表同步删除关系。
问题:复盘项目可以使用一堆外键,级联删除或更新很方便。但外键的约束性太强,对性能也有影响。而且一般公司在删除数据时并不是真正的删除数据,而是设置该数据失效。
4.索引的建立原则
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响; 以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大
感觉项目里数据量太低,完全不需要建立索引。但根据上面的原则,可以在连接字段上建立索引,连接字段一方为主键,另一方加普通索引
5.DB设计,还需改动
公司表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
公司id | co_id | bigInt | — | 主键 | 非空 | 无需索引,主键自带索引 | |||||
公司名称 | co_name | varchar | 50 | 非空 | |||||||
公司标语 | co_slogan | varchar | 50 | 非空 | |||||||
公司人数 | co_number | int | 10 | 非空 | |||||||
公司介绍 | co_description | varchar | 255 | 非空 | |||||||
公司logo | co_logo | varchar | 120 | 非空 | |||||||
省级所属地区1 | co_areaProvince | varchar | 10 | 非空 | |||||||
地级所属地区2 | co_areaCity | varchar | 10 | 非空 | |||||||
所属行业 | co_profession | varchar | 20 | 非空 | |||||||
融资规模 | co_financing | varchar | 10 | 非空 | |||||||
认证状态 | co_accreditation | tinyInt | — | 非空 | mysql使用tinyint替代boolean,1表示true,0为false | ||||||
冻结状态 | co_frozenStatus | tinyInt | — | 非空 | mysql使用tinyint替代boolean,1表示true,0为false | ||||||
手机号 | co_telephone | int | 20 | 非空 | |||||||
公司邮箱 | co_email | varchar | 50 | 非空 | |||||||
公司详细地址 | co_address | varchar | 50 | 非空 | |||||||
公司地图 | co_map | varchar | 120 | 非空 | |||||||
创建时间 | co_createAt | bigInt | — | 非空 | |||||||
更新时间 | co_updateAt | bigInt | — | 非空 | |||||||
职位表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
职位id | position_id | bigint | — | 主键 | 非空 | ||||||
公司id | position_coId | bigint | — | 索引 | 非空 | 关联公司表,需要根据职位查询公司或反过来查询 | |||||
职业id | position_industryId | bigInt | — | 索引 | 非空 | ||||||
职位名称 | position_name | varchar | 20 | 非空 | |||||||
学历要求 | position_eduLimit | varchar | 20 | 非空 | |||||||
工作经验 | position_experience | varchar | 20 | 非空 | |||||||
薪资待遇 | position_salary | varchar | 20 | 非空 | |||||||
岗位职责 | position_duty | varchar | 120 | 非空 | |||||||
必备条件 | position_condition | varchar | 120 | 非空 | |||||||
公司福利 | position_welfare | varchar | 120 | 非空 | |||||||
是否推荐 | position_recommend | tinyInt | — | 非空 | mysql使用tinyint替代boolean,1表示true,0为false | ||||||
职业类别 | position_category | int | — | 非空 | |||||||
创建时间 | pository_createAt | bigInt | — | 非空 | |||||||
更新时间 | pository_updateAt | bigInt | — | 非空 | |||||||
职位类别表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
职业id | industry_id | bigint | — | 主键 | 非空 | 数据量过小,不建索引 | |||||
职业类别 | industry_item | varchar | 20 | 非空 | |||||||
创建时间 | industry_createAt | bigInt | — | 非空 | |||||||
更新时间 | industry_updateAt | bigInt | — | 非空 | |||||||
产品表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
产品id | product_id | bigInt | — | 主键 | 非空 | ||||||
公司id | product_coId | bigInt | — | 索引 | 非空 | 关联公司表,仅需要根据公司查产品 | |||||
产品名称 | product_name | varchar | 20 | 非空 | |||||||
产品标语 | product_slogan | varchar | 50 | 非空 | |||||||
产品logo | product_logo | varchar | 120 | 非空 | |||||||
产品简介 | product_description | varchar | 255 | 非空 | |||||||
创建时间 | product_createAt | bigInt | — | 非空 | |||||||
更新时间 | product_updateAt | bigInt | — | 非空 | |||||||
标签表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
标签id | tag_id | bigInt | — | 主键 | 非空 | 数据量过小,不建索引 | |||||
标签内容 | tag_content | varchar | 20 | 非空 | |||||||
公司/标签关系表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
关系表id | relation_id | bigInt | — | 主键 | 非空 | 数据量过小,不建索引 | |||||
公司id | relation_coId | bigInt | — | 外键 | 非空 | 指向company_id | |||||
标签id | relation_tagId | bigInt | — | 外键 | 非空 | 指向tag_id | |||||
article表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
文章id | article_id | bigInt | — | 主键 | 非空 | ||||||
文章标题 | article_title | varchar | 20 | 非空 | |||||||
文章创建者 | article_builder | varchar | 20 | 非空 | |||||||
文章状态 | article_status | tinyInt | — | 非空 | |||||||
文章类型 | article_type | varchar | 20 | 非空 | |||||||
文章图片 | article_picture | varchar | 120 | 非空 | |||||||
跳转链接 | article_url | varchar | 120 | 非空 | |||||||
创建时间 | article_createAt | bigInt | — | 非空 | |||||||
修改时间 | article_updateAt | bigInt | — | 非空 | |||||||
后台账户表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
账户id | account_id | bigInt | — | 主键 | 非空 | ||||||
账户名 | account_name | varchar | 20 | 非空 | |||||||
账户密码 | account_password | varchar | 20 | 非空 | |||||||
账户角色 | account_role | int | — | 非空 | |||||||
创建时间 | account_createAt | bigInt | — | 非空 | |||||||
更新时间 | account_updateAt | bigInt | — | 非空 | |||||||
*********************************************************************************************************************************************************************** | |||||||||||
角色表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
角色id | role_id | bigInt | — | 主键 | |||||||
角色名 | role_name | varchar | 20 | ||||||||
角色权限 | role_authority | int | — | ||||||||
创建时间 | role_createAt | bigInt | — | ||||||||
更新时间 | role_updateAt | bigInt | — | ||||||||
角色权限主表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
主权限id | authority_id | bigInt | — | 主键 | |||||||
主权限名 | authority_name | varchar | 20 | ||||||||
创建时间 | authority_createAt | bigInt | — | ||||||||
更新时间 | authority_updateAt | bigInt | — | ||||||||
角色权限子表 | |||||||||||
描述 | DB字段名 | DB类型 | DB长度 | java字段名 | java类型 | 约束 | 索引 | 非空 | 默认值 | 注释 | |
子权限id | authority2_id | bigInt | — | 主键 | |||||||
子权限名 | authority2_name | varchar | 20 | ||||||||
创建时间 | authority2_createAt | bigInt | — |
遇到的问题:
1.在考虑要不要使用公司的DAL,优点是提供了用hibernate封装起来的大量api,不需要自己写太多sql语句,类似mybatis提供的mybatis gererator,代码生成功能很强大。但离开公司之后就永远用不到了,如果是手写mybatis的话,大量接口会很浪费时间,而且会用到联表查询和动态查询,sql较为复杂。而且不用dal的话,似乎后面自动生成的比如rmi全部都要自己写。还需考虑。
2.没有前端的话怎么约定接口?不能一直等他吧
明天的计划:
读原型,定义接口,确定原型中元素的关系
评论