[MySQL] MySQL Workbenchで既存データベースのER図を表示する

SQL Workbenchを起動。

MySQL-Workbench_00

まずは[MySQL Connections]の[+]アイコンをクリックしてMySQLへの接続を定義する。

Setup-New-Connection_01

データベースサーバーの情報を入力して[OK]ボタンを押下する。

MySQL-Workbench_01

接続が定義されると画面にイルカのセルが追加される。

SnapCrab_MySQL-Workbench_2014-7-22_15-33-46_No-00

画面下側の[Models]の[>]アイコンをクリックして、表示されたメニューから[Create EER Model from Database]を選択。後は画面に表示されるメッセージに従って操作し(ほとんど全てデフォルトのまま)。途中データベースを選択すると、そのデータベースのER図が画面に表示される。

MySQL-Workbench_001

ER図の描画機能はほんの一部で、他にもデータベースの設計・管理に役立つ多彩な機能が備わっているらしい。使い込んで行きたい。

参考サイト

mysqlのWorkbenchで実DBからER図を自動生成 – end0tknrのkipple – web写経開発
http://d.hatena.ne.jp/end0tknr/20110506/1304636491

MySQL WorkbenchでER図を作成する方法
http://promamo.com/?p=1979

[MySQL] ER図を描けるフリーソフトを探す

ER図を書きながらデータベーススキームを設計したい。というわけで、ER図を描けるフリーソフトを探してみた。

まとめページ

ER図を描けるフリーソフト、お薦めは? – 人力検索はてな
http://q.hatena.ne.jp/1129877761

色々なER図作成ツール – 文系プログラマによるTIPSブログ
http://treeapps.hatenablog.com/entry/20110505/p1

ExcelERD

ExcelERDの詳細情報 : Vector ソフトを探す!
http://www.vector.co.jp/soft/winnt/business/se358397.html?y

DBDesigner

fabFORCE.net
http://www.fabforce.net/dbdesigner4/index.php

matalab: フリーのER図作成ソフト「DBDesigner4」がいい!
http://matalab.blogspot.com/2010/12/erdbdesigner4.html

ER図モデリングツール DBDesigner: プログラマの思索
http://forza.cocolog-nifty.com/blog/2004/10/er_dbdesigner.html

ERMaster

ER Master (Eclipse用プラグイン)
http://ermaster.sourceforge.net/index_ja.html

ユカイ、ツーカイ、カイハツ環境!(11):DB設計の神ツール「ERMaster」なら、ここまでできる (1/3) – @IT
http://www.atmarkit.co.jp/ait/articles/1001/21/news128.html

A5:SQL Mk-2

A5:SQL Mk-2 – フリーの汎用SQL開発ツール/ER図ツール
http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/

「A5:SQL Mk-2」という変態(←褒め言葉)なソフトがあった – そろそろ脳内ビジネスの話をしようか
http://blogs.bizmakoto.jp/noubiz/entry/16683.html

設計書/ER図の出力も。高機能データベースメンテナンスソフトウェア·A5:SQL Mk-2 MOONGIFT
http://www.moongift.jp/2011/11/20111123-3/

データベースを使った開発をする時に便利なフリーソフト
http://blog.satt.jp/article/286580331.html

MySQL Workbench

MySQL :: MySQL Workbench
http://www-jp.mysql.com/products/workbench/

モデリングツールから管理・開発統合環境に進化したMySQL Workbench 6.0 | Think IT(シンクイット)
http://thinkit.co.jp/book/2013/10/21/4571

[MySQL] 外部キー制約を設定してリレーションを頑強にする

MySQL覚え書き。必須じゃないけど考慮しておくといざというときに役に立ちそうな「外部キー制約」。

外部キー制約とは

あるテーブルから別のテーブルを参照するために、別のテーブルのIDを「外部キー」として格納している場合、別のテーブルのIDが勝手に変更されたり削除されたりすると、2つのテーブル間の紐付けができなくなってしまう。これを避けるために、テーブル間の連携で使われる値に一定の条件を設けておくと良い。これを行うのが「外部キー制約」である。

外部キー制約を設定することで

  • 参照する側に挿入されるデータを、参照される側に存在しているデータのみに限定することができる。
  • 参照される側の値を変更した場合には、エラーを表示するか、参照する側のデータを同様の値で更新またはNULL値を挿入することができる。
  • 参照される側の値が削除される場合も、エラーを表示するか、参照する側のデータを削除またはNULL値を挿入することができる。

外部キー制約の設定方法

定義済みのテーブルに対して外部キー制約を設定するには以下のようにする。

更新時と削除時の制約条件はマニュアルを参照のこと。手っ取り早く更新と削除を禁止してエラーとするならRESTRICTと指定する。

外部キー制約を設定しておくことで、例外的なデータベース操作が行われたときのフェイルセーフを向上させることができそうに思える。システムを強固にするために、考慮しておくに越したことはない。

参考サイト

