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

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

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列进行索引,不过我不建议。

时间: 2025-01-21 11:53:49

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

数据库-createtable创建表时出错

问题描述 createtable创建表时出错 strCommand.Format("CREATE TABLE file_info (NAME TEXT,TYPE TEXT,TIME TEXT,PATH TEXT)"); 这句显示字段定义语法错误 该怎么改 解决方案 用的什么数据库,是否支持TEXT类型,另外,name time是否是关键字,需要转义. 解决方案二: 看上去可能是字段名称跟关键字冲突了.换个名字. 解决方案三: 这样试试: strCommand.Format("

对于myeclipse中hibernate项目,当数据库设计发生变化时。。。

问题描述 对于myeclipse中hibernate项目,当数据库设计发生变化时... 我想请问一下当数据库的设计发生变化时(比如添加了某些列),怎样更新在myeclipse项目中使用hibernate产生的配置?或者只能自己改? 解决方案 有专门的生成各个文件的插件,只有model中添加了相应的字段,就会生成.不用插件的话就只能自己改了.

sql server 2008 建表时不能输入空值

问题描述 在sqlserver2008建表时,有语文列,数据类型为float,建好后,在录入"语文"成绩时整数.小数都能录入,就是空值不能录入(不是NULL),因为有没有考试的"语文"成绩要空着,空着的自动为0,求解??? 解决方案 解决方案二:设置Defaultvalue成0ALTERTABLE[dbo].[Test]ADDCONSTRAINT[DF_Test_English]DEFAULT((0))FOR[English]GO[dbo].[Test]:表名[DF

如何将数据写入到数据库中的表中(c#连接sql数据库)

问题描述 我们使用c#连接数据库时,例如插入一条记录时,数据会被写调入数据缓冲区中,但并没有从数据缓冲区中写入到数据库的表中.当打开数据库中的表时,插入的数据并没显示在数据库的表中.如何才能真正把数据插入表中.希望大家多多指点. 解决方案 解决方案二:参考下SqlConnectionconn=newSqlConnection("DataSource=.;InitialCatalog=trace;IntegratedSecurity=True");conn.Open();SqlDataA

SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)_MsSql

当我们需要批量删除数据库中的表时,对于单个删除一些表是否感到烦躁,厌倦,干脆写个脚本用得了. 本脚本使用游标循环删除,对于数量比较小,用游标暂不会造成恶劣影响. 复制代码 代码如下: DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ONLY FORSELECT name FROM sysobjects WHERE name LIKE 'PUB%' A

SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)

当我们需要批量删除数据库中的表时,对于单个删除一些表是否感到烦躁,厌倦,干脆写个脚本用得了. 本脚本使用游标循环删除,对于数量比较小,用游标暂不会造成恶劣影响. 复制代码 代码如下:DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ONLY FORSELECT name FROM sysobjects WHERE name LIKE 'PUB%' AN

update-Update 数据表时自动求如何写SQL语句呢(使用SQL Sever)?(设计触发器或存储过程吧)

问题描述 Update 数据表时自动求如何写SQL语句呢(使用SQL Sever)?(设计触发器或存储过程吧) 我有一个学生考试信息表: 考号,姓名,语文成绩,数学成绩,英语成绩,文综成绩,总成绩 (PS:默认各科成绩,总成绩都为 0)在老师登分时只会登入各个科目的成绩,我使用的是SQL Sever数据库,当老师登入各科成绩时(使用Update),如何触发自动求和?_谢谢!_ 解决方案 create trigger trig_学生考试信息表 on 学生考试信息表 for insert as be

Oracle设计表、批处理方式快速导入到数据库

环境 Oracle 11.2.0 + SQL Plus + PowerDesigner 15.1 问题 Oracle设计表.批处理方式快速导入到数据库 解决 1.首先使用PowerDesigner设计表结构.视图等

mysql-请问php与msql网站源码打包时,需要将数据库里面的表导出吗?

问题描述 请问php与msql网站源码打包时,需要将数据库里面的表导出吗? 如果不导出mysql的表,那么对方是不是就不能正确访问数据库? 现在一般怎样将数据库传给客户方呢? 解决方案 一般是做一个建库的脚本和一个install.php,用户首次运行,就执行它,它负责初始化数据库.稍微友好一些,先让用户填写相关数据库的参数. 解决方案二: 不错,不错!