MySql字段类型/三范式/数据库架构

MySql 字段类型有那些

int、varchar 、char 、datetime、 timestamp、 text、 blob 、decimal。

其中,数据库建表时应该选择最小、最简单的数据类型为标准。

blob用来存储二进制数据,没有排序规则和字符集;text用来存储字符串数据,有排序规则和字符集;对于Memory而言,他不支持这两种数据类型,会导致某些查询使用临时表。

对于varchar、char,varchar存储时有产生碎片的可能,因为在更新操作时有可能新的字符串长度比原来的更长,如果页内没有更多的空间存储,MyISAM会将行拆成不同的片段存储;而InnoDB会分裂页来使行可以放进页内。

而且需要额外的1或者2个字节(255个字节)来存储字符串的长度;

所以,对于频繁变更的字段以及非常短的列,都适合使用char而不是varchar来存储数据;而且,对于可变长字符串,其在临时表和排序时可能悲观的按照最大长度分配内存。

数据库设计的三范式

范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。

三范式

  • 第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列).

例如:

user表的联系方式(contact)这一列分为电话号(phone)和地址(address)两列,这样才符合第一范式。

  • 第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)

  • 第三范式(3NF):满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B, B ->C, A -> C)。

完全的遵循三范式会导致执行过多的关联操作,而反范式会导致执行过大的distinct操作。

每个属性不可再分;非主属性依赖于主属性;消除传递依赖

数据库架构

常见的有主从同步、读写分离架构、水平切分架构

读写锁耦合在一起,对读写性能都不高。

  • 读写分离,解决“数据库读性能瓶颈”问题
  • 水平切分,解决“数据库数据量大”问题