Ginew.Z 的博客

一切,为了让生活更简单、更自然

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  21 Posts :: 0 Stories :: 14 Comments :: 0 Trackbacks

#

Mysql到oracle程序迁移的注意事项(摘抄)
有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,
数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到
ORACLE的需求,应用程序也要相应做一些修改。本人总结出以下几点注意事项,希望对大家有所帮助。

1. 自动增长的数据类型处理
MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。
ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个
值赋于此字段。

CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1
MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999
INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL

2. 单引号的处理
MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串
前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

3. 翻页的SQL语句的处理
MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;PHP里还可以用SEEK定位到结果
集的位置。
ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能
用ROWNUM<100, 不能用ROWNUM>80。
以下是经过分析后较好的两种ORACLE翻页SQL语句( ID是唯一关键字的字段名 ):
语句一:
SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT
ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND
NUMROW < 100 ) ORDER BY 条件3;

语句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM
TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

4. 长字符串的处理
长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于
4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序
包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,
返回上次操作。

5. 日期字段的处理
MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库
的系统时间为SYSDATE, 精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)
年-月-日 24小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式, 可以参看
ORACLE DOC.
日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)

日期字段的数学运算公式有很大的不同。
MYSQL找到离当前时间7天用
DATE_FIELD_NAME > SUBDATE((NOW(),INTERVAL 7 DAY)
ORACLE找到离当前时间7天用
DATE_FIELD_NAME >SYSDATE - 7;

6. 空字符的处理
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。
按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判
断,如果为NULL或空字符,需要把它改成一个空格的字符串。

7. 字符串的模糊比较
MYSQL里用 字段名 like '%字符串%'
ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快
用字符串比较函数 instr(字段名,'字符串')>0 会得到更精确的查找结果

8. 程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。


有兴趣可以看MYSQL管理员指南

posted @ 2006-04-11 12:15 无风之雨 阅读(256) | 评论 (0)编辑 收藏

1、用mysql内置函数转换ip地址和数字
利用两个内置函数
inet_aton:将ip地址转换成数字型
inet_ntoa:将数字型转换成ip地址

2、用Mysql内置函数来转化unix时间(秒值)和字符串时间
from_unixtime():1144728462 -> "2006-04-11 12:07:42"
unix_timestamp():"2006-04-11 12:07:42" -> 1144728462

posted @ 2006-04-11 12:13 无风之雨 阅读(242) | 评论 (0)编辑 收藏

Improving Database Performance with Partitioning

A few years ago, I wrote an article entitled "The Foundation of Excellent Performance" (still available at http://www.tdan.com/i016fe03.htm) where I argued against the notion that SQL code was the number one contributor to performance in a database-driven system. Instead, I stated in the article that I firmly believed how good physical database design was far and away the leading component of superior database performance. In addition, I showed that Oracle's own research illustrated how poor design was the main culprit behind database downtime (planned or unplanned). In the years since then, I've not changed my stance and still think that any DBA who wants a high-performance database has got to invest in intelligent and savvy physical design to produce the kind of response times that make end users smile instead of scream.

One of the reasons I'm very excited about the release of MySQL 5.1 is that it contains a potent new weapon for designing supercharged databases that any MySQL DBA should quickly learn how to use and exploit. By smartly using the new 5.1 partitioning feature, a DBA can oftentimes dramatically improve the performance of most any VLDB or data warehouse they happen to be in charge of.
What is Partitioning?

Partitioning is a physical database design technique that many data modelers and DBAs are quite familiar with. Although partitioning can be used to accomplish a number of various objectives, the main goal is to reduce the amount of data read for particular SQL operations so that overall response time is reduced.

There are two major forms of partitioning:

1. Horizontal Partitioning - this form of partitioning segments table rows so that distinct groups of physical row-based datasets are formed that can be addressed individually (one partition) or collectively (one-to-all partitions). All columns defined to a table are found in each set of partitions so no actual table attributes are missing. An example of horizontal partitioning might be a table that contains ten years worth of historical invoice data being partitioned into ten distinct partitions, where each partition contains a single year's worth of data.
2. Vertical Partitioning - this partitioning scheme is traditionally used to reduce the width of a target table by splitting a table vertically so that only certain columns are included in a particular dataset, with each partition including all rows. An example of vertical partitioning might be a table that contains a number of very wide text or BLOB columns that aren't addressed often being broken into two tables that has the most referenced columns in one table and the seldom-referenced text or BLOB data in another.

Before database vendors began building partitioning (mainly horizontal) into their engines, DBAs and data modelers had to physically design separate table structures to hold the desired partitions, which either held redundant data (separate tables with data that were based off a live parent table) or were linked together to form one logical parent object (usually via a view). This practice has since been made obsolete for the most part for horizontal partitioning, although it is sometimes still done for vertical partitioning.
Partitioning in MySQL 5.1

One of the great new features in MySQL 5.1 is support for horizontal partitioning. The really good news about MySQL and the new 5.1 partitioning feature is all the major forms of partitioning are supported:

1. Range - this partitioning mode allows a DBA to specify various ranges for which data is assigned. For example, a DBA may create a partitioned table that is segmented by three partitions that contain data for the 1980's, 1990's, and everything beyond and including the year 2000.
2. Hash - this partitioning mode allows a DBA to separate data based on a computed hash key that is defined on one or more table columns, with the end goal being an equal distribution of values among partitions. For example, a DBA may create a partitioned table that has ten partitions that are based on the table's primary key.
3. Key - a special form of Hash where MySQL guarantees even distribution of data through a system-generated hash key.
4. List - this partitioning mode allows a DBA to segment data based on a pre-defined list of values that the DBA specifies. For example, a DBA may create a partitioned table that contains three partitions based on the years 2004, 2005, and 2006.
5. Composite - this final partitioning mode allows a DBA to perform sub-partitioning where a table is initially partitioned by, for example range partitioning, but then each partition is segmented even further by another method (for example, hash).

There are a number of benefits that come with partitioning, but the two main advantages are:

Increased performance - during scan operations, the MySQL optimizer knows what partitions contain the data that will satisfy a particular query and will access only those necessary partitions during query execution. For example, a million row table may be broken up into ten different partitions in range style so that each partition contains 100,000 rows. If a query is issued that only needs data from one of the partitions, and a table scan operation is necessary, only 100,000 rows will be accessed instead of a million. Obviously, it is much quicker for MySQL to sample 100,000 rows than one million so the query will complete much sooner. The same benefit is derived should index access be possible as local partitioned indexes are created for partitioned tables. Finally, it is possible to stripe a partitioned table across different physical drives by specifying different file system/directory paths for specific partitions. This allows physical I/O contention to be reduced when multiple partitions are accessed at the same time.
Simplified data management - partitioning allows a DBA to have more control over how data is managed inside of the database. By intelligently creating partitions, a DBA can simplify how certain data operations are performed. For example, a DBA can drop specific partitions in a partitioned table while the remaining partitions remain intact (as opposed to crafting a fragmentation-producing mass delete operation for the whole table). Further, partitions are automatically maintained by MySQL so the DBA doesn't have to manually separate and maintain a horizontal partitioning scheme for a table. For example, a DBA can create a history table that holds data for customers that are partitioned across various year ranges, and have those partitioned automatically enforced by the database server with no DBA intervention being necessary.

From a design-for-performance standpoint, we're mainly interested in point one above. By smartly using partitioning and matching the design to properly coded queries, a dramatic performance impact can be realized. Let's take a quick test drive of partitioning in MySQL 5.1 to see this in action. Note that all tests below were done on a Dell Optiplex box with a Pentium 4 3.00GHz processor, 1GB of RAM, running Fedora Core 4 and MySQL 5.1.6 alpha.
Partitioning in Action

To see the positive benefit partitioning can have on a database, let's create identical MyISAM tables that contain date sensitive information, but let's partition one and leave the other a standard heap table. For our partitioned table, we'll partition based on range and use a function that segments the data based on year:

mysql> CREATE TABLE part_tab
-> ( c1 int default NULL,
-> c2 varchar(30) default NULL,
-> c3 date default NULL
->
-> ) engine=myisam
-> PARTITION BY RANGE (year(c3)) (PARTITION p0 VALUES LESS THAN (1995),
-> PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,
-> PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) ,
-> PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) ,
-> PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,
-> PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),
-> PARTITION p11 VALUES LESS THAN MAXVALUE );
Query OK, 0 rows affected (0.00 sec)

