zoukankan      html  css  js  c++  java
  • 数据库设计

    目标与目的

    学习目标:
    • 掌握日常数据库建表操作
    • 了解表设计的规范
     
    何为表结构设计:
    • 表结构设计需要在正式进行开发之前完成
    • 根据产品需求将复杂的业务模型抽象出来
     
    项目分析

    实践课程模型:
    • 类似电商类的网站
    用户:
    1. 核心业务
    2. 非核心业务
     
    核心业务:
    • 交易相关
      • 订单详情,订单  
    • 商品相关
      • 商品类别,商品  
    非核心业务:
    • 物流
    • 供应商信息
     
    业务模型转表

    用户:   tb_account(用户表)
    商品类:tb_goods_category(商品类别表) tb_goods(商品详情表)
    交易类:tb_order_item(交易订单详情表)  tb_order(交易表)
     
    设计表的时候需要注意哪些
    • 理解各个表的依赖关系
    • 理解各个表的功能特点(字段之间的约束,索引;字段类型,字段长度)
     
    收集表属性
    用户表:
    自增属性,auto_increment
    图片不会直接存在数据库,在数据库中之后存图片的一个url地址,有专门的图片存储系统去存图片
     
     
    varchar VS text 在存储特别长的字段时
    一般从两个方面:   1.性能
                              2.存储上限
     
    varchar 最大长度65535,如果用utf8及3个字节;
    varchar最大为65535/3=21845
    65535及2的16次方
     
    网易数据类型-命名规范
    • 所有表名,字段名全部使用小写字母
    • 不同业务,表名使用不同前缀区分
    • 生成环境表名字段名要有实际意义
    • 单个字段尽量使用字段全名;多个字段名之间使用下划线分隔
     
    字段设计规范:
    • 存储空间(尽量选择能满足应用要求的最小数据类型)
    • 前瞻性(尽量使用整型代替字符型)
    • 注释,每个字段必须以COMMENT语句给出字段的作用
    • 经常访问的大字段(如blob,text)等需要单独放到一张表中,避免降低SQL效率,图片,电影等大文件数据禁止存放数据库
    • 新业务统一建议使用utf8mb4字符集(适应苹果手机的imoge表情库)
     
    用户赋权注意:
    • 理解用户到底需要什么权限
      • 普通用户只有读写权限 
      • 系统管理员具有super权限
    • 权限粒度要做到尽可能的细
      • 普通用户不要设置with  grant option 属性
      • 权限粒度:系统层面>库层面>表层面>字段层面  
    • 禁止简单密码
      • 线上密码要求随机
     
    总结

    • 理解个表间依赖关系以及功能特点
      • 字段间约束
      • 索引的选取
      • 字段类型与长度
    • 自增主键重要性
    • varchar最大长度
      • 65535/3=21845
      • 实际还要小点
    • 前瞻性与注释
    • 经常访问的大字段(blob/text)单独存放
    • 赋权限
      • 权限最小原则
      • 普通用户不要设置with grant option 属性
     
    表结构      

    --
    
    -- Table structure for table `tb_account`
    
    --
    
     
    
    DROP TABLE IF EXISTS `tb_account`;
    
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    
    /*!40101 SET character_set_client = utf8 */;
    
    CREATE TABLE `tb_account` (
    
      `account_id` int(11) NOT NULL AUTO_INCREMENT,
    
      `nick_name` varchar(20) DEFAULT NULL,
    
      `true_name` varchar(20) DEFAULT NULL,
    
      `sex` char(1) DEFAULT NULL,
    
      `mail_address` varchar(50) DEFAULT NULL,
    
      `phone1` varchar(20) NOT NULL,
    
      `phone2` varchar(20) DEFAULT NULL,
    
      `password` varchar(30) NOT NULL,
    
      `create_time` datetime DEFAULT NULL,
    
      `account_state` tinyint(4) DEFAULT NULL,
    
      `last_login_time` datetime DEFAULT NULL,
    
      `last_login_ip` varchar(20) DEFAULT NULL,
    
      PRIMARY KEY (`account_id`)
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    /*!40101 SET character_set_client = @saved_cs_client */;
    
     
    
    --
    
    -- Table structure for table `tb_goods`
    
    --
    
     
    
    DROP TABLE IF EXISTS `tb_goods`;
    
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    
    /*!40101 SET character_set_client = utf8 */;
    
    CREATE TABLE `tb_goods` (
    
      `goods_id` bigint(20) NOT NULL AUTO_INCREMENT,
    
      `goods_name` varchar(100) NOT NULL,
    
      `pic_url` varchar(500) NOT NULL,
    
      `store_quantity` int(11) NOT NULL,
    
      `goods_note` varchar(800) DEFAULT NULL,
    
      `producer` varchar(500) DEFAULT NULL,
    
      `category_id` int(11) NOT NULL,
    
      PRIMARY KEY (`goods_id`)
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    /*!40101 SET character_set_client = @saved_cs_client */;
    
     
    
    --
    
    -- Table structure for table `tb_goods_category`
    
    --
    
     
    
    DROP TABLE IF EXISTS `tb_goods_category`;
    
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    
    /*!40101 SET character_set_client = utf8 */;
    
    CREATE TABLE `tb_goods_category` (
    
      `category_id` int(11) NOT NULL AUTO_INCREMENT,
    
      `category_level` smallint(6) NOT NULL,
    
      `category_name` varchar(500) DEFAULT NULL,
    
      `upper_category_id` int(11) NOT NULL,
    
      PRIMARY KEY (`category_id`)
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    /*!40101 SET character_set_client = @saved_cs_client */;
    
     
    
    --
    
    -- Table structure for table `tb_order`
    
    --
    
     
    
    DROP TABLE IF EXISTS `tb_order`;
    
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    
    /*!40101 SET character_set_client = utf8 */;
    
    CREATE TABLE `tb_order` (
    
      `order_id` bigint(20) NOT NULL AUTO_INCREMENT,
    
      `account_id` int(11) NOT NULL,
    
      `create_time` datetime DEFAULT NULL,
    
      `order_amount` decimal(12,2) DEFAULT NULL,
    
      `order_state` tinyint(4) DEFAULT NULL,
    
      `update_time` datetime DEFAULT NULL,
    
      `order_ip` varchar(20) DEFAULT NULL,
    
      `pay_method` varchar(20) DEFAULT NULL,
    
      `user_notes` varchar(500) DEFAULT NULL,
    
      PRIMARY KEY (`order_id`)
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    /*!40101 SET character_set_client = @saved_cs_client */;
    
     
    
    --
    
    -- Table structure for table `tb_order_item`
    
    --
    
     
    
    DROP TABLE IF EXISTS `tb_order_item`;
    
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    
    /*!40101 SET character_set_client = utf8 */;
    
    CREATE TABLE `tb_order_item` (
    
      `order_item_id` bigint(20) NOT NULL AUTO_INCREMENT,
    
      `order_id` bigint(20) NOT NULL,
    
      `goods_id` bigint(20) NOT NULL,
    
      `goods_quantity` int(11) NOT NULL,
    
      `goods_amount` decimal(12,2) DEFAULT NULL,
    
      PRIMARY KEY (`order_item_id`),
    
      UNIQUE KEY `uk_order_goods` (`order_id`,`goods_id`)
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    /*!40101 SET character_set_client = @saved_cs_client */;
    
    /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
  • 相关阅读:
    前台线程与后台线程,AfxGetApp>GetMainWnd()与AfxGetMainWnd的不同 (转)
    详细解说 STL 排序(Sort) (转)
    (转)怎样从一个DLL中导出一个C++类
    HTTP协议之状态码详解(转)
    关于列表(ListCtrl)控件的界面基础知识
    C++序列化(转)
    vs2008修改Menu(菜单)资源ID的方法。
    怎样解决VC中滚动条最大滚动值不能超过32767的问题
    < Photoshop CS 专栏 >颜色(二)
    C#使用BinaryReader类读取二进制文件
  • 原文地址:https://www.cnblogs.com/Aiapple/p/5682531.html
Copyright © 2011-2022 走看看