1.数据库设计范式
2NF:1NF的基础上面,非主属性完全依赖于主关键字
3NF:属性不依赖于其它非主属性 , 消除传递依赖
2.数据库字段选择
各类型取值范围:(m 为总长度,d为小数位数)
bit m为每一个值所占的位数,范围1-64,默认1
tinyint unsigned 取值0 to 255,signed 取值-128 to 127
bool,Boolean 同tinyint(1),0为false,非0为true
smallint unsigned 取值0 to 65535,signed取值-32768 to 32767
medumint unsigned 取值 0 to 16777215.,signed 取值 -8388608 to 8388607.
int unsigned 取值 0 to 4294967295,signed:-2147483648 to 2147483647.
bigint unsigned: 0 to18446744073709551615,signed -9223372036854775808 to9223372036854775807.
decimal(m,d) m为值的总长度,默认为10,最大65;d为小数位数,默认为0,最大30
float(m,d) signed -3.402823466E+38 to -1.175494351E-38, 0, unsigned 1.175494351E-38 to3.402823466E+38
double(m,d) signed:1.7976931348623157E+308 to -2.2250738585072014E-308, 0, unsigned:2.2250738585072014E-308 to 1.7976931348623157E+308.
float(p) p为0-24 将以float处理,25-53将以double处理
时间日期 默认以0格式表示,第一行timestamp默认为当前时间
date '1000-01-01' to '9999-12-31'
datetime '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
timestamp '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
time '-838:59:59' to '838:59:59'.
YEAR[(2|4)] 2: 70 to 69 4: 1901 to 2155,
字符串 默认为空,enum列默认为第一个值
char(m) 定长,m最大值255,默认为1。可设为char(0):存放null和空值
varchar(m) 不定长,m最大值65535
binary(m) 定长二进制
varbinary(m) 不定长二进制
tinyblob 最大值255字节
blob(m) 最大65535字节,使用2字节来记录字节数
mediumblob 最大1677725字节,3字节记录长度
longblob 最大4G字节,由参数和可用内存控制,使用4字节记录长度
tinytext 最大255字符,由具体字符集控制,使用一个字节来记录字节数
text 最大65535字符,由具体字符集控制,使用2个字节来记录字符数
mediumtext 最大1677725字符,由具体字符集控制,使用3个字节来记录字符数
longtext 最大4G字符,由具体字符集控制,使用4个字节来记录字符数
enum mysql内部用数值存储,最大可存储65535个值,每个值有且只能有enum中一个值
set 每个值为set的真子集,也可为0。最大可以有64个成员。mysql 内部使用数值存储
3.结论
- 经常变化的字段用varchar;
- 知道固定长度的用char;
- 尽量用varchar;
- 超过255字节的只能用varchar或者text;
- 能用varchar的地方不用text;
- 能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了