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 無風之雨 閱讀(269) | 評論 (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 無風之雨 閱讀(263) | 評論 (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 無風之雨 閱讀(781) | 評論 (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。"

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

          ????項目經理、系統分析員、開發經理、交互設計師、測試人員、文檔人員包括客戶代表都應該看需求分析,并進行共同的討論,達成一致的意見。

          ????我們經常會遇到業務人員辛辛苦苦談下來的項目,對開發人員來說卻是難以實現的,而技術人員設計的產品卻常常得不到客戶的認可,甚至發生糾紛,因此參與項目開發的人員都應該對這份需求有統一清晰的認識,并根據自己的工作對需求提出意見,通過與客戶的溝通修訂,最終確定項目實現的目標。

          ????例如:
          ????項目經理通過需求分析才能組建所需要的團隊包括配置工作環境,制定開發周期。
          ????開發周期的限制和功能上的要求可能會影響到程序員采用什么樣的語言和工具進行編寫;
          ????操作用戶的技能水平將影響到交互設計師進行前臺設計時做到什么樣的精度;
          ????界面設計人員根據項目的性質和定位確定表現方式。
          ????測試人員了解測試環境和條件后才能對項目質量進行跟蹤和檢測;
          ????通過下表,我們可以看的出不同角色根據需求的變更所進行的工作流程:
          ????

          ????六:建立需求變更日志,制作新版本的需求分析報告

          ????盡管我們費了許多功夫在需求分析進行了最大可能的努力,但幾乎可以肯定的是,這份需求分析在開發過程中一定會發生變化,也許是出自客戶的遺漏,也可能是在開發過程中被激發出來的,這種變更有時是如此的頻繁和瑣碎,以至于往往不能將變更及時反饋到項目的各個角色中,那么做好需求變更日志就顯得非常重要。

          ????在需求分析后面附上變更日志,并將修改后的需求分析制作成新版本,保留每次更改過的版本,而不是覆蓋,這樣就比較容易地跟蹤到需求變更過程中所帶來的工作調整。

          ????在新版本的需求分析中,將變更多部分用特殊方式表明出來,并在日志中記錄變更多重的明細。
          ????關于需求分析和變更管理可以參照下圖示意:
          ????

          ????七:本階段重點工作角色

          ????在需求分析和變更管理的過程中,工作量最大的角色為客戶代表、業務員和項目經理。

          ????客戶代表提出需求,業務員幫助整理和分析,項目經理對整個項目進行評估。

          ????在實際工作中,很多項目失敗的起因都和需求分析有關??蛻舸砗蜆I務員通常并非從事技術開發的專業人員,在討論需求的時候往往對項目的技術難度、工作量、時間進度把握不準確,這時候需要項目經理或技術人員進行參謀。

          ????為了降低項目的風險,提高工作效率,有必要設計規范的需求管理計劃書,幫助客戶代表和業務員更好的完成任務。以下提供一份需求管理計劃的模板可作為參考:
          ????
          ???? 八:總結

          ????根據筆者的經驗,要盡快做好需求分析掌握以下要點,也許能事半功倍:
          ????仔細聆聽,羅列客戶的所有要求;
          ????將需求進行分析,確認可操作的系統模型;
          ????利用最自然的語言將系統進行描述,使每個開發人員不會產生歧意;
          ????迅速確定網站的用戶角色;
          ????比如訪客、會員、重要客戶、前臺管理員、網站管理員、業務員等;
          ????分析確定每個角色的權限及可操作的功能;
          ????比如會員可以查看特別信息、修改個人信息、退出登陸等;
          ????前臺管理員能夠登錄管理系統,能夠發布編輯修改信息,能夠審查會員資格等;
          ????網站管理員可以更改欄目、修改網站界面等;
          ????制作流程圖和示意圖將需求表現出來;
          ????讓客戶參與到示意圖的設計中,及時正確的反應出需求變更。
          ????制作需求變更日志,保留升級版本,通過版本控制進行需求管理;
          ????通過需求《管理計劃書》使每個參與人員看到共同的努力目標。

          posted @ 2006-04-10 14:53 無風之雨 閱讀(318) | 評論 (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 無風之雨 閱讀(200) | 評論 (0)編輯 收藏

          ??? 周五晚上無聊,開車出去廣州內環路,想看看26.7公里長的內環我跑一圈要多久。于是晚上20:53,我從黃埔大道上內環,走火車站方向。開到江南大道那里,我出了個錯,從內環上下來了,后悔的要命,一看表,21:07。然后在江南大道上堵車,接著掉頭,瞎走了一氣,后來上了內環,到21:50左右,又來到江南大道出口那里,這次醒目了,沒從那邊下,然后看到黃埔大道4公里的路牌,不過沒走兩步,又下錯了口,郁悶。。。。
          ??? 后來估算了一下,跑完內環,大概要17分鐘吧,平均時速90公里,超速50%,呵呵。。今天查了下廣州金盾網,沒有違章記錄,還好還好。
          ??? 途中也遇到幾輛車好像也在飚,以很快的速度穿插在車流中,我始終沒跟上,不敢再快了,內環上彎道很多,怕出事。在車流中開到110的時候,我腳都在發抖。以后沒事不飚了,看破紅塵令當別論。
          posted @ 2006-04-09 12:44 無風之雨 閱讀(259) | 評論 (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 無風之雨 閱讀(252) | 評論 (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 無風之雨 閱讀(295) | 評論 (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目錄下的東西?,F在我常用的是編譯好的二進制包,因為他的編譯環境已經基本最優化,而且加上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 無風之雨 閱讀(575) | 評論 (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 無風之雨 閱讀(2361) | 評論 (0)編輯 收藏

          僅列出標題
          共3頁: 上一頁 1 2 3 下一頁 
          主站蜘蛛池模板: 裕民县| 增城市| 永济市| 宾阳县| 巍山| 遵化市| 临桂县| 金华市| 镇原县| 永德县| 达州市| 林甸县| 安岳县| 长寿区| 东辽县| 昆山市| 宝坻区| 武城县| 旬邑县| 乌兰县| 兴海县| 喀喇沁旗| 连云港市| 嵊泗县| 涞水县| 三原县| 临清市| 交城县| 平原县| 大田县| 丰宁| 临朐县| 普陀区| 中卫市| 慈溪市| 梁平县| 竹溪县| 金平| 吉安县| 石阡县| 满洲里市|