小型电商网站的数据分析和设计(一)

KinglyJn      2017-08-05

需求分析 -> 逻辑设计 -> 物理设计-> 维护和优化

需求分析-核心模块

  • 用户模块

    用于记录用户的注册信息,包括用户名、密码、手机、邮箱、身份证号、地址、姓名、昵称等。

    可选的唯一标识属性:用户名、身份证、电话。

    存储特点:随着线上数据的增加,需要永久保存。

  • 商品模块

    用于记录网站中所销售的商品信息,包括商品的编码、商品名称、商品描述、商品类型、商品供应商名称、重量、有效期、价格等。

    可选的唯一标识属性:商品名称-供应商名称、商品编码。

    存储特点:对于下线商品可以存储归档。

  • 订单模块

    用于存储用户订购商品的信息,如订单号、用户姓名、手机、收货地址、商品编号、商品名称、数量、价格、订单状态、支付状态、订单类型等。

    可选的唯一标识属性:订单号。

    存储特点:永久存储(分库、分表存储)。

  • 购物车模块

    用于保存用户及用户购物时所选的商品,包括用户名、商品编号、商品名称、商品价格、商品描述、商品分类、商品数量等。

    可选的唯一标识属性:用户名-商品编号-加入时间、购物车编号。

    存储特点:不永久存储(设置归档、清理规则)。

  • 供应商模块

    用于保存所销售商品的供应商的信息,包括供应商编号、供应商名称、联系人、电话、营业执照、地址、法人等。

    可选的唯一标识属性:供应商编号、营业执照号

    存储特点:永久存储


逻辑设计-简单ER图

  • 将需求转化为数据库的逻辑模型
  • 通过ER图的形式对逻辑模型进行展示
  • 尽量做到同所选用的具体的DBMS无关


物理设计

  • 选择合适的DBMS(Orcle、SQLServer、Mysql、PgSQL…)

  • 定义数据库、表、字段、索引、视图、函数和触发器的命名规范

  • 选择合适的字段类型(优先性:数字 > 日期或二进制 > 字符串,对于相同级别尽量使用占用空间小的类型)

  • 反范式化设计(为了提高效率而适当保持库表数据的冗余)

  • 选择主键:

    • 区分业务主键和数据库主键

      业务主键主要用于标识业务数据和进行表之间的关联,数据库主键为了优化数据存储,InnoDB会生成6个字节的隐含主键

    • 根据数据库的类型考虑主键是否需要顺序增长

      有些数据库是按照主键的顺序存储数据的

    • 主键的字段类型所占的空间要尽可能的小

      对于使用聚集索引式存储的表,每个索引之后都会附件主键信息

  • 避免使用外键约束,以减少对物理外键的维护成本,和每次增查改查去检查是否符合外键约束的成本。

  • 避免使用触发器。不同DBMS触发器的定义方式可能不同,这增加了系统的维护成本。

  • 严禁使用预留字段(没啥意义)。


维护和优化

  • 维护数据字典

    select * from information_schema.tables where table_schema='test';
    select * from information_schema.columns where table_schema='test' and table_name='user_03'; 
    
  • 维护索引

    通常需要对经常出现在 where、group by、order by子句中的字段建立索引以提高数据检索的效率。

  • 维护表结构

  • 在适当的时候对表进行垂直拆分和水平拆分

    • 垂直拆分,将一张表中经常读写的字段放在一张表中,不经常读写的字段放在另一张表中
    • 水平拆分,将1000万数据量的表拆分成10个100万数据量的表


[注]

INF:库表的所有字段都是单一不可再分的,即第一范式要求数据库中的表都是二维表。

2NF:库表中不能存在非关键字段对任意候选关键字段(如唯一键或外键)的[部分]函数依赖,可以通过表拆分来设计。

3NF:库表中不能存在非关键字段对任意候选关键字段的[传递]函数依赖。同样可通过表拆分来符合3NF的要求。

BCNF:库表中不能存在[任何字段]对任意候选关键字段的[传递]函数依赖。同样可通过表拆分来符合3NF的要求。


Tags:


Share: