三大范式
第一范式:具有原子性
之前做开发的时候就遇到一个问题,一个列里面存储了一个Json信息,里面包含了用户,性别等信息,这就明显不符合第一范式,因为这列明显可以再拆分出来用户名,性别等其它列。
第二范式:主键列与非主键列遵循完全函数依赖关系 非主键列必须通过主键(包括联合主键)确认出来,如果某列和联合主键中的某一列相关,和其它无关,那就不符合第二范式,换句话说就是一张表只描述一个对象!!
反例:一个表既存储了部门信息,用户信息,包含了部门信息的字段,同时也包含了用户信息的字段;表的职责不清晰,一个表做了多个表的事儿!
第三范式:非主键列之间没有传递函数依赖关系 就是说非主键列不能通过其他非主键列确认出来
主键
自增ID
数据库自动增加,int/bigint/ SqlServer默认是聚集索引,聚集索引确定了表中数据的物理排序。
优点:查询效率高,其实是进行了排序,空间小;
缺点:数据迁移的成本高,不同的数据库Id会冲突;
GUID
缺点:存储空间大,没有排序,查询效率相对较差。
优点:数据迁移方便,值全球唯一。
如果对于数据的性能要求十分严格,并且这个数据库基本不可能变化,不可能有数据迁移的情况,可以使用递增ID,否则还是使用GUID
外键
描述数据关系的,规范数据关系 ;可以做数据校验;还可以做级联删除;
使用场景
如果数据精度要求高,就可以使用外键;性能会有所损耗! 其实在互联网项目开发中,一般都没有使用外键; 通过程序来限定(虚拟外键,就是不使用数据库中的外键关系做约束)