天天看点

[数据库]关于设计表时应该注意的问题

如有错误欢迎大家指出。这段时间在家里,做了点修正。

1、慎重选择表名。

有两种选择:

按照多数开发语言的命名规则。比如(mycustomer)。

按照多数开源思想命名规则。比如(my_customer)。

按照咱们中国人的思想。比如(我的客户)。

第一种有个缺点,很容易忘掉大写的字母。

第二种则比较好,每个word间用下划线连接,避免遗忘。

第三种建议不要用,虽然很好记。不觉得解析这个表的时候还需要编码转化吗?我个人理解,大家可以补充。

2.  关于编码的设定。

a.             gbk/gb2312.(适用于纯中文存储)。

b.           utf8.(适用于中英文混合存储)。

c.            latin1。(适用于纯英文存储)。

d.     其他的。

3. 关于表引擎的选择。

a.                 myisam.(很多人说她的表级锁定会带来好多问题,其实只要设计好对应的表以及写好对应的sql查询就没有那么大的问题。)

b.                  innodb. (如果要用到事务,选择她不会错。至于多数人讲的master/slave结构上用innodb在master的选择是否正确,就要看你怎么用了。不能一味的疯狂使用innodb。除非你想要确保非常高可用性,

c.                  csv. (以前我写过文章,关于这个引擎。个人觉得最主要的是来存储少量数据以及从excel到mysql的转换方面会很有用。当然只要涉及到规则数据的导入,她就可以办到。)

d.                  blackhole. (觉得最完美的用处在于masetr/slave上面,并且master是一个临时的专门负责写的机器。不过缺点也很多,会与myisam或者innodb或者其他的引擎有所冲突,这点自己要做个权衡)。

e.                   memory. (应该说是myisam的兄弟了。不过在读内存总比读磁盘的速度要快。不过要注意,它不支持动态数据类型)。

f.                   federated. (典型的分布式引擎。我以前文章中有介绍。)

g.    ndb。(网络版存储引擎。因为replication 总是有延迟,所以如果系统容不得任何延迟,就用这个吧。)

   h.    folcon。(6.0后用来代替innodb的引擎。)

i.                  其他旧的以及新开发的引擎具体介绍:http://dev.mysql.com/doc/refman/6.0/en/storage-engines.html)。

4. 关于属性数据类型的选择。

a.                  int(一个字节的tinyint,两个字节的smallint,三个字节的mediumint,四个字节的int,8个字节的bigint。记住:unsigned不管你定义或者不定义,都不影响内部的存储字节大小)

b.                   少于10个字符用char是在合适不过了。(不过要记住在memory引擎里面会自动把varchar转化为char)

c.                   我一般用decimal或者numeric来代替float 或者double。因为老板要求精确的数字。如果不要求精确的,那就用float吧。速度快,占空间小。(decima、float(p)是动态存储。比如 

[数据库]关于设计表时应该注意的问题

 ecimal(10,2)占用5个字节。float占4个字节,)

d.                 blob,text,varchar(一般存放文章内容,特别是新闻网站。需要的字节数是所存储的字符长度+1。记住blob和varchar是text和char的binary类型)

e.                   enum(在一定范围内绝佳的代替varchar和char的工具,因为她只占一到两个字节。)

f.                   时间和日期类型(占3个字节的date,8个字节的datetime,4个字节的timestamp,3个字节的time,1个字节的year。)。如果要存储比如‘1983’这样的年份,用year明显比varchar或者char要节省空间。因为后者要占5个字节。

g.                  boolean(用来存储yes或者no之类的值,占用一个字节。)

h.                  关于自增字段。目前我们的项目中涉及到好多order by rand()操作。此类语句在数据库并发大的时候会造成cpu严重阻塞,持续产生数据库死锁!解决此类问题最好的办法就是利用自增字段,用程序随即生成数字序列,或者在数据库端随即生成数字序列。

i.                    关于zerofill。非常好用的前置填补0的存储,而不是用用对应个数的空串来代替。在需要前置补零的操作中int zerofill可以用来代替char或者varchr。

5.  关于默认值。

a.                  在5.0之后,只要设定字段为not null,系统自动给出默认值。对应char->’’,int->0,boolean->0等等。

b.                   在5.0之前的版本,需要手动指定默认值,否则会出现一定的异常。到时候查都不好查了。

6.  关于多数据库建立。

a.                  应该把对应的业务放在各自不同的数据库里,而不是所有业务放到一个库里面。

b.                   数据库的命名和表命名一样。

7.  关于索引。

a.                  设计表初期尽量考虑到应该建立的索引。所有建立的索引一定要测试一下,看是否有必要,否则会翻倍的减少写数据的性能。

b.                   对于只有存储0或者1的列,尽量干掉索引,单独分出两个表。一个代替0,另外一个代替1。或者在一个字段里面用emum或者char(0)或者char(1)来代替。

   ps: 最后一个要值得注意的,就是尽量所有的字段用not null。虽然mysql可以对null列进行索引,不过我不建议。