Notice that we designed partitions for a particular year and finished with one catch-all partition to get anything that doesn't fall into any of the specific date partitions. Now let's create a mirror MyISAM table that's not partitioned:

mysql> create table no_part_tab
-> (c1 int(11) default NULL,
-> c2 varchar(30) default NULL,
-> c3 date default NULL) engine=myisam;
Query OK, 0 rows affected (0.02 sec)

Now let's create a procedure (thanks to Peter Gulutzan for the code…) that will fill our partitioned table with 8 million rows that distributes data fairly evenly across the various partitions. Once filled, we'll then insert the same data into our non-partitioned MyISAM clone table:

mysql> delimiter //
mysql> CREATE PROCEDURE load_part_tab()
-> begin
-> declare v int default 0;
-> while v < 8000000
-> do
-> insert into part_tab
-> values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));
-> set v = v + 1;
-> end while;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call load_part_tab();
Query OK, 1 row affected (8 min 17.75 sec)
mysql> insert into no_part_tab select * from part_tab;
Query OK, 8000000 rows affected (51.59 sec)
Records: 8000000 Duplicates: 0 Warnings: 0

With our tables now ready, let's issue a simple date range query on both tables - the non-partitioned table first and then the partitioned table - followed by EXPLAIN's, and see what MySQL does:

mysql> select count(*) from no_part_tab where
-> c3 > date '1995-01-01' and c3 < date '1995-12-31';
+----------+
| count(*) |
+----------+
| 795181 |
+----------+
1 row in set (38.30 sec)