MySQL :: MySQL 5.1 リファレンスマニュアル :: 13.5.6.4 FOREIGN KEY 制約
http://dev.mysql.com/doc/refman/5.1/ja/innodb-foreign-key-constraints.html

今から始める MySQL入門(8):外部キー制約を活用する (1/3) – @IT
http://www.atmarkit.co.jp/ait/articles/0707/17/news113.html

MySQL 外部キー制約(FOREIGN KEY) | MySQL入門~bituse~
http://bituse.info/mysql/17

[MySQL] OR検索をFIND_IN_SET()関数を使って記述する

以前のエントリでFIND_IN_SET()関数の用法を紹介したけど。今回はその派生的なトピックス。ちょっと変わったFIND_IN_SET()の使い方かも。たとえば

は、FIND_IN_SET()を使うと以下のように書ける。

参考サイト

MySQL :: find_in_set() 関数 [Tipsというかメモ]
http://tm.root-n.com/database:mysql:etc:find_in_set

FIND_IN_SET()の用法に関しては以下マニュアルページを参照。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.3.2 文字列関数
http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html

[MySQL] テキストにはVARCHAR型と?TEXT型のどちらを使うべきか?

MySQLのテキスト型にはVARCHARと?TEXT(TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT)がある。長さの制限が違うだけで、どれを使ってもテキストを格納できるが、それぞれ特性は違うのだろう。プログラミングを実践する上でどのテキスト型を使うのが適切なのか判断できるように、これらの違いについてきちんと理解しておきたい。

ざっくりググってみると、テキスト型の違いを論じているページがいろいろ見つかる。

Takahiko HORIUCHI – Google+ – RDBMS に MySQL を採用したシステムで、VARCHAR の代わりに TEXT…
https://plus.google.com/113405959631093302363/posts/E4tDXucskqb

VARCHAR と ?TEXT の違い – ngの日記
http://ngyuki.hatenablog.com/entry/20110804/p1

MySQLのテキスト型 | Koumei Soft 開発ログ
http://blog.ks2.info/?p=462

mysqlのvarchar型 – Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1256083387

MySQLのVARCHARサイズについて – Togetter
http://togetter.com/li/54358

一番上のページからリンクされていた英語ページの説明が的を得ている。

TEXT vs. VARCHAR
http://www.pythian.com/blog/text-vs-varchar/

MySQL: TEXT vs. VARCHAR Performance | NicJ.net
http://nicj.net/mysql-text-vs-varchar-performance/

これらのページを読んでわかったことは、MyISAMストレージエンジンに限って言えば「VARCHAR型はDBストレージ内にデータそのものが格納されるが、TEXT型だとデータは外部に格納されてDBストレージにはそのポインタが格納される」ということ(InnoDBは違うらしい)。これより、データのアクセス速度は、ポインタを追ってデータの実体にたどり着かなければならないTEXT型よりも、DBストレージに直接データが格納されているVARCHAR型のほうが高速であることは容易に推測できる。さらに、TEXT型のサイズに神経質になる必要が無い反面、VARCHAR型のサイズはデータベースのストレージサイズの制限に影響されるので、大きいサイズのデータをVARCHAR型で格納することはコスト高になることも想像に容易い。

さらに、2番目の英語ページでは以下の結論で結んでいる。

  • ストレージの使い方に由来して、TINYTEXTを使うよりもVARCHARを使ったほうが望ましい。
  • NULL以外のDEFAULT値をセットしたい場合には、VARCHAR(あるいはCHAR)を使うしかない。
  • ざっと64KBよりも長い文字列を格納する必要がある場合は、MEDIUMTEXTやLONGTEXTを使う。VARCHARは64KBより長い文字列を格納できないから。
  • マルチバイト文字列を格納する場合には更に注意が必要。VARCHAR(255)は255文字を格納できるが、マルチバイト文字列を使う場合にはデータサイズが255バイトよりも大きくなることに注意。

小規模なシステムでは大した問題にはならないが、マスなデータを取り扱うシステムではVARCHAR型と?TEXT型の選び方が大事だろう。自分がどうしてVARCHAR型あるいは?TEXT型を選んだのか、きちんとした理由が説明できるようにしておきたい。

[MySQL] データベースを使ってApacheのBasic認証を行うには (mod_auth_mysql)

会員制サイトを簡単に運営するにはApacheのBasic認証が便利。パスワードを平文で記述した.htaccessファイルをウェブから見えないパスに置いておけばとりあえず事は足りる。しかし会員数が増えてくると.htaccessをいちいちスキャンする必要があるのに加えて、たった1個の平文のテキストファイルに認証を委ねるのはリスクあり。すなわち、パフォーマンスと安全性を考えると.htaccessには限界がある。

mod_auth_mysqlモジュールを使う

ApacheにはMySQLに登録されている会員情報を使ってBasic認証を行う仕組みが用意されている。具体的にはmod_auth_mysqlモジュールを追加して行う。今回そういうセットアップの必要があったので、覚え書きとして本家サイトと参考にさせてもらったサイトのリンクを記しておく。

