2023年7月27日发(作者:)
数据库设计之⼀——设计策略博客结构⽤简单通俗的话来记录⾃⼰对架构的理解1.前⾔Android中提供了⼀个占⽤内存极⼩的关系型数据库-SQLite,SQLite是⼀种嵌⼊式的数据库引擎,专门适⽤于资源有限的设备上进⾏适量的数据存储。它是我们持久性存储关系型的数据⾸选。但是,如何⾼效地设计数据库,却是⼀门让⼈挖空⼼思的课程。对于⼤部分的安卓开发者⽽⾔,数据库往往只是简单使⽤,并不会处理⼤量的数据,即使处理⼤量数据,如果不是外界强迫要求性能,那么⼤家也不会深⼊去研究数据库的优化与设计。实际上,这种场景就导致了现在安卓领域,实际上数据库优化,并没有全⾯系统的⽂章。实话实说,之前,本⼈也是只关注架构设计,对数据库设计并没有⼗分在意。在最近的⼯作中,对冷启动速度以及⼤数据的保存,查找接触更多,所以,结合个⼈开发经验,把实操总结归类,就有了这篇⽂章2.思维脑图3.衡量与范式1.衡量标准简⽽⾔之,⼀个数据库表设计的是否合理,衡量的标准实际上和我们的架构设计⼀致的。是否是数据操作性能⾼,是否便于拓展,是否便于维护。这⾥就不⼀⼀展开来聊。2.范式(原则)这个范式其实和设计模式的设计原则是⼀样的。因为Sqlite也是属于关系型数据库,因此,也是遵守这些规则的。1.原⼦性简⽽⾔之,每个字段不可再拆分。第⼀范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原⼦值,就说明该数据库表满⾜了第⼀范式。第⼀范式的合理遵循需要根据系统的实际需求来定。⽐如某些数据库系统中需要⽤到“地址”这个属性,本来直接将“地址”属性设计成⼀个数据库表的字段就⾏。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就⾮要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进⾏存储,这样在对地址中某⼀部分操作的时候将⾮常⽅便。这样设计才算满⾜了数据库的第⼀范式,如下表所⽰。上表所⽰的⽤户信息遵循了第⼀范式的要求,这样在对⽤户使⽤城市进⾏分类的时候就⾮常⽅便,也提⾼了数据库的性能。2.唯⼀性简⽽⾔之每个字段只与主键相关第⼆范式在第⼀范式的基础之上更进⼀层。第⼆范式需要确保数据库表中的每⼀列都和主键相关,⽽不能只与主键的某⼀部分相关(主要针对联合主键⽽⾔)。也就是说在⼀个数据库表中,⼀个表中只能保存⼀种数据,不可以把多种数据保存在同⼀张数据库表中。⽐如要设计⼀个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所⽰。订单信息表这样就产⽣⼀个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,⽽仅仅是与商品编号相关。所以在这⾥违反了第⼆范式的设计原则。⽽如果把这个订单信息表进⾏拆分,把商品信息分离到另⼀个表中,把订单项⽬表也分离到另⼀个表中,就⾮常完美了。如下所⽰。3.避免冗余性简⽽⾔之就是每列都和主键列直接相关,⽽不是间接相关,避免数据的冗余性第三范式需要确保数据表中的每⼀列数据都和主键直接相关,⽽不能间接相关。⽐如在设计⼀个订单数据表的时候,可以将客户编号作为⼀个外键和订单表建⽴相应的关系。⽽不可以在订单表中添加关于客户其它信息(⽐如姓名、所属公司等)的字段。如下⾯这两个表所⽰的设计就是⼀个满⾜第三范式的数据库表。4.设计策略1.建库1.分库分库策略实际上有两⽅⾯的考虑:第⼀个⽅⾯就是区分常⽤表和⾮常⽤表。⽐如,在我们的应⽤中,区分了配置库()和逻辑库()。配置库主要是⼤量配置数据,查询和保存操作频率低,⽽逻辑库则进⾏频繁数据的更新。这样有利于读取数据库表的效率提升。效率提⾼多少,可以做个数据对⽐:2.有利于清晰划分数据2.预连接这个是在实践出真知的。进⼊⼀个页⾯,要进⾏数据库数据内存池话,⾸次进⼊的时候因为要建⽴链接,往往耗时都在20ms+,如果在⾸页空闲时进⾏预链接,速度将提升到1ms+。这个的性能提升还是显⽽易见的。2.建表1.分表1.将动态数据(频繁变化)和静态数据进⾏分开建表,可以提升查询的效率,当然,在客户段,因为要外键操作,所以,⽤的并不多。2.避免字段的冗余2.字段合理数据库只⽀持五种数据类型:最初接触的时候,看到了BLOB数据保存了图⽚的⼆进制数据,对,你没有看错,为了读取速度,把图⽚的⼆进制字节流保存在数据库中。但是,这也会涉及⼀个问题,经常出现⼤图⽚引起OOM3.保存数据分批事务处理⽐如保存1W个数据到数据库,每50条数据作为⼀个事务进⾏保存数据库。性能提⾼80%,同时,更为关键的是,可以增强容错率,应对在⼤数据操作过程中出现异常的场景。逐条插⼊7.52min批量插⼊5.04min事务批量2.31ms4.查询数据1.减少查询次数复合条件查询优于多次查询2.能查询⼀列只查询⼀列慎⽤select *3.能查询⼀⾏只查询⼀⾏减少数据的查询梁5.更新数据6.删除数据1.异步删除要删除数据库中1万条数据,可以设计⼀个字段status,全部删除时,⾸先更新状态,同步到UI,然后异步线程进⾏删除5.多线程注意事项1.单修改多查询数据库只⽀持多线程查询,单线程的修改,多线程修改,会报锁定。6.站在巨⼈的肩膀
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690430322a348815.html
评论列表(0条)