mysql> select count(*) from part_tab where
-> c3 > date '1995-01-01' and c3 < date '1995-12-31';
+----------+
| count(*) |
+----------+
| 795181 |
+----------+
1 row in set (3.88 sec)

mysql> explain select count(*) from no_part_tab where
-> c3 > date '1995-01-01' and c3 < date '1995-12-31'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: no_part_tab
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 8000000
Extra: Using where
1 row in set (0.00 sec)

mysql> explain partitions select count(*) from part_tab where
-> c3 > date '1995-01-01' and c3 < date '1995-12-31'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: part_tab
partitions: p1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 798458
Extra: Using where
1 row in set (0.00 sec)

The power of proper partition and query design can easily be seen as the partitioned table access delivers a whopping 90% response time reduction over the non-partitioned table. The EXPLAIN plans showcase why this is (notice the new EXPLAIN syntax for partitioned objects) as only the first partition in the partitioned table is accessed with all others being skipped.

As a MySQL DBA, it's easy to get excited about the potential benefits that partitioning can provide, but you always want to make sure that the tool you use for database design matches the requirements and scenario of your particular application. Partitioning is best suited for VLDB's that contain a lot of query activity that targets specific portions/ranges of one or more database tables. Of course, other situations lend themselves to partitioning as well (e.g. data archiving, etc.)
A Quick Side Note on Vertical Partitioning

Although MySQL 5.1 automates horizontal partitioning, don't lose sight of vertical partitioning schemes when designing your databases. Although you have to do vertical partitioning manually, you can benefit from the practice in certain circumstances. For example, let's say you didn't normally need to reference or use the VARCHAR column defined in our previously shown partitioned table. Would the elimination of this column help query speed? Let's find out:

mysql> desc part_tab;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | YES | | NULL | |
| c2 | varchar(30) | YES | | NULL | |
| c3 | date | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.03 sec)

mysql> alter table part_tab drop column c2;
Query OK, 8000000 rows affected (42.20 sec)
Records: 8000000 Duplicates: 0 Warnings: 0

mysql> desc part_tab;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c1 | int(11) | YES | | NULL | |
| c3 | date | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select count(*) from part_tab where
-> c3 > date '1995-01-01' and c3 < date '1995-12-31';
+----------+
| count(*) |
+----------+
| 795181 |
+----------+
1 row in set (0.34 sec)

By removing the VARCHAR column from the design, you actually get another 90+% reduction in query response time. Beyond partitioning, this speaks to the effect wide tables can have on queries and why you should always ensure that all columns defined to a table are actually needed.
Wrap Up

A short article like this can't possibly cover all the benefits and mechanics of MySQL 5.1's partitioning, but a few notes of interest include:

* All storage engines support partitioning (MyISAM, Archive, InnoDB, etc.)
* Indexing support for partitioned tables include local indexes, which mirror each partition in a one-to-one scheme. In other words, if a partitioned table has ten partitions, then a local index for that table would also contain ten partitions.
* Metadata regarding partitioned tables can be found in the INFORMATION_SCHEMA database, with a new PARTITIONS table being available.
* All SHOW commands support the return of partitioned table and index metadata.
* Maintenance functions and a number of other operations can be performed on partitions (rather than acting on a full table), including:
o ADD PARTITION
o DROP PARTITION
o COALESCE PARTITION
o REORGANIZE PARTITION
o ANALYZE PARTITION
o CHECK PARTITION
o OPTIMIZE PARTITION
o REBUILD PARTITION
o REPAIR PARTITION

From a performance standpoint, the main take-away is that MySQL 5.1 partitioning is a powerful new tool that can be used in many physical database designs to dramatically improve performance and ease DBA management burdens. For more information on MySQL partitioning, you can visit out the online reference manual at http://dev.mysql.com/doc/refman/5.1/en/partitioning.html and visit the MySQL forums as there is a forum section devoted to partitioning, which can be referenced at http://forums.mysql.com/list.php?106.

Download a copy of MySQL 5.1 (which is now is beta) today and give partitioning a try. I think you will be pleased with all the new possibilities partitioning provides when it comes to creating a top-notch physical database design, which is the number one contributor to overall database performance.

posted @ 2006-04-11 11:47 无风之雨 阅读(768) | 评论 (0)编辑 收藏

前言

    随着技术的不断发展和用户对网站功能性的需求不断提高,如今网站项目的设计已经不能再仅仅简单地利用静态Html文件来实现,与前几年网站设计由一两名网页设计师自由的创作相比,网站项目的设计和开发越来越像一个软件工程,也越来越复杂,网站项目的设计和开发进入了需要强调流程和分工的时代,建立规范的、有效的、健壮的开发机制,才能适应用户不断变化的需要,达到预期的计划目标。

    网站项目管理(WPM)的含义为WebbasedProjectManagement,即以Web应用程序为主要表现方式的架构来进行的项目设计及管理,这样的架构中包含了浏览器、网络和Web服务器等关键主体,主要体现在网站设计、以浏览器为客户端的Web应用程序开发(例如信息类网站、网上商店、虚拟邮局、客户关系管理。)等项目管理中。

    在本文中,笔者将网站项目管理(WPM)与软件工程的统一过程管理(RUP)进行参照比较,并结合实际工作经验,力求将网站工程管理(WPM)的角色、分工、流程进行完整的阐述,使网站项目管理逐渐走向规范化。

    按照笔者的经验,网站项目管理可以分为以下七个阶段进行控制:
    1.需求分析及变更管理
    2.项目模型及业务流程分析
    3.系统分析及软件建模
    4.界面设计、交互设计及程序开发
    5.系统测试和文档编写
    6.客户培训、技术支持和售后服务
    需要说明的是,这些阶段虽然具有一定的延续性,但是并非完全隔断的,例如需求变更管理和测试工作、文档编写都是贯穿整个项目过程的,许多工作时交叉进行或同时进行的。

    (一)如何做好需求分析及变更管理?

    业务员与客户进行的沟通,撰写需求分析报告是项目展开的基础。项目是以客户的需求为中心,而不是为技术而迁就需求。
    本章包括以下内容:
    一.让客户畅所欲言,罗列出所有的需求
    二.透过现象分析潜在的需求
    三.利用自然的语言描述项目模型
    四.利用示意图和图表将用户的需求表现出来。
    五.什么人要看需求分析报告?
    六.建立需求变更日志,制作新版本的需求分析报告。
    七.本阶段重点工作角色
    八.总结
    
    一:让客户畅所欲言,罗列出所有的需求

    让用户将所有的想法尽可能的阐述清楚,并把所有的要求罗列出来,不要遗漏。这时候不应该害怕"勾引"起客户的潜在需求而增加设计开发的工作量,从而被今后客户无止境的变更拖入泥潭,直接明白地跟客户把问题和要求一条条地列出来,把条理、归纳、分析先都扔到一边去,将用户最原始、最完整的要求准确地记录下来就完成了第一步的工作。

    很明显,假如客户的需求做的都不完整,随时可能会产生意想之外的变更,甚至这个变更会破坏已经做的模型及结构,那么这个项目从开始就注定了会失败;比如站点所有的功能都实现了,本地测试起来也没有什么问题了,但是你却不知道客户的系统是要承受每天100万独立IP的访问,而你原来想当然的以为了不起就是1万独立IP访问的访问流量,稍微有经验的开发人员都会明白这样的设计是个灾难,无论是应用服务器、数据库还是程序全部要重新开发!

    二:透过现象分析潜在的需求

    很多情况下客户并非专业人士,在他们滔滔不绝的描述中不能指望他们帮助我们整理出重点和技术难关,这需要我们去为客户进行分析、归纳和整理,尤其是客户谈的不多却又是技术上实现难度和强度很高的地方特别值得注意。

    客户往往对需求的概念是非常模糊的,大多时候给出的需求都是笼统而且尺度难以控制的,这就要求业务人员在倾听了客户的详细说明以后,帮助客户进行整理和分析,同时预测客户在开发过程中变更及今后应用中可能进行修改升级的潜在需求。

    比如在为客户设计办公自动化系统的时候,也许就要为客户预留将来与他们的业务单位进行交互的通道;在设计邮件系统的时候要考虑可能会需要广告管理服务器;设计网络电子商店时今后增加库存产品进销存统计分析等等;限于时间财力的考虑,客户通常能够接受分阶段实施的开发过程,在需求分析时,提早为客户设想到今后的需求变更除了使项目开发更加顺利以外,也为今后业务的进一步深入打下了更好的基础。

    笔者曾负责一个大型新闻网站的设计,当客户拿着将近五十页厚的一本设计要求报告时,我发现有四十页的内容对程序开发来说都是重复的,而在其中一页的角落却画了个"搜索其他网站相关新闻"的按钮,并且没有做任何说明,仅仅这10个字所完成的工作量完全顶的上其他整整四十页重复赘述所做的工作,客户完全不知道这个要求引发的问题实际就是一个搜索引擎的开发,通过协商,客人同意了修改成站内搜索的引擎。

    三:利用自然的语言描述项目模型

    在业务员与客户进行沟通和调查时撰写的需求分析,尽可能用自然的语言进行描述,虽然客户的水平和资历有所不同,但是最自然的描述能够使项目开发的各个成员都能清楚地理解需求含义,不至于在理解上产生偏差。对客户而言,这样的模型描述最接近真实,容易参与修订,并能以此为测试和验收的依据。

    请比较以下两份关于需求的描述,
    "用户在访问首页的时候可以在点击’客户通道’按钮,弹出填写’用户名’和’密码’的窗口,输入正确后在新窗口打开客户通道的首页,在该页显示所有可操作的功能的导航条和最新的导读新闻链接列表"
    "站点分为公开和加密两种状态,通过身份验证机制使特有的用户可以访问到加密信息,并提供不同于普通用户的功能。"
    前段描述我们就很容易想象的出来设计完成的网站是什么样子,而后一段的描述可能会做出无数不同的版本,造成对需求理解的歧意。

    四:利用示意图和图表将用户的需求表现出来。

    需求分析无论文字上怎么样表述都还是抽象的,对客户而言理解毕竟是困难的,将基本确定的需求制作出示意图是最直观有效的。

    制作示意图可以有很多种方式,用PowerPoint或Visio制作流程示意,用Html文档制作界面示意都是可行的,最简单利用画图和Word表格方式也完全可以,关键是利用示意图将客户的需求和即将开始设计的系统体现起来,在进行系统分析和程序开发之前,双方对今后要完成的产品就能够有直观的认识,换言之,就是在产品还没有真正进入开发阶段的时候,双方就对工作的结果达成统一的意见,这将大大地减轻需求变更所带来的困扰,同时客户更容易地参与到项目的开发过程,保证项目往正确的方向进行。

    在RUP中有这样的描述:
    "利用电影、卡通、图片、表格和动画片等制作示意图开始,告诉我们用户是谁,要发生什么事情,如何发生。
    以用户友好的方式帮助收集并改进用户需求。
    鼓励更有创造性、更加创新的设计解决方案。
    鼓励团队复审,并避免所有人都不希望出现的特征。
    确保以可理解、直观的方式实施特征。
    使访谈过程变得轻松,避免出现访谈没有结果的现象。
    简单地说,制作示意图就是使用工具向用户(主角)说明(有时是动画演示)系统如何适应组织的需要,并表明系统将如何运转。协调员将初始示意板展示给小组,小组成员提供意见。之后,在举办研讨班期间,示意板也进行"实时"演进。所以,您需要一种可以轻松更改示意板的画图工具。为了避免分散注意力,一般最好使用简单的工具,比如图表、白板或PowerPoint。"

    五:什么人要看需求分析报告

    项目经理、系统分析员、开发经理、交互设计师、测试人员、文档人员包括客户代表都应该看需求分析,并进行共同的讨论,达成一致的意见。

    我们经常会遇到业务人员辛辛苦苦谈下来的项目,对开发人员来说却是难以实现的,而技术人员设计的产品却常常得不到客户的认可,甚至发生纠纷,因此参与项目开发的人员都应该对这份需求有统一清晰的认识,并根据自己的工作对需求提出意见,通过与客户的沟通修订,最终确定项目实现的目标。

    例如:
    项目经理通过需求分析才能组建所需要的团队包括配置工作环境,制定开发周期。
    开发周期的限制和功能上的要求可能会影响到程序员采用什么样的语言和工具进行编写;
    操作用户的技能水平将影响到交互设计师进行前台设计时做到什么样的精度;
    界面设计人员根据项目的性质和定位确定表现方式。
    测试人员了解测试环境和条件后才能对项目质量进行跟踪和检测;
    通过下表,我们可以看的出不同角色根据需求的变更所进行的工作流程:
    

    六:建立需求变更日志,制作新版本的需求分析报告

    尽管我们费了许多功夫在需求分析进行了最大可能的努力,但几乎可以肯定的是,这份需求分析在开发过程中一定会发生变化,也许是出自客户的遗漏,也可能是在开发过程中被激发出来的,这种变更有时是如此的频繁和琐碎,以至于往往不能将变更及时反馈到项目的各个角色中,那么做好需求变更日志就显得非常重要。

    在需求分析后面附上变更日志,并将修改后的需求分析制作成新版本,保留每次更改过的版本,而不是覆盖,这样就比较容易地跟踪到需求变更过程中所带来的工作调整。

    在新版本的需求分析中,将变更多部分用特殊方式表明出来,并在日志中记录变更多重的明细。
    关于需求分析和变更管理可以参照下图示意:
    

    七:本阶段重点工作角色

    在需求分析和变更管理的过程中,工作量最大的角色为客户代表、业务员和项目经理。

    客户代表提出需求,业务员帮助整理和分析,项目经理对整个项目进行评估。

    在实际工作中,很多项目失败的起因都和需求分析有关。客户代表和业务员通常并非从事技术开发的专业人员,在讨论需求的时候往往对项目的技术难度、工作量、时间进度把握不准确,这时候需要项目经理或技术人员进行参谋。

    为了降低项目的风险,提高工作效率,有必要设计规范的需求管理计划书,帮助客户代表和业务员更好的完成任务。以下提供一份需求管理计划的模板可作为参考:
    
     八:总结

    根据笔者的经验,要尽快做好需求分析掌握以下要点,也许能事半功倍:
    仔细聆听,罗列客户的所有要求;
    将需求进行分析,确认可操作的系统模型;
    利用最自然的语言将系统进行描述,使每个开发人员不会产生歧意;
    迅速确定网站的用户角色;
    比如访客、会员、重要客户、前台管理员、网站管理员、业务员等;
    分析确定每个角色的权限及可操作的功能;
    比如会员可以查看特别信息、修改个人信息、退出登陆等;
    前台管理员能够登录管理系统,能够发布编辑修改信息,能够审查会员资格等;
    网站管理员可以更改栏目、修改网站界面等;
    制作流程图和示意图将需求表现出来;
    让客户参与到示意图的设计中,及时正确的反应出需求变更。
    制作需求变更日志,保留升级版本,通过版本控制进行需求管理;
    通过需求《管理计划书》使每个参与人员看到共同的努力目标。