mod_auth_mysql
http://modauthmysql.sourceforge.net/

Apacheの基本認証をDBを使って行うmod_auth_mysql – プログラマになりたい
http://d.hatena.ne.jp/dkfj/20101030/1288443379

mod_auth_mysqlを利用してBasic認証にMySQLのデータを利用する – blog.katsuma.tv
http://blog.katsuma.tv/2007/10/mod_auth_mysql_basic_auth.html

[MySQL] 計算式を指定するには

MySQLのテーブルを複数フィールドの値を使った計算結果で抽出したりソートしたい。例えば、ブログの記事に対して読者が星1つから5つの間で評価を行い、データベースの記事レコードには星の数と評価数が積算されているような状況で、平均の星数の大きい順にソートして記事を表示するにはどうするか、みたいな話。

SQL中で算術演算子を使う

SQL中では算術演算子が使えるので、以下のように書ける。

演算子についていろいろ知っておくと役立ちそう。

参考サイト

MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.4.1 算術演算子
http://dev.mysql.com/doc/refman/5.1/ja/arithmetic-functions.html

nakamura-tech : MySQL入門 – SELECT(2) ソート
http://blog.livedoor.jp/nakamura_tech/archives/51297132.html

[MySQL] カンマ区切りの部分文字列を検索するには

MySQLのテーブルにカンマ区切りの部分文字列を格納しているフィールドがあり、そのフィールドに特定文字列を含むレコードだけを抽出したい。例えば、このブログのエントリがレコードだとすると、レコードごとに複数のタグを付けることができて、特定のタグが付いているレコードのみを抽出するような場合とか。

  • 記事1、”タグ1,タグ2,タグ3″
  • 記事2、”タグ2”
  • 記事3、”タグ2,タグ3″

カンマ区切りの部分文字列のチェックには FIND_IN_SET を使う

単純に LIKE でタグ文字列との合致をチェックしても可能だけど、MySQLには、まさに部分文字列との合致をチェックするための関数 FIND_IN_SET がある。せっかくあるなら使うに限る。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.3.2 文字列関数
http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html

ソースは以下のサイト。

MySQLでカンマ区切りデータの中から検索する便利なFIND_IN_SET関数 | ハチログ
http://www.hachi-log.com/mysql-find-in-set/

[PHP] PHPUnitをXAMPPにセットアップする

PHPUnitはPHP版のxUnit、すなわちユニットテスト自動化のためのフレームワーク。

さほどPHP暦が長くない自分はこれまでテストを書いてこなかったのだけど、現在携わっているプロジェクトの複雑さが増すにつれてテストの必要性を感じるようになった。そこで、ローカルのXAMPP環境にPHPUnitをインストールして、テストの書き方や実施方法などを学習してみようと思う。

以下インストールの覚書。

公式サイト

PHPUnit – The PHP Testing Framework
http://phpunit.de/

PHPUnit マニュアル
https://phpunit.de/manual/current/ja/index.html

インストール

PHPUnit マニュアル – 第1章 PHPUnit のインストール
https://phpunit.de/manual/current/ja/installation.html#installation.optional-packages

1. PHP バイナリ用のディレクトリを作ります(例:C:\bin)

2. ;C:\bin を、環境変数 PATH に追記します (参考資料)。

3. https://phar.phpunit.de/phpunit.phar をダウンロードして、 C:\bin\phpunit.phar に保存します。

4. コマンドプロンプトを開きます ( Windows+R » cmd » ENTER)。

5. 以下のようにして、バッチスクリプト (C:\bin\phpunit.cmd) を作ります。

(僕の環境はphpのパスが通っていなかったのでphpをフルパスで指定するように変更)

6. コマンドプロンプトをもう一枚開き、どこからでも PHPUnit を実行できることを確認します。

試しにテスト

PHPUnit マニュアル – 第2章 PHPUnit 用のテストの書き方
https://phpunit.de/manual/current/ja/writing-tests-for-phpunit.html

テストコード StackTest.php

実行する。

参考サイト

PHP開発者のためのテストのすゝめ(1):ユニットテストはなぜ必要なの? (1/2) – @IT
http://www.atmarkit.co.jp/ait/articles/0909/14/news103.html

PHP開発者のためのテストのすゝめ(2):PHPUnitでユニットテスト (1/3) – @IT
http://www.atmarkit.co.jp/ait/articles/0911/12/news105.html

PHPUnit3で始めるユニットテスト:特集|gihyo.jp … 技術評論社
http://gihyo.jp/dev/feature/01/php-test

[PHP] 関数に引数を参照渡しする

PHPでも関数の引数を参照渡しできる。

参照渡しするには変数に&を付ければ良い。

参考サイト

PHP: 関数の引数 – Manual
http://php.net/manual/ja/functions.arguments.php

PHP: リファレンス渡し – Manual
http://php.net/manual/ja/language.references.pass.php