<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>腦功仔個Blog &#187; database</title>
	<atom:link href="http://orz.hk/tag/database/feed/" rel="self" type="application/rss+xml" />
	<link>http://orz.hk</link>
	<description>每天都努力用腦用功的打工仔</description>
	<lastBuildDate>Thu, 10 May 2012 03:14:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>優化 MySQL Queries 小心得</title>
		<link>http://orz.hk/2008/08/07/2414/</link>
		<comments>http://orz.hk/2008/08/07/2414/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 04:54:36 +0000</pubDate>
		<dc:creator>腦功仔</dc:creator>
				<category><![CDATA[開發心得]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[optimization]]></category>

		<guid isPermaLink="false">http://orz.hk/?p=2414</guid>
		<description><![CDATA[個 MySQL database 一定唔可以係 Windows 行, 因為 profiling 喺 Windows 既 mysql database 行既話, 好多 detail 野, 例如 CPU usage, page faults 等等就唔能夠顯示出黎。 最好個 database 行係個 vm 入面, 如果 Multi-core/multi-cpu, 就要 set 做只用一粒 U, RAM 有咁少俾咁少吧, 因為 production database 通常都行到冇乜 ram 做 caching。 要 reset mysql 個 index cache, 可以用 CLEAR INDEX CACHE。 不過好多時係冇用, 因為 [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>個 MySQL database 一定唔可以係 Windows 行, 因為 profiling 喺 Windows 既 mysql database 行既話, 好多 detail 野, 例如 CPU usage, page faults 等等就唔能夠顯示出黎。</li>
<li>最好個 database 行係個 vm 入面, 如果 Multi-core/multi-cpu, 就要 set 做只用一粒 U, RAM 有咁少俾咁少吧, 因為 production database 通常都行到冇乜 ram 做 caching。</li>
<li>要 reset mysql 個 index cache, 可以用 CLEAR INDEX CACHE。 不過好多時係冇用, 因為 OS 本身都有 disk io cache, 咁只要喺 root 個  shell 行  echo “3″ &gt; /proc/sys/vm/drop_caches 就得了。 依個亦係唔用 Windows 既另一個原因。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://orz.hk/2008/08/07/2414/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serendipity migrate to WordPress &#8211; Categories</title>
		<link>http://orz.hk/2008/07/06/2152/</link>
		<comments>http://orz.hk/2008/07/06/2152/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 10:04:26 +0000</pubDate>
		<dc:creator>腦功仔</dc:creator>
				<category><![CDATA[開發心得]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Serendipity]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://orz.hk/?p=2152</guid>
		<description><![CDATA[Category 方面我選擇自己寫 script 黎 migrate, 因為發覺 Seredipity 同 WordPress 既 database design mindset 有d 唔同, 而喺 database design 亦常遇到類似既問題, 所以順便拎出黎講講。 Serendipity 喺處埋 categories 方面與 WordPress 截然不同, Serendipity 有專門處理 category 既 tables: entry 同埋 entry_cat; 而 WordPress 就有簡單d, 將 category 歸納入去 wp_terms, wp_term_relationships 同埋 wp_term_taxonomy 入面, 與 tags 及 link categories 等共存。 結果就係 WordPress 只係用 10個 [...]]]></description>
			<content:encoded><![CDATA[<p>Category 方面我選擇自己寫 script 黎 migrate, 因為發覺 Seredipity 同 WordPress 既 database design mindset 有d 唔同, 而喺 database design 亦常遇到類似既問題, 所以順便拎出黎講講。</p>
<p>Serendipity 喺處埋 categories 方面與 WordPress 截然不同, Serendipity 有專門處理 category 既 tables: entry 同埋 entry_cat; 而 WordPress 就有簡單d, 將 category 歸納入去 wp_terms, wp_term_relationships 同埋 wp_term_taxonomy 入面, 與 tags 及 link categories 等共存。 結果就係 WordPress 只係用 10個 tables 就完成任務, 而 Serendipity 裝咗 tags plugin 之後就成 27個 tables, 足足多左差唔多 3倍。</p>
<p>Serendipity 既 database design, 只能滿足處理 category:</p>
<table border="1" cellspacing="0">
<tbody>
<tr>
<td><strong>entries</strong></td>
<td></td>
<td><strong>entry_cat</strong></td>
<td></td>
<td><strong>category</strong></td>
</tr>
<tr>
<td>(k)id</td>
<td>-&lt;</td>
<td>identry</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td>idcategory</td>
<td>&gt;-</td>
<td>(k)id</td>
</tr>
</tbody>
</table>
<p>而 WordPress 既 database design 就將 category, tag, 同埋 link category 歸納入 term:</p>
<table border="1" cellspacing="0">
<tbody>
<tr>
<td><strong>post</strong></td>
<td></td>
<td><strong>term_relationships</strong></td>
<td></td>
<td><strong>term_taxonomy</strong></td>
<td></td>
<td><strong> terms</strong></td>
</tr>
<tr>
<td>(k)post_id</td>
<td>-&lt;</td>
<td>object_id</td>
<td></td>
<td>term_id</td>
<td>&gt;-</td>
<td>(k)term_id</td>
</tr>
<tr>
<td></td>
<td></td>
<td>term_taxonomy_id</td>
<td>&gt;-</td>
<td>(k)term_taxonomy_id</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td>taxanomy</p>
<p>(即係將個 term 再分類, 可以係 category, tag, link category 或其他)</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>結果就係 WordPress 喺 extensibility 方面優於 Serendipity。以 tag 為例, 假如 WordPress 唔支援而又想新增依個 feature, 佢只係要 taxonomy 方面定多個新名, frontend 作出適當修改, backend 甚至可以用原有系統就完成; 相反喺 Serendipity 要新增 tag 依個功能就要開設專門處理 tag 既 tables, 同埋 backend, 如果加一兩種新 feature 尤是可, 若果加十幾項就麻煩了。</p>
<p>以下係我 migrate 既 PHP script:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT c.categoryid, title FROM serendipity_entries e INNER JOIN serendipity_entrycat c ON c.ent
while ($post = mysql_fetch_assoc($result)) {
// category mapping
        switch ($post['</span>categoryid<span style="color: #0000ff;">']) {
                case 3: $new_cat = 8; break;
                case 2: $new_cat = 11; break;
                case 12: $new_cat = 12; break;
                case 1: $new_cat = 9; break;
                case 16: $new_cat = 13; break;
        }
        $query = &quot;SELECT  id FROM wp_posts WHERE post_title = '</span><span style="color: #000088;">$post</span><span style="color: #009900;">&#91;</span>title<span style="color: #009900;">&#93;</span><span style="color: #0000ff;">'&quot;;
        $r2 = mysql_query($query, $wp);
        $row = mysql_fetch_row($r2);
        $wp_post_id = $row[0];
&nbsp;
      mysql_query(&quot;UPDATE wp_term_relationships SET term_taxonomy_id=$new_cat WHERE object_id=$wp_post_id&quot;);
&nbsp;
      mysql_query(&quot;UPDATE wp_term_taxonomy SET count = count - 1 WHERE term_taxonomy_id=1&quot;, $wp);
      mysql_query(&quot;UPDATE wp_term_taxonomy SET count = count + 1 WHERE term_taxonomy_id=$new_cat&quot;, $wp);
}</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://orz.hk/2008/07/06/2152/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL vs Microsoft SQL vs Sybase SQL</title>
		<link>http://orz.hk/2008/03/06/2042/</link>
		<comments>http://orz.hk/2008/03/06/2042/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 18:04:02 +0000</pubDate>
		<dc:creator>腦功仔</dc:creator>
				<category><![CDATA[電腦雜碎]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://test.orz.hk/?p=2042</guid>
		<description><![CDATA[Sybase SQL, Microsoft SQL(MS SQL), MySQL, 樣樣都玩過一排, 最熟係 MySQL, 唔計佢近唔近符 ANSI SQL 同埋d bugs, 我發現 MySQL 算係咁多隻最好, 主要原因係 MySQL 比較易讀同易記, 例如你要列出 MS SQL 入面既 database: MSSQL: sp_databaseMySQL: show databases 好明顯唔記得到估到或者接到 MySQL 既 command, 至於 Sybase, 一d 基本既 commands 都冇(或者我唔知), 例如要列出表格: MSSQL: sp_helpMySQL: show tablesSybase: 係佢個 client program 度 press F7&#8230; 至於顯示欄: MSSQL: sp_help tablenameMySQL: describe [...]]]></description>
			<content:encoded><![CDATA[<p>Sybase SQL, Microsoft SQL(MS SQL), MySQL, 樣樣都玩過一排, 最熟係 MySQL, 唔計佢近唔近符 ANSI SQL 同埋d bugs, 我發現 MySQL 算係咁多隻最好, 主要原因係 MySQL 比較易讀同易記, 例如你要列出 MS SQL 入面既 database:</p>
<blockquote><p>MSSQL: sp_database<br />MySQL: show databases</p>
</blockquote>
<p>好明顯唔記得到估到或者接到 MySQL 既 command, 至於 Sybase, 一d 基本既 commands 都冇(或者我唔知), 例如要列出表格:</p>
<blockquote><p>MSSQL: sp_help<br />MySQL: show tables<br />Sybase: 係佢個 client program 度 press F7&#8230;</p>
</blockquote>
<p>至於顯示欄:</p>
<blockquote><p>MSSQL: sp_help <i>tablename</i><br />MySQL: describe <i>tablename</i><br />Sybase: 係 F7個畫面 click Show Columns</p>
</blockquote>
<p><a href="http://users.pandora.be/pecop/sqlr/sqlbasics.html" target="_blank">參考</a></p>
<blockquote>
</blockquote>
<blockquote>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://orz.hk/2008/03/06/2042/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>優化高流量網站の非等量化@多語系網站</title>
		<link>http://orz.hk/2007/09/11/1787/</link>
		<comments>http://orz.hk/2007/09/11/1787/#comments</comments>
		<pubDate>Tue, 11 Sep 2007 14:50:32 +0000</pubDate>
		<dc:creator>腦功仔</dc:creator>
				<category><![CDATA[開發心得]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[optimization]]></category>

		<guid isPermaLink="false">http://test.orz.hk/?p=1787</guid>
		<description><![CDATA[Normalization (等量化), 即係例如一件產品既分類名稱會放係第二個 table 度, 然後用 INNER JOIN。 未等量化之前: Table: Product id category_name SELECT category_name FROM product 等量化後: Table: Product id idcategory many to one Table: Category id name SELECT c.name AS category_name FROM product p INNER JOIN category c ON p.idcategory = c.id 條 query 長左好多, 但係好處都好多, 首先若果你個 category 名係水蛇春咁長的話, 而又有好多 product 都將個咁長既 category [...]]]></description>
			<content:encoded><![CDATA[<p>Normalization (等量化), 即係例如一件產品既分類名稱會放係第二個 table 度, 然後用 INNER JOIN。</p>
<p>未等量化之前:</p>
</p>
<p><table cellspacing="0" cellpadding="1" border="1" style="width: 33%;">
<tbody>
<tr align="center">
<td style="background: black none repeat scroll 0% 50%; width: 100%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font color="#ffffff">Table: Product</font></td>
</tr>
<tr>
<td style="width: 100%;">id</td>
</tr>
<tr>
<td style="width: 100%;">category_name</td>
</tr>
</tbody>
</table>
<p>SELECT category_name FROM product</p>
<p>等量化後:</p>
<p>
<table cellspacing="1" cellpadding="1" border="0" style="width: 100%;">
<tbody>
<tr>
<td style="width: 33%;">
<table cellspacing="0" cellpadding="1" border="1" style="width: 100%;">
<tbody>
<tr align="center">
<td style="background: black none repeat scroll 0% 50%; width: 100%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font color="#ffffff">Table: Product</font></td>
</tr>
<tr>
<td style="width: 100%;">id</td>
</tr>
<tr>
<td style="width: 100%;">idcategory</td>
</tr>
</tbody>
</table>
</td>
<td align="center" style="width: 33%;">many to one</td>
<td style="width: 33%;">
<table cellspacing="0" cellpadding="1" border="1" style="width: 100%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<tbody>
<tr>
<td style="background: black none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 100%;"><font color="#ffffff">Table: Category</font></td>
</tr>
<tr>
<td style="width: 100%;">id</td>
</tr>
<tr>
<td style="width: 100%;">name</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>SELECT c.name AS category_name FROM product p INNER JOIN category c ON p.idcategory = c.id</p>
<p>條 query 長左好多, 但係好處都好多, 首先若果你個 category 名係水蛇春咁長的話, 而又有好多 product 都將個咁長既 category 名放係 category_name 度, 咁你d 資料重複左好多次, 浪費好多位。</p>
<p> 同時, 你要更新個 category 名既話, 就要更新好多個 product 既 category name, 時間上方面會慢左。而且若果你只係改左一個 product 既 category name, 其他既 product 都會繼續用舊 category name, 即係管理上面都麻煩左。 若果你 normalize 左佢就冇晒依d 煩野。</p>
<p />
<p />
<p><b>非等量化</b></p>
<p>最近攪緊個網站流量越黎越大, 以前 design 既時候冇預到流量升得咁既程度, 於時乎用左比較多 normalization。</p>
<p>之但係頭先先話完 normalization 好, 點解而家又話用得多左? 因地制宜, 以 MySQL 為例, 開一個 table 即係開一個 file, 若果你完全 normalization, 佢就要同時開好多個 file 搵資料, 雖然其他 table 度搵出黎既資料會 cache 黎增加效率, 但係都要假定你有足夠記憶體先得, 使用記憶體既同時, CPU 既使用量又會增加。</p>
<p>以我經驗, peak hour 時未非等量化之前,  CPU 使用量係 30%, 非等量化之後就係 3%!</p>
<p><b>多語系的非等量化</b></p>
<p>等量化對d 同時支援多語系既網站特別有用, 而implemntation 方面, 係 code project 有更<a href="http://www.codeproject.com/aspnet/LocalizedSamplePart2.asp" target="_blank">詳細介紹</a>。</p>
<p>不過我都預計到個流量有返咁上下, 所以冇等量化語言, 反而開多幾個 column, 然後用 AS 依個 keyword, 咁係 presentation level 就唔需要改動任何野都可以好輕鬆咁做到多語系 (ASP.NET):</p>
<ul>
<li>Default.aspx.en.resx 入面有條叫 SQL1 既 string resource<br />SELECT name_en AS name FROM product</li>
<li>Default.aspx.zh-HK.resx 入面有條叫 SQL1 既 string resource<br />SELECT name_zh_hk AS name FROM product</li>
</ul>
<p>係個 Default.aspx 度:</p>
<p>&lt;neo:MySqlDataSource SelectCommand=&quot;&lt;%$ Resources: SQL1 %&gt;&quot; runt=&quot;server&quot; ID=&quot;MySQL1&quot; ConnectionString=&quot;&lt;%$ConnectionStrings: Default%&gt;&quot; /&gt;</p>
<p>&lt;asp:DataList DataSourceID=&quot;MySQL1&quot; runat=&quot;server&quot; ID=&quot;DataList1&quot; &gt;</p>
<p>&lt;ItemTemplate&gt;</p>
<p>&lt;%# Eval(&quot;name&quot;) %&gt;</p>
<p>&lt;/ItemTemplate&gt;</p>
<p>&lt;/asp:DataList&gt;</p>
<p>只要你個 page 既 culture set 岩, 咁就可以自動用到以上咁方面既功能, 甚至乎我個 MySqlDataSource 可以自動依據 culture 黎改 keyword 既 field, 咁就唔駛用到兩條 SQL 分別放係唔同既 resource file 度, 不過我有其他原因而冇咁做到。</p>
<p><b>Materialized View</b></p>
<p>之前提及過, denormalization 會有資料改動時遺漏既可能性, 咁使用 materilized view 就可以解決依個問題。不過, 速度上係 update 時都係冇提高到, 所以 nor 唔 normalize 都要睇情況, 而更重要既, 係我用緊既 MySQL 5.0 係唔 support materialized view, 相信要等到 6.0 或更後先 support。現時只有 Oracle 8 或以上先正提供, 其他就要用一大堆 triggers 先做得到, 諗起都煩, 所以都係不用為妙。</p>
]]></content:encoded>
			<wfw:commentRss>http://orz.hk/2007/09/11/1787/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>終於將公司個 online shop 既 Access database migrate 到去 MySQL</title>
		<link>http://orz.hk/2007/08/23/1776/</link>
		<comments>http://orz.hk/2007/08/23/1776/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 14:43:05 +0000</pubDate>
		<dc:creator>腦功仔</dc:creator>
				<category><![CDATA[開發心得]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Microsoft Access]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://test.orz.hk/?p=1776</guid>
		<description><![CDATA[流量太大, 用 Access 成日遇到 lock 住個 database, 而家 migrate 左去 MySQL, 快左好多之餘仲冇依個問題。 我都算保守, 冇一次過轉晒, 而係分階段轉。]]></description>
			<content:encoded><![CDATA[<p>流量太大, 用 Access 成日遇到 lock 住個 database, 而家 migrate 左去 MySQL, 快左好多之餘仲冇依個問題。</p>
<p>我都算保守, 冇一次過轉晒, 而係分階段轉。</p></p>
]]></content:encoded>
			<wfw:commentRss>http://orz.hk/2007/08/23/1776/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