posted @ 2006-04-10 14:53 无风之雨 阅读(306) | 评论 (0)编辑 收藏

         这是微软资深项目经理人Stephen Maguire的项目管理经验。软件开发和网站开发有极其相似的地方,我们可以从中学习领会许多知识。

  第一章 有效团队的基础

  1、专心改善产品

  公司付工资给设计师,要他们在合理的时间开发出品质精良的网站,但是设计师们的时间却经常被其它事情占用了。

  典型的情况是设计师要花大量的时间准备会议,参加会议,读写开会记录和进度报告,还有回复email等等,这些事情都不能改善网站的工作,虽然其中一些是设计师自己主动做的,但更大一部分是项目经理下的命令。

  虽然项目经理的本意是好的,但是却违背了项目经理的基本守则:项目经理的任务是努力消除设计师工作上的一切障碍,让设计师权利专注在真正重要的工作上---网站开发。

  这不是震惊世界的发现,只是简单的道理,但是有多少项目经理确实做到呢?

  2、排除干扰

  如果你希望团队在期限之内完成网站,就必须尽可能排除一切不必要的工作。在你分派工作给组员前,请问问自己,这件工作真的有必要让大家做吗?身为项目经理,必须时刻问自己一个问题: “我努力的目的究竟是什么?”

  常见的就是让组员写报告。一天8小时工作时间,很可能4个小时花在了写报告上。而正常的开发工作却不得不加班做。

  请不要误解我的意思,我并不是说不需要进度报告,只是提醒项目经理们,不要过分注重“项目流程”,而忽略了真正的产品----你的网站。我的一点心得是:用一个新的办法了解进度,容易写,而且不花时间。

  1)当有设计师完成一个功能(子项目),就发一个内部email给大家;

  2)当项目进度可能落后,就和我私下交流,讨论解决的办法。

  3、明确目标

  什么样的目标是明确的目标呢?其实并不一定是博大精深的,只要足够详细,能够保证项目向正确的方向进行就可以。通常只要项目组长花几小时,或者几天时间就可以制定一个详细的项目目标。例如本站:

  目标1: 建立一个以网站项目管理为主题的网站。评价:目标已经明确主题,但还是不够详细。

  目标2:为网站项目管理爱好者提供一个交流的平台。评价:目标定位了服务对象和主要功能。但是并没有体现我们建立网站的深层目的。

  目标3:为网站项目管理爱好者提供一个学习交流,并能够共同制定详细规范的平台。评价:明确的目标,指出了服务对象,最主要的功能和网站本身的目的。

  在目标确定后,我们就坚持这个大方向,凡是有利于目标实现的最先完成,比如:论坛,规范文章。与目标无关或关系不大的,可以不做或者推迟做,比如人才交流,漂亮的界面等。

  4、设计的优先考虑

  我们要建立以下基本观念:项目目标引导项目的方向,而设计的考虑顺序影响设计的过程。

  每个项目的具体情况不同,考虑的优先顺序也回不同,一般来说,程序设计考虑的优先级表为:

  1)尺寸大小(size)

  2)速度

  3)安全性

  4)可测试性

  5)容易维护

  6)简洁

  7)再用性

  8)可移植性

  除了优先考虑顺序外,你还应该建立各项考虑点的质量规范。如果事先能够决定最合适的优先考虑顺序,并建立质量规范,团队就不会浪费时间,网站的整体风格就会比较一致。

  第二章 有效的作业方式

  1、什么时候修改错误

  微软的经验是:(1).bug越晚清除,时间花得越多; (2).在开发过程中立刻除虫,可以让您早些学到经验,然后不会犯同样的错误;(3).如果能够保证没有任何错误,您就能比较准确的估出项目的完成时间。 所以,设计师应该把找错误当成一件重要的事情,不要为任何理由而耽误。

  2、email的时间陷阱

  回复email要分批做,早上一上班,中午休息时间,或者是下班前看一下都可以,但不要有事没事都不停的看email。

  3、方法让大家分享

  身为主管,你应该鼓励组员提出改进工作效率的建议。引导组员思考的方法也很重要。比如,下面两个问题:

  a.为什么进度总是一再落后?

  b.有什么办法可以避免将来再发生进度落后?

  第一个问题可能的答案是:互相依赖的工作太多,工具太难用,老板是个白痴等等;第二个答案可能是:减少互赖性的工作,购买更好的工具,与老板加强沟通。

  两个问题的方向不同,第一个是探究原因,导引出抱怨;第二个是未来改进的方法,导引出解决办法。

  问题越精确,问题越有力,对项目目标的实现就越有益,让我们再看三个问法:

  a.如何保持每次都如期完成项目?

  b.如何在不加班的前提下,如期完成项目?

  c.如何在不加班,也不增加人手的前提下,如期完成任务?

  第三个问法,就迫使大家来点真正有创意的思考和认真检讨工作本身值得改进的地方了。一次比一次更精确的问题,可以刺激思考过程,激发更有创意的答案。

  4、无意义的惩罚

  惩罚是一种心理上的负强化作用,惩罚是对员工的责骂,训斥与威胁,就象鞭打马匹使它服从主人的命令。这种管理手段是该受谴责的,如果主管们的用意是希望组员因此而工作更努力的话,就大错特错了。这种责骂只会激起组员心中的愤怒,羞恼和沮丧。实际上,往往这些项目的问题都出在管理方面,目标不明确或者野心太大,设计师只是倒霉的遇上了差劲的主管,其实他们的能力不比其他项目的设计师差。因此放弃责骂吧,责骂只会让项目更糟,绝对没有任何改善的效果。

  第三章 保持进度

  即使最顺利的项目,也无法完全按照计划执行,但是,如果你放任计划随意进行,有一天你猛然发现项目脱轨太远,来不及完成。项目就象一枚瞄准月球的火箭,只要有一点点不够精确,到时候就无法命中目标,差之毫厘,失之千里,实在不可不慎重。聪明的主管懂得这个道理,他们会经常注意项目的精度,随时修正方向,保持项目不偏离计划进行。本章将介绍一些很有效的策略,帮助项目保持进度。

  1、向前看

  我一直相信,项目之所以脱轨,主要原因在于人们没有认真思考如何使项目保持进度,顺利进行。如果没有未雨绸缪,只是坐等问题发生,到那时候就太迟了。一个月前没有花30分钟思考这个问题,现在就可能要浪费几小时或几天的时间去修正。这就是所谓的“被动工作”。

  解决这种被动工作的方法,就是化被动为主动,事先发掘潜在的问题,并设法避免。有很多方法和技巧可以训练自己“向前看”,但总结起来不过是一句简单的要决:定期暂停手边的工作,然后往前思考,随时做必要的修正,以避免未来的大障碍。

  我已经有十年以上的习惯,每天花10到15分钟思考下列问题,并且列出答案: 有什么事情是我今天能做,而且可以帮助项目在未来几个月内顺利进行的?

  2、明确定义需求的范围

  人们在开口要求的东西未必是他真正想要的,处理他的要求之前,请务必确定他究竟想要做什么。

  在网站项目开发中,经常会遇到客户或者领导层提出一些希奇古怪的需求。一次,首席设计师惊慌失措的跑来找我,告诉我麻烦来了,客户对新设计的界面不满意,要求按照某个著名网站一摸一样的设计。如果真的那样做,需要重新花一个星期才能做出来,可是目前离期限的时间已经很短了。听了他的陈述后,我必须承认如果真得那样做,我们的进度就完蛋了,同时我也很好奇,为什么客户会有这样的要求,所以在我答复他们做还是不做之前,请客户经理去了解一下这个需求的原因。不一会儿,客户经理笑嘻嘻地回来了。

  “他们只是看中了那个网站的动态下拉菜单,觉得那样比较吸引人”

  呵呵,我知道他在笑什么了,这样的动态菜单我们其实早就有现成的模板了,只要将它替换现有的设计就可以了。而我们的设计师不清楚客户的喜好而已。

  大部分客户在提出需求时都不解释原因,这种情况太普遍了,甚至你的管理层也会发生这种情况。如果你从他们的请求中无法看出他们的目的,你可以反问他们,在还没有弄清楚究竟想要做什么之前,不要贸然答应,宁可拒绝他们的要求也不要浪费这种时间。
