<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>tdtshのブログ&#187; データベース</title>
	<atom:link href="http://www.tdtsh.com/blog/archives/category/dba/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tdtsh.com/blog</link>
	<description>ソーシャルメディアとか スレートとか Google App Engine とかの事の備忘録</description>
	<lastBuildDate>Tue, 07 Feb 2012 05:03:26 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/category/dba/feed" />
		<item>
		<title>IaaS、PaaSに一番求めることは、システム運用管理がどれだけ容易になるか</title>
		<link>http://www.tdtsh.com/blog/archives/1095</link>
		<comments>http://www.tdtsh.com/blog/archives/1095#comments</comments>
		<pubDate>Tue, 08 Feb 2011 10:26:56 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Amazon EC2]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[インフラ]]></category>
		<category><![CDATA[クラウド]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=1095</guid>
		<description><![CDATA[IaaSプロバイダはどうやってマーケットを広げるのか？ PaaSレイヤを提供するのは簡単だが、そうすると顧客にはロックインされるという懸念が持ち上がる。顧客が管理の主導権を持てるというIaaSの利点でを維持したまま、どう [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
	IaaSプロバイダはどうやってマーケットを広げるのか？ PaaSレイヤを提供するのは簡単だが、そうすると顧客にはロックインされるという懸念が持ち上がる。顧客が管理の主導権を持てるというIaaSの利点でを維持したまま、どうやってPaaSの利点である、熟練を要する運用業務を顧客から不要にする、ということを提供できるだろうか</p>
<p>	その答えは運用を容易にするツールの提供だ。それはIaaS上に用意された、優れた（ベストプラクティスな）インフラで、可用性とスケールを実現するものだ。</p>
<p>	これがまさにAWS Elastic BeanstalkがTomcatを用いて行ったことである。</p>
<p>	<a href="http://www.publickey1.jp/blog/11/iaaspaas.html" target="_blank">IaaSとPaaSの違いはなくなろうとしている － Publickey</a>
</p></blockquote>
<p>個人的にはベンダロックインよりも、運用がどれだけ容易になるかが最大の関心事だったりする。<br />
運用にもスケールするかどうかが含まれていると考えています。</p>
<p>昨今のWEBサービス開発は、php等のスクリプト言語で作るのがあたりまえです。<br />
初期の開発者の単価が抑えられ、ホスティングサービス等を利用しやすいから。</p>
<p>で、幸運にもWEBサービスが流行ったら、フロントエンドのWEBアプリケーションも色々と性能改善をしつつ機能追加とかするのも大事ですけれど、ある程度の規模を超えるとストレージのレイヤ（データベース側）でがんばってスケールさせる必要が出てくる訳で、ミドルウェア含むインフラ層にもエンジニアを惜しみなく投入して、あの手この手で分散化する必要が出てきます。</p>
<p>最近は知りませんが少なくとも私の知る限り、php は Apache等のhttpデーモン のプロセスまたはスレッドにくっついて動く訳でして、永続的接続とかいう仕組みは有っても、アプリケーション全体でDBコネクションの数を制御したり、プーリングしたり、使いまわしたり、データベースアクセス専門のオブジェクト(DAO)をこさえて使いまわす、なんて事が簡単には出来ない訳でして、そこはもう Java Servlet の方が1階層タンデムな分そこのへんの作りこみが楽だから、ある程度の規模までならデータベースアクセスの観点からパフォーマンス面で有利だと思う訳でして、私がWEBアプリケーションとしてはマイナーな Java を選ぶ理由の1つです。</p>
<p>TCP/IPのコネクションを張るのはそこそこリソースを消費する訳だから、php でApacheのプロセス（スレッド）上減数に合せてコネクションを貼りっぱなし、なんて構成を最初はとったりする訳ですが、RDBMSサーバ側のリソースも結構ふんだんに用意する必要がありますし、規模が大きくなってくると、最近は安くなったとはいえスケールアップさせるのはソコソコ金がかかるんで、水平に垂直に分割したりレプリケートさせたりキャッシュしたりインフラ層でイロイロやらないといけないんで、安定させて性能を出すにはそれなりのコツというか、DBAなんていう職業が成立してしまう位イロイロな匠の技がある訳ですし、24時間365日運用するには、やはり訓練もドキュメンテーションもそれなりに必要になってきます。</p>
<p>で、最初の「運用がどれだけ容易になるか」の話ですが、こういう「インフラ系エンジニア」の下働きは、それなりに優秀な人材を集めなければいけないしコストがかかります。WEBサービスもマネタイズできないと単なるボランティアですからやはり収益性は大事な訳です。</p>
<p>誤解を恐れずに言うならば、インフラ系エンジニアは「システムの能力を最大限に引き出し（必要に応じて向上させて）たり、セキュリティ含むITをとりまくあらゆるリスクを軽減する為にイロイロとがんばる」訳ですが、それで収入が増えるとか言う事は無い、と考えられる事が多いわけです。特に経営層に。</p>
<p>これらはだんだんとコモディティ化してきているから、もし外注できるなら、どうせ金かけるなら優秀なソフトウェアエンジニアを中に雇いたい訳です。サービスをより良くするスピードこそ、競争力であり、収入を増やす為に必要だからです。</p>
<p>こういう事を書くと世の中のインフラ系のエンジニアの方を敵に回しそうなんで一応書いておきますが、価値を生むとか生まんとか以前に情報システムは運用してナンボ、作るだけじゃダメな訳で、運用管理も誰でも簡単に出来る訳じゃないです。Salesforceの様に、運用こそ差別化の最大要因だと言い切ってしまいたい所です。</p>
<p>さらにさまざまな問題を回避する事で、問題が発生した場合に損失しうる企業価値を損なわずにすむという面もありますんで、一概に要らないと言っている訳では無くて、AmazonやGoogleとかが、規模の原理を活かして、自社の優秀なエンジニアと運用のベストプラクティスを、IaaSやPaaSで提供しはじめている訳ですから、少なくともWEBサービスにおいては、ストレージ層も含めて「スケールする」インフラがセットで提供されはじめた今、「事業」として考えた場合、「外注」されやすい分野である事は間違いないでしょう。</p>
<p>要るとか要らないとか言う以前に、土俵というか、世の中のルールというかが変わって来たぞ、と。</p>
<p>そういう観点で、Google App Engine と AWS Elastic Beanstalk を比べると、App Engineの方が楽そうなんだよなぁ。<br />
でも、既存システムの移行の難易度で言うと、格段にBeanstalkの方が楽そうだなぁ。<br />
App Engineの方がスケールしそうだしなぁ。でもAWSの方が自由度高いしなぁ。</p>
<p>と、これからは、クラウドをコーディネートする力が求められそうですね。<br />
纏まりなくてすいません。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/1095" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/1095/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/1095" />
	</item>
		<item>
		<title>WEBでER図 WWW SQL Designer</title>
		<link>http://www.tdtsh.com/blog/archives/900</link>
		<comments>http://www.tdtsh.com/blog/archives/900#comments</comments>
		<pubDate>Fri, 03 Sep 2010 02:44:44 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=900</guid>
		<description><![CDATA[久々にERダイアグラムを書く機会がありました。 手元にツールが無くて、何かいいのないか探してたら、よさげなもの発見。 WWW SQL Designer phpなサーバがあれば、ダウンロードしたzipを展開して置くだけ。  [...]]]></description>
			<content:encoded><![CDATA[<p>久々にERダイアグラムを書く機会がありました。<br />
手元にツールが無くて、何かいいのないか探してたら、よさげなもの発見。</p>
<p><a href="http://code.google.com/p/wwwsqldesigner/">WWW SQL Designer</a></p>
<p>phpなサーバがあれば、ダウンロードしたzipを展開して置くだけ。<br />
成果物はXMLでExport/Importできる。</p>
<p>今まで紙とペンでやってましたけど、こりゃあ良いです。<br />
がっつり作りたい時はちゃんとしたのんが欲しくなりますが、分析フェーズとかちょこっとER図を書きたい時にはめちゃめちゃ便利です。<br />
ブラウザにブックマークしとくだけですし。</p>
<h4>参考サイト</h4>
<p><a href="http://ivystar.jp/database/er%E5%9B%B3%E4%BD%9C%E6%88%90%E3%83%84%E3%83%BC%E3%83%AB%E3%82%922%E3%81%A4%E7%B4%B9%E4%BB%8B/">ER図作成ツールを2つ紹介 | アイビースター</a></p>
<p><a href="http://labs.unoh.net/2007/10/erwww_sql_designer.html">ウノウラボ Unoh Labs: ブラウザでER図が描ける「WWW SQL Designer」紹介</a></p>
<p><a href="http://fdays.blogspot.com/2008/05/php-javascripterwww-sql-designer-www.html">floatingdays: WWW SQL Designerのインストール＆設定</a></p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/900" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/900/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/900" />
	</item>
		<item>
		<title>RDBMS脳では app engineのデータストアの概念で混乱する</title>
		<link>http://www.tdtsh.com/blog/archives/770</link>
		<comments>http://www.tdtsh.com/blog/archives/770#comments</comments>
		<pubDate>Sun, 04 Jul 2010 15:05:17 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[slim3]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=770</guid>
		<description><![CDATA[RDBMSを長くやっている人ほど、app engineのデータストアの概念で混乱する可能性が高いと思います。 自分もまだ時々判らなくなるので、一発整理しておきます。 まず、Entity (エンティティ) と聞くと、Cod [...]]]></description>
			<content:encoded><![CDATA[<p>RDBMSを長くやっている人ほど、app engineのデータストアの概念で混乱する可能性が高いと思います。<br />
自分もまだ時々判らなくなるので、一発整理しておきます。</p>
<p>まず、Entity (エンティティ) と聞くと、Codd博士のERモデルや、IDEF1Xとかの拡張ERモデルを思い浮かべてしまいます。<br />
いわゆるリレーショナル・データモデリングにおける「実態」を表すEntityは、RDB上のスキーマの設計の元になるもの、と刷り込まれているんです。</p>
<p>ですが、app engine の話をするとき、Entityという言葉は文字通り実体のほう、RDBにストアされた個々のインスタンス、つまり行、タプルをイメージするべきの様です。</p>
<p>私だけでしょうか。微妙に混乱します。</p>
<p>このへんの微妙な言葉のニュアンスから、Entity Group と リレーションを混同してしまうという弊害があるんじゃないでしょうか。<br />
実は私もそうでしたので。</p>
<p>Entity Group は Entity (＝オブジェクト、≒タプル) を保存するときに決まる(決める)もの。<br />
リレーションはデータクラスで定義し、Entityに保存する時に決めるもの。</p>
<blockquote><p>
エンティティグループはリレーションではない</p>
<p>祖先とか親とか子とかいう単語が出てくるので誤解しがちだけど、エンティティグループは、１：多のようなリレーションを表現するものではない。</p>
<p>トランザクションによりACID特性を保障したいときに設定するもの。</p>
<p>リレーションはkeyをコレクションで持ったり、Slim3のModelRefなどを使って表現する。<br />
<a href="http://d.hatena.ne.jp/kaw0909/20100601/1275398728">app engineのエンティティグループ &#8211; 理系のためのTIPS集</a>
</p></blockquote>
<p>あとkindという言葉も、これからGAEを学ぼうとする人には鬼門になるかもしれません。</p>
<p>Google App Engineの本とか記事とかを読んでいると良く出てくるんですけど、<a href="http://code.google.com/intl/ja/appengine/docs/java/datastore/dataclasses.html">日本語のGoogle Codeのドキュメント</a>を見ても、kindの説明はありません。<a href="http://code.google.com/intl/en/appengine/docs/java/datastore/dataclasses.html">原文</a>で読むとなんとなく判ってきます。</p>
<p>整理しておきます。</p>
<pre>
Entity (エンティティ)
	App Engine データストア内のデータ オブジェクト。
	key と プロパティ がセットされる。
	リレーショナルデータモデルで言うところのタプル。
	RDBMSで言うところの行、レコード。
	Javaでデータモデルを定義し、そのモデルのインスタンスを生成してDatastoreに
	保存したら、それがエンティティ。

プロパティ
	名前のついた値。Entityには1つ以上のプロパティがある。
	そのデータ型は整数、浮動小数点値、文字列、日付、バイナリ データなど。
	Jデータクラスのフィールドと(ほぼ)同義。

データクラス
	Javaでデータモデルを定義たクラス。

kind
	正確にはEntity's kindでしょう。
	Datastoreに保存されたエンティティのデータクラスの種類。
	リレーショナルモデルで言うところのスキーマ。
	RDBMSで言うところのテーブル。
</pre>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/770" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/770/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/770" />
	</item>
		<item>
		<title>RDBMS脳を変えるのは難しい &#8211; App Enine上でスケールするデータモデリングへの道</title>
		<link>http://www.tdtsh.com/blog/archives/752</link>
		<comments>http://www.tdtsh.com/blog/archives/752#comments</comments>
		<pubDate>Thu, 01 Jul 2010 14:00:59 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[slim3]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=752</guid>
		<description><![CDATA[slim3(App Engine/Java)のお勉強をしながら、良くあるパターンのブログサービス的なWEBアプリケーションを作っています。 ブログサービスの概念モデリングは、[ブログ] &#8211; [記事] &#82 [...]]]></description>
			<content:encoded><![CDATA[<p>slim3(App Engine/Java)のお勉強をしながら、良くあるパターンのブログサービス的なWEBアプリケーションを作っています。</p>
<p>ブログサービスの概念モデリングは、[ブログ] &#8211; [記事] &#8211; [コメント] の 3階層で Header-Detailになる事が多いと思います。</p>
<p>今までRDBMSばっかりやってたのですが、過去は3層で考えた概念スキーマをそのまま論理スキーマにしちゃって問題無かったです。</p>
<p>と言うか今でも私は正規化バンザイ派、概念スキーマをそのまま論理スキーマにしちゃえ派です。このへんは佐藤正美さんのT字形ER手法に強く影響されました。</p>
<p>で、App Engineで作ろうとするじゃないですか。<br />
時間が作れ次第おっかなびっくりやっているので遅々として進まない訳ですが。</p>
<p>まずは記事のCRUDを作ってみて、それは上手くいきました。<br />
で、最近やっと後回しにしていたリレーションシップとトランザクションに取り掛かっているわけです。</p>
<p>「Google App Engine （のKVS）では非正規化を恐れるな」なんて聞いていたものですから、記事Entityの親にあたるブログEntityについては、記事Entityの中に「ブログ名」として繰り返し項目にしちゃえばいいかと、結構簡単に考えていました。</p>
<p>で、いざやってみると、使い物にならない感じなんですね。</p>
<p>まず、記事Entity内で繰り返し項目になっちゃった「ブログ名」を、Distinctして取得したいと思ったんですが、Slim3では（App Engineでは）出来ません。</p>
<p>ならばGroup By で、とも思ったんですが、それもありません。</p>
<p>マニュアルは一度読んでるし、GAEの本も2冊ばかり読んだんですが・・・なんとなく判った気でいるのと、実際に手を動かして困ってみるのとでは、頭に入り方が大違いですね。</p>
<p>ならばと、Slim3の機能を使ってブログEntityと記事Entityを<a href="http://sites.google.com/site/slim3documentja/documents/slim3-datastore/relationships#TOC-1-1">双方向1対多関連</a>にしました。</p>
<p>これで目出度く ブログの一覧は取得出来る様になりました。当たり前ですが。</p>
<p>仕様として、記事Entityは、親であるブログEntity（カテゴリ）の変更というか、付け替えが出来ます。</p>
<p>普通にトランザクションでこれをやろうとすると、com.google.apphosting.api.ApiProxy$ApplicationException がスローされました。</p>
<p>これは自分のコードの書き方が悪いだけでして、異なるEntity Group での更新をしようとした事が原因、という事まではすぐに判りました。</p>
<p>本題はココからでして・・・</p>
<p>ブログEntityはオーナーだけが変更できます。<br />
記事もオーナーだけが書けます。</p>
<p>RDBMS脳では、[ブログ] &#8211; [記事] &#8211; [コメント] の 3階層 の外側に、[オーナー]Entityがいて、[ブログ]の外部キーになっているか、[オーナー・ブログ]連関テーブルがあるか、そんな感じです。</p>
<p>App Engineでは同一Entityグループでしかトランザクションが使えない。<br />
Entityグループが同一なら物理的な格納位置が近くなる（らしい）。</p>
<p>もしかして、[オーナー]でEntityグループをくくった方が良いのか？？？？</p>
<p>[オーナー] &#8211; [ブログ] &#8211; [記事] &#8211; [コメント] の 4階層？？？</p>
<p>Hibernate的に考えると、オーナークラスのプロパティでブログをSetとかのコレクションクラスで持たせてlazy loadingさせて、あとは記事、コメントと・・・そんな感じ？</p>
<p>それでスケールするのか・・・・？</p>
<p>この4階層の論理スキーマで良いのか、自信が持てないです。 <- イマココ</p>
<p>幸い、Slim3には「グローバル・トランザクション」なるものがあり、異なるEntity Group間での更新も出来る筈です。（まだ試していない）</p>
<p>一貫性を重視するか、スケーラビリティを重視するかで、論理スキーマが変わってきそうな気がします。</p>
<p>もうしばらく悩みそうです。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/752" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/752/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/752" />
	</item>
		<item>
		<title>Access 2010 では DBエンジンに SQL Azure が使える様になる</title>
		<link>http://www.tdtsh.com/blog/archives/679</link>
		<comments>http://www.tdtsh.com/blog/archives/679#comments</comments>
		<pubDate>Tue, 15 Jun 2010 02:03:26 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[oracle]]></category>
		<category><![CDATA[sqlserver]]></category>
		<category><![CDATA[クラウド]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=679</guid>
		<description><![CDATA[マイクロソフトのAccess 2010では、ODBCを通じてクラウド上のリレーショナルデータベースであるSQL Azureに直接接続可能だと、MS Officeチームのブログのエントリ「Access 2010 and S [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
マイクロソフトのAccess 2010では、ODBCを通じてクラウド上のリレーショナルデータベースであるSQL Azureに直接接続可能だと、MS Officeチームのブログのエントリ「Access 2010 and SQL Azure」で紹介されています。<br />
Access 2010 and SQL Azure &#8211; Microsoft Access &#8211; Site Home &#8211; MSDN Blogs</p>
<p>この機能を使えば、社内でSQL Serverの運用をすることなく、Access 2010から大規模なリレーショナルデータベースの機能を利用することができるようになります。」
</p></blockquote>
<p><a href="http://www.publickey1.jp/blog/10/access_2010odbcsql_azure.html">Access 2010からODBCでクラウドのSQL Azureに接続可能。そのメリットは？</a></p>
<p>JetエンジンのままAccessを多人数で使うのは、排他制御の面でも、性能の面でも、あまり宜しくないんですけど、現場によっては結構重宝されていますよね。</p>
<p>自動でシュリンクしないからファイルがどんどん肥大化するし、しょっちゅう壊れるし。<br />
せめてMSDE、今で言うとSQL Server Express Editionですかね、を使って欲しい訳です。</p>
<blockquote><p>
データベース管理者にとっては、SQL Serverのデータメンテナンスなど管理業務をAccessから行うことでずっと便利になるという指摘もいただきました。たしかに、それもぐっと楽になりそうです。
</p></blockquote>
<p>ODBCドライバさえあれば、OracleでもDB2でもデータ管理は出来ますね。<br />
SQL大好きな私にとってAccessのクエリを使うのは苦痛なんですけど、エンドユーザにはGUIで操作できるAccessは結構使いやすいみたいですね。</p>
<p>RDMBSはコモディティ化した感があります。<br />
今後のデータストアのプラットフォームは、完全にクラウド上での覇権争いになってきました。<br />
KVSで無くRDBMSじゃ無いと駄目な案件を、SQL Azure と VM Forceが受け皿になっていきそうな予感。</p>
<p>どうするOracle陣営。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/679" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/679/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/679" />
	</item>
		<item>
		<title>DBマガジン、休刊</title>
		<link>http://www.tdtsh.com/blog/archives/660</link>
		<comments>http://www.tdtsh.com/blog/archives/660#comments</comments>
		<pubDate>Tue, 01 Jun 2010 02:51:19 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[書評]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=660</guid>
		<description><![CDATA[DB マガジン、休刊 &#8211; スラッシュドット・ジャパン ニッチと言えばニッチなジャンルの雑誌だっただけに仕方ないですが、良く読んでた雑誌が消えていくのは、なんだか寂しいです。 一応RDBMS屋のつもりだった昔、 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://slashdot.jp/it/article.pl?sid=10/05/31/058214">DB マガジン、休刊 &#8211; スラッシュドット・ジャパン</a></p>
<p>ニッチと言えばニッチなジャンルの雑誌だっただけに仕方ないですが、良く読んでた雑誌が消えていくのは、なんだか寂しいです。</p>
<p>一応RDBMS屋のつもりだった昔、データベーススペシャリストの試験に受かるまで、1、2年くらい定期購読してたんですが、だんだんとWEBな人になってから、最近は読んでませんでした。</p>
<p>自分の興味の対象がデータそのものからサービスに向かっちゃった事で、面白く読めなくなってきたんですね。</p>
<p>関係者の方々はお疲れ様でした。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/660" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/660/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/660" />
	</item>
		<item>
		<title>Excelでテーブル定義書を出力できるデータベース管理ツール CSE (Common SQL Environment)</title>
		<link>http://www.tdtsh.com/blog/archives/373</link>
		<comments>http://www.tdtsh.com/blog/archives/373#comments</comments>
		<pubDate>Thu, 10 Sep 2009 02:37:38 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=373</guid>
		<description><![CDATA[今まで色んなデータベース管理ツール（特に無償のん）を使ってきたけど、使用頻度といい、期間といい、圧倒的にこれがナンバーワン。 CSE(Common SQL Environment) ワタシにとって手放せない理由は、さくっ [...]]]></description>
			<content:encoded><![CDATA[<p>今まで色んなデータベース管理ツール（特に無償のん）を使ってきたけど、使用頻度といい、期間といい、圧倒的にこれがナンバーワン。</p>
<p><a href="http://www.hi-ho.ne.jp/tsumiki/"> CSE(Common SQL Environment)</a></p>
<p>ワタシにとって手放せない理由は、さくっとExcelでテーブル定義書を出力してくれる所。<br />
全体的にすんごく動作が軽い事もイイし、スプレッドシート感覚でデータ操作もできる。<br />
SQL文の実行もできる。OracleでいうObject Browserの様なもの。</p>
<p>残念ながら、2002年からメンテナンスはされていない様ですが、ODBCドライバのインストールと設定さえしてあれば、今でも使えます。<br />
ODBCでイケるから、MySQLだろうがPostgreSQLだろうが、SQL Serverも、DB2も、勿論Oracleも使えます。</p>
<p>多少ならお金払いますから、是非メンテナンスを継続して頂きたい。</p>
<p>Windowsちょっとイイツール紹介シリーズその1でした。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/373" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/373/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/373" />
	</item>
		<item>
		<title>Spring Framework の SqlUpdate で OracleのclobをInsert・Updateする</title>
		<link>http://www.tdtsh.com/blog/archives/363</link>
		<comments>http://www.tdtsh.com/blog/archives/363#comments</comments>
		<pubDate>Wed, 09 Sep 2009 07:08:44 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=363</guid>
		<description><![CDATA[Spring Framework から Oracle の CLOB や BLOG を扱う事がある。 Oracle9i の頃から、LOB にはちょっと苦労させられた。 9iの頃のJDBCドライバ(Thin)では、文字数の制 [...]]]></description>
			<content:encoded><![CDATA[<p>Spring Framework から Oracle の CLOB や BLOG を扱う事がある。<br />
Oracle9i の頃から、LOB にはちょっと苦労させられた。</p>
<p>9iの頃のJDBCドライバ(Thin)では、文字数の制約で色々めんどくさかったけど、<br />
10g以降のJDBCドライバでは、いい感じに変換してくれるのか、CLOBフィールドの参照系ならVARCHAR感覚でコーディングできてた。<br />
でも、更新系では手抜きが通じない。<br />
8000バイト位(多分8192バイト)を超える文字列をInsert/Updagteすると、文字列が一部欠落してしまう。<br />
こっちはいい感じに変換してくれない。</p>
<p>仕方ないから、LobHandlerを使ってちゃんと書いた(つもり)。</p>
<p>Spring は未だに 1.2 を使ってマス。<br />
Sprint 2系でも、いっしょじゃないだろうか。</p>
<p>設定はこんな感じで、lobHanderをインジェクションする。</p>
<blockquote><p>
    ＜bean id=&#8221;lobHandler&#8221; class=&#8221;org.springframework.jdbc.support.lob.OracleLobHandler&#8221;＞<br />
        ＜property name=&#8221;nativeJdbcExtractor&#8221; ref=&#8221;nativeJdbcExtractor&#8221;/＞<br />
    ＜/bean＞</p>
<p>	＜bean id=&#8221;nativeJdbcExtractor&#8221; class=&#8221;org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor&#8221;/＞
</p></blockquote>
<blockquote><p>
＜bean id=&#8221;abstractDao&#8221; abstract=&#8221;true&#8221;＞<br />
	＜property name=&#8221;dataSource&#8221;＞<br />
		＜ref bean=&#8221;dataSource&#8221; /＞<br />
	＜/property＞<br />
＜/bean＞</p>
<p>＜bean id=&#8221;hogeDao&#8221; parent=&#8221;abstractDao&#8221;<br />
	class=&#8221;your.package.dao.HogeDaoImpl&#8221; ＞<br />
	＜property name=&#8221;lobHandler&#8221;＞<br />
		＜ref bean=&#8221;lobHandler&#8221; /＞<br />
	＜/property＞<br />
＜/bean＞
</p></blockquote>
<p>org.springframework.jdbc.object.SqlUpdate を継承したクラスを作る。<br />
Types は CLOBに。後は特に留意点なし。</p>
<blockquote><p>
package your.package.dao.sql;</p>
<p>import java.sql.ResultSet;<br />
import java.sql.SQLException;<br />
import java.sql.Types;<br />
import javax.sql.DataSource;</p>
<p>import org.springframework.jdbc.core.SqlParameter;<br />
import org.springframework.jdbc.object.SqlUpdate;</p>
<p>public class Create extends SqlUpdate {</p>
<p>	public Create(DataSource ds) {<br />
		super(ds, QUERY);<br />
		super.declareParameter(new SqlParameter(Types.INTEGER)); // ID<br />
		super.declareParameter(new SqlParameter(Types.CLOB)); // Clob Data<br />
		compile();<br />
	}</p>
<p>	private static final String QUERY = &#8220;INSERT INTO Table (ID, CLOBFIELD) VALUES ( ?,? )&#8221;;
</p></blockquote>
<p>んで、org.springframework.jdbc.core.support.JdbcDaoSupport を継承して、さっきのSqlUpdateクラスを使う。<br />
DIしたlobHandler を使って、 SqlLobValueを生成してあげる。</p>
<blockquote><p>
package your.package.dao.sql;</p>
<p>public class HogeDaoImpl extends JdbcDaoSupport {</p>
<p>	public HogeDaoImpl() {<br />
		super();<br />
	}</p>
<p>	private LobHandler lobHandler_; </p>
<p>	public void setLobHandler(LobHandler lobHandler) {<br />
		lobHandler_ = lobHandler;<br />
	}</p>
<p>    public void save(Object entityBean) {<br />
		BeanOfTable bean = (BeanOfTable) entityBean;<br />
		SqlLobValue clobField = new SqlLobValue(bean.getBody(), lobHandler_);<br />
		String id             = bean.getId();<br />
		Create create = new Create(getDataSource());<br />
		create.update(new Object[]{ id, clobField });<br />
	}</p>
</blockquote>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/363" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/363/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/363" />
	</item>
		<item>
		<title>java.sql.SQLException: 列索引が無効です。</title>
		<link>http://www.tdtsh.com/blog/archives/343</link>
		<comments>http://www.tdtsh.com/blog/archives/343#comments</comments>
		<pubDate>Fri, 04 Sep 2009 11:07:13 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=343</guid>
		<description><![CDATA[Spring Framework の JdbcTemplate を使ってて、こんなんでました。 java.sql.SQLException: 列索引が無効です。 [commons-dbutils] エラー：列索引が無効で [...]]]></description>
			<content:encoded><![CDATA[<p>Spring Framework の JdbcTemplate を使ってて、こんなんでました。</p>
<pre>
	java.sql.SQLException: 列索引が無効です。
</pre>
<p><a href="http://blogs.yahoo.co.jp/e_coc_e/4957344.html">[commons-dbutils] エラー：列索引が無効です。 &#8211; メモ！メモ！ &#8211; Yahoo!ブログ</a><br />
によると、</p>
<pre>
	PreparedStatementのプレースホルダの数と、設定しているパラメータの数が合っていない。
</pre>
<p>らしい。</p>
<p>が、数は有っている。</p>
<p>散々悩んだ挙句、ResultSetのgetXX の引数が、途中で間違ってた。<br />
こんな感じ。</p>
<pre>
	bean.setValue1(rs.getString(1));
	bean.setValue2(rs.getString(2));
	bean.setValue8(rs.getString(8));
	bean.setValue4(rs.getString(4));
	bean.setValue5(rs.getString(5));
	bean.setValue6(rs.getString(6));
</pre>
<p>実際は、列の数が200以上ある様なケースだったので、なかなか判らなかったのだ。</p>
<p>自戒の意味を込めて、書いておこう。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/343" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/343/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/343" />
	</item>
		<item>
		<title>MS SQL Server 2000について、 2002年頃に書いたメモ</title>
		<link>http://www.tdtsh.com/blog/archives/226</link>
		<comments>http://www.tdtsh.com/blog/archives/226#comments</comments>
		<pubDate>Thu, 06 Aug 2009 04:28:39 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[sqlserver]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=226</guid>
		<description><![CDATA[ロックアーキティクチャ ロックの自動エスカレーション SQL Server 2000のロックは、動的にロック方法を自動判断して行われる。 行ロック・ページロック・DBロック 上記のチューニングとしてMS SQLでは&#8 [...]]]></description>
			<content:encoded><![CDATA[<h3>ロックアーキティクチャ</h3>
<h4>ロックの自動エスカレーション</h4>
<p>SQL Server 2000のロックは、動的にロック方法を自動判断して行われる。</p>
<p>	行ロック・ページロック・DBロック</p>
<p>上記のチューニングとしてMS SQLでは&#8221;分離レベル&#8221;の設定 が4つある。<br />
下に行くほどデータの整合性が上がるが、デッドロックが起こりやすくなる。<br />
OLTPの場合、余程大勢でInsert、Updateをしない限り、デフォルトでいいんじゃないかと思う。<br />
トランザクションを使用する場合は、明示的に 3) を選択 (後述) する場合もあるかも知れない。<br />
但し、トランザクションは短めに。</p>
<p>  1) READ UNCOMMIITTED<br />
    ユルユル。ダーティリード可能</p>
<p>  2) READ COMMITTED<br />
    コミット済み読み取り (SQL Server の既定の分離レベル)</p>
<p>  3) REPEATABLE READ </p>
<p>  4) SERIALIZABLE<br />
    直列化 (各トランザクションが完全に分離される最高の分離レベル) </p>
<h4>明示的なロック</h4>
<p>ロックは明示的にもできる。ロックヒントと呼ばれるモノをSQLステートメントに挿入ればいい。</p>
<pre>
   SELECT * FROM TABLE_NAME  WITH (ROWLOCK) WHERE FIELD_NAME = 'hoge'
</pre>
<p>WITHのとこのロック種類はこんなにある。</p>
<ul>
<li>FASTFIRSTROW</li>
<li>HOLDLOCK</li>
<li>NOLOCK</li>
<li>PAGLOCK</li>
<li>READCOMMITTED</li>
<li>READPAST</li>
<li>READUNCOMMITTED</li>
<li>REPEATABLEREAD</li>
<li>ROWLOCKSERIALIZABLE</li>
<li>TABLOCK</li>
<li>TABLOCKX</li>
<li>UPDLOCK</li>
</ul>
<h4>ロック競合</h4>
<p>ロックが競合した時のタイムアウト設定があるらしい。</p>
<pre>
    SET LOCK_TIMEOUT [timeout_period(ミリ秒単位)]デフォルト0ミリ秒
</pre>
<p>と言う事は、トランザクションが失敗した時の処理をキチンと実装しなければ(ロールバック->コネクトクローズ)、タイムアウトまで待ちっぱなしになると言う事になると言う事だろうか。</p>
<p>ロックの状況は、エンタープライズマネージャで確認できる。ストアドプロシージャ(sp_lock)、master.syslockinfoテーブルでも確認できる。</p>
<p>参考サイト<br />
<a href="http://www.itmedia.co.jp/enterprise/0207/05/02070501.html">ZDNet SQL Serverのデットロックを防ぎ同時実行性を向上させよう</a></p>
<p><a href="http://msdn.microsoft.com/ja-jp/library/cc707374.aspx">トランザクション分離レベルの選択とデッドロックの問題～ SQL Server 2000 における Web アプリケーション開発 ～</a></p>
<h3>テーブル増時のパフォーマンスは？インデックス vs DB分割</h3>
<p>RDBMSをスケールさせる為に、データを垂直分割したいときがある。<br />
それに備えて、DB設計時から垂直分割するのは是か非か。<br />
SQL Serverは1つのインスタンスに複数のデータベースが作れる。<br />
貧乏なウチは、1つの物理サーバかつインスタンスで、複数のデータベースを作って、データを垂直分割し、アプリケーション側で何の工夫もせずに、SQLだけで検索できなくもない。<br />
例えば、2億レコードの単一DB と、 10万レコードの200個のデータベースとで、どれ位のパフォーマンスの差がでるだろう。<br />
一般的に、テーブルが分かれると発行するSQL文が増える為、パフォーマンスが低下するのだけど、設計とSQLの作りにもよるし、実際に検証しなければわからない。<br />
時間があれば一度検証してみたい。</p>
<h3>物理ディスク構成</h3>
<p>最低でも、データベースファイルとトランザクションログファイルは物理的に分けたい。<br />
SANにデータベースファイル、ローカルHDDにトランザクションログファイルとか。</p>
<h3>APIはあるの</h3>
<p>ある。BOL参照。インストール時にカスタムを選択し、開発ツールを選択すると、スクリプトのサンプルもインストールされる。</p>
<h3>phpからデータベースサーバへの接続方法(ミドルウェア)</h3>
<p>MS SQL Serverの接続方法には色々あるが、PHPでの使用となると、ODBC関数の使用もしくはMS SQL関数の使用の2つが用意されている。</p>
<p>下記2つのパフォーマンスの善し悪しは、比較検証して見ないと分からない。</p>
<p>1)MS SQL関数<br />
MS SQL関数は、MS SQLクライアントツール&#8221;ntwdblib.dll&#8221;を必要とする。<br />
このモジュールは、DB-Libraryと呼ばれる呼び出しインターフェースで、MS SQL Server6.5の頃の古いAPIである。下位互換の為に用意されているようで、MS SQL Server2000で用意された新機能を使う事が出来ないらしい。Unicodeにも非対応である(非対応の意味が良く分からないが)。</p>
<p>2)ODBC関数<br />
ODBC3.7以上では、Unicodeをサポートするようだ。(要検証)<br />
正確には、MDAC 2.1以上 または SQL Server ODBC ドライバ (バージョン 3.70.0623 以降) または OLEDB プロバイダ (バージョン 7.01.0623 以降(MS KB JP234748)。<br />
MS SQL Serverをインストールすると、MDAC2.6がインストールされるようだ。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/226" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/226/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/226" />
	</item>
	</channel>
</rss>

