• 20170105数据库表设计知识点


    20170105数据库表设计知识点

    ------指导老师    星哥

    1.PHP(MYSQL)擅长单表操作,不要做过多无谓的连接查询

    2.表字段名不要使用大驼峰命名方式,最好采用下划线,命名要和团队习惯一致,通俗易懂。外键为全表名+ID

    3.表级、字段都要有注释

    4.MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。 

    InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

    5.字符串长度要根据具体的业务场景进行合适的设置,如果不明白,多去参考大公司的规则。

    6.枚举型字段,最好设置成tintint,便于以后业务变更和拓展

    7.对于用户名和昵称,不要混淆,一个是登陆账户名,一个是显示昵称,必要的时候可以设置成两个字段。

    8.int默认是11位,不要私自设置成其他的长度。

    9.关于价格,最好以int型,展示和进行业务处理是两回事,不要混淆。

    10.关于图片地址,大小要合适,不要凭想象设置,比如京东是102位,淘宝是80位,一定要合适,以前图片存不进去。

    11.如果含有is_del,一般会有删除时间,和谁删除的,尽量是逻辑删除。避免物理删除。

    12.如果含有验证,比如邮箱,手机,最好要多一个字段来表明验证 是否成功。

    13.banner图及类似的东西,要给一个排序的字段,这样在重新排序的时候,就不用删除所有记录,重新上传了。

    14.避免数据冗余,比如评论昵称,如果昵称更改了,以前的昵称如何显示?

    15.一般来说,订单数据是不允许轻易改变的,以免用户数据更改了以后,订单状态随之改变

    16.支付和订单状态不一定要放在一起的,比如货到付款,那么写死的状态就不对了。

    17.设置tingint表示的值的时候,要参考具体的业务逻辑和其他接口的设计,不要私自设置。

    18.属性可以写活,但是不要出现不可控的现象,更麻烦

    19.对于数据,要习惯给予一个默认数据,这样在没有数据的时候读取默认值。

    20.挑一个你的SELECT语句(推荐挑选那个最复杂的,有多表联接的),把关键字EXPLAIN加到前面。可以进行表分析,根据分析来优化表

    21.当只有一行数据的时候,给予limit 1,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。 避免多余搜索

    22.要习惯为条件字段加上索引。

    23.在Join表的时候使用相当类型的例,并将其索引 

    如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。 

    而且,这些被用来Join的字段,应该是相同的类型的。例如:如果你要把 DECIMAL 字段和一个 INT 字段Join在一起,MySQL就无法使用它们的索引。对于那些STRING类型,还需要有相同的字符集才行。(两个表的字符集有可能不一样)


    state中查找company 
    $r = mysql_query("SELECT company_name FROM users 
    LEFT JOIN companies ON (users.state = companies.state) 
    WHERE users.id = $user_id"); 

    // 两个 state 字段应该是被建过索引的,而且应该是相当的类型,相同的字符集。

    24.避免 SELECT * 从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载

    25.. 永远为每张表设置一个ID 

    我们应该为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的 AUTO_INCREMENT标志。 

    就算是你 users 表有一个主键叫 “email”的字段,你也别让它成为主键。使用 VARCHAR 类型来当主键会使用得性能下降。另外,在你的程序中,你应该使用表的ID来构造你的数据结构。 

    而且,在MySQL数据引擎下,还有一些操作需要使用主键,在这些情况下,主键的性能和设置变得非常重要,比如,集群,分区……

    26.尽可能使用Not Null

    27.IP地址存成 UNSIGNED INT

    很多程序员都会创建一个 VARCHAR(15) 字段来存放字符串形式的IP而不是整形的IP。如果你用整形来存放,只需要4个字节,并且你可以有定长的字段。而且,这会为你带来查询上的优势,尤其是当你需要使用这样的WHERE条件:IP between ip1 and ip2。

    我们必需要使用UNSIGNED INT,因为 IP地址会使用整个32位的无符号整形。

    而你的查询,你可以使用 INET_ATON() 来把一个字符串IP转成一个整形,并使用 INET_NTOA() 把一个整形转成一个字符串IP。在PHP中,也有这样的函数 ip2long() 和 long2ip()。

    1 $r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";

    28.固定长度的表会更快 

    如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理

    29.垂直分割 

    “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。

  • 相关阅读:
    MySQL2
    MySQL1
    并发编程三
    并发编程二
    并发编程一
    网络基础知识
    反射和单例
    Spring mvc文件上传实现
    SpringMVC系列之SpringMVC快速入门 MVC设计模式介绍+什么是SpringMVC+ SpringMVC的作用及其基本使用+组件解析+注解解析
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/6260124.html
Copyright © 2020-2023  润新知