posted @ 2006-04-10 13:47 无风之雨 阅读(189) | 评论 (0)编辑 收藏

    周五晚上无聊,开车出去广州内环路,想看看26.7公里长的内环我跑一圈要多久。于是晚上20:53,我从黄埔大道上内环,走火车站方向。开到江南大道那里,我出了个错,从内环上下来了,后悔的要命,一看表,21:07。然后在江南大道上堵车,接着掉头,瞎走了一气,后来上了内环,到21:50左右,又来到江南大道出口那里,这次醒目了,没从那边下,然后看到黄埔大道4公里的路牌,不过没走两步,又下错了口,郁闷。。。。
    后来估算了一下,跑完内环,大概要17分钟吧,平均时速90公里,超速50%,呵呵。。今天查了下广州金盾网,没有违章记录,还好还好。
    途中也遇到几辆车好像也在飚,以很快的速度穿插在车流中,我始终没跟上,不敢再快了,内环上弯道很多,怕出事。在车流中开到110的时候,我脚都在发抖。以后没事不飚了,看破红尘令当别论。
posted @ 2006-04-09 12:44 无风之雨 阅读(246) | 评论 (0)编辑 收藏

我有chm,但那个已经比较老了,最新的还是在MSDN,查每个元素的属性方法,style的写法,非常有用

http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/dhtml_reference_entry.asp

posted @ 2006-04-09 12:18 无风之雨 阅读(239) | 评论 (0)编辑 收藏

    我做一个网页,原先的设想是,一个页面上有数个DIV,我只显示其中一个DIV,其他的隐藏,当我点击页面头部的链接的时候,js把所有DIV都隐藏,然后显示我点击链接所代表的DIV。
    问题是出来了。当第一个DIV显示后,正在读取里面的元素,比如图片的时候,我点击头部链接,那图片就不会继续读了,就算我切换回来,它也停在那里了。
     原先我以为是隐藏方式的问题,但我用了dislplay和visibility,都一样。后来同事启发了一下,说以前曾做过一个广告图片,当他点击关闭图片的链接的时候,会把图片隐藏,但会导致整个页面上所有的动画都停止的现象,他用的是<a href=# onclick="closeit()">来关的。后来他把href=#去掉了,并加上style="cursor:hand"来显示手形。这样图片可以隐藏掉,页面也不会有任何影响。
     我照着把头部的链接改了,把原先的href="javascript:showit()"改成了onclick,至此问题解除,在我切换到其他DIV的时候,隐藏的DIV会继续读取页面元素。

    我想,出现这种情况,可能是因为浏览器把href当作是页面跳转的语句,就算页面实际上没有转,它也认为原页面已经被跳转掉了,再读取上面元素已经没有意义,所以就全部停了。

posted @ 2006-04-09 12:15 无风之雨 阅读(281) | 评论 (0)编辑 收藏

    MYSQL用了好多年了,一次次的优化,一次次的顶过崩溃的边缘,相信能有这样经历的人也不多。这里我写一点这么多年来优化MYSQL的经验。

    让我们从头开始

     什么机器比较适合跑MYSQL?原则就是IO操作一定要快,要少。在这个原则下,内存肯定是越大越好,硬盘肯定是越快越好。1快硬盘不够快,那就两块,做RAID0。
    什么操作系统比较适合跑MYSQL?我试过Linux,FreeBSD,Solaris。solaris是最差的,因为IO慢,的确比其他两个慢,所以我都不用它了。FBSD和linux哪个好?这个我倒是没认真比过,感觉上,fbsd的IO比linux快,所以我有一个5千万条记录的mysql跑在fbsd上,访问量很高的情况下,感觉还是很快。最近的项目都统一到Linux下了,感觉mysql在linux下跑,也不错。看过不少评测,都说mysql在linux比fbsd快,因为我没有实际对比,只有各自的体会,所以也不多评论了。不过fbsd有一点要注意,它默认的数据段大小只有1G,你想开大缓存,就必须重新编译内核,不然会数据段错。
    MYSQL5.1都已经在测试了,我们应该用什么版本?如果你是新开发一个产品,建议用5.0,不过我没实际用过,不好说。我用的最多的是3.23.x和4.1.x。由于没有在相同的环境下测试,所以不敢说哪个版本性能最好。所以还是只推荐5.0或者4.1毕竟是现在MYSQL主推的,比较有保证。
    我最近用的最多的是4.1。现在我一般会下载for linux+icc编译的二进制包,以前我一般下源文件自己编译,源代码编译的是否好,直接影响性能。关于编译mysql的选项,足够另外写一篇东西了。这里就不提了,有兴趣的看看BUILD目录下的东西。现在我常用的是编译好的二进制包,因为他的编译环境已经基本最优化,而且加上icc编译器的优化,性能还能有一点提升。
    接着就是my.cnf了。我一般在support-files目录下的my-innodb-heavy-4G.cnf文件的基础上来修改。对性能影响比较大的,有table_cache,sort_buffer_size,join_buffer_size,query_cache_size,key_buffer_size,read_buffer_size,innodb_additional_mem_pool_size,innodb_buffer_pool_size。用INNODB是肯定的。innodb_additional_mem_pool_size可以大一点,我一般设256M,可以减少不断增加缓存的操作,innodb_buffer_pool_size是初始化的缓存,我觉得2G有点太大了,我倾向于给操作系统本身留点缓存空间。我一般设到1.2G,他自己有需要,也会慢慢涨到2G。
posted @ 2006-03-30 17:49 无风之雨 阅读(558) | 评论 (1)编辑 收藏

    网站有3台MYSQL服务器,其中1台是主服务器,2台从服务器。主从之间用Replication实时同步。
    最近,随着网站流量的提高,3台服务器在繁忙时段都达到饱和。通过分析服务器状态,发现服务器都已经开始使用交换分区,此举无疑会提高服务器对IO的使用频率。

    2台从服务器中,一台4G内存的服务器处理能力比另外一台2G内存的服务器强1倍,两台服务器的差别,在CPU上差别并不大,RAID1对IO性能也不会有很大提高。所以断定通过把2G内存升级到4G,可以让此机的处理能力大大提高。

    昨天晚上,给2台2G内存的MYSQL加大了内存,到4G,现在MYSQL在最繁忙时段都已经能应付自如了。

    我还特地申请了一台新机器来做从服务器,配置如下:双XEON3.0/4GRAM/2块146GSCSI做RAID0。估计此机的整体处理能力会非常好。

    结论:实际验证了IO对于数据库系统性能的影响。在MYSQL本身已经无可优化的情况下,加大内存或者把磁盘做RAID0能得到1倍的以上的性能提升

posted @ 2006-03-30 17:15 无风之雨 阅读(2342) | 评论 (0)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3 下一页