以前在籍していた会社では、B2BのwebマーケティングASPサービスを開発していましたが、B2Bサービスの基本は、利用したツールのログや取得した情報のレポーティングにあります。
企業がお金を出してサービスを利用する時に、そのサービスの費用対効果がどのくらいかを気にします。
よくテレビで格安飲食店などを特集していると、「モトを取った」というような表現をしていますが、まさにヒトはモノを取ったかどうかを気にします。
そこで、このサービスを使って、どのくらいの効果があったかをレポート画面で数字にして表示してあげることで、サービスで支払っている金額以上に効果が出ていた事を実感でき、その後のサービス継続に繋がるという事なんですが、
このサポートサービスをSQLデータベースを一切使わずに構築しているという事を採用面談などでエンジニアに伝えると、みなさんかなりインパクトを覚えて、食いついてきます。
「どうやってやってるんですか?」という風に目をキラキラさせながら、聞いてくるので、今回のテキストデータベースという手法を教えると、そんなやり方でどうやってパフォーマンスを出すのか理解できずにいますが、これでSQL以上のクオリティとサーバーコストを極限まで抑えることができるという内容を説明すると、かなりの確率でエンジニア採用をすることができました。
今回は、テキストデータベースの簡単なサンプルプログラムを使って、技術的な解説を行ってみたいと思います。
サーバーサイドプログラムは基本的にPHPを使って行いますが、真新しい機能は一切使わないので、バージョンは比較的古くても使えるはずです。
ただし、eval関数を使う場合があるので、ホスティングサーバーやレンタルサーバーなどでは関数制限されている場合もあるので、できれば、ローカルPCのバーチャルOSか、コンテナOSで検証していただき、クラウドサーバー系でご利用ください。
データの書き込み(登録)のソースコードと解説
前回説明した「CSV、JSON、複数行JSON」の3パターン別にみてみましょう。
<?php
namespace textDatabase;
/**
* 取得したデータをテキストファイルに書き込む方法色々
*/
class dataWrite{
// strstring convert
public static function stringEncode($string){
$string = str_replace("&" , "&" , $string);
$string = str_replace("," , "," , $string);
return $string;
}
// csv
public static function write_csv($filename , $datas){
$lines = "";
foreach($datas as $data){
$lines .= self::stringEncode($data["name"]) .",";
$lines .= self::stringEncode($data["count"]) .",";
$lines .= self::stringEncode($data["price"]) .",";
$lines .= "\n";
}
file_put_contents($filename.".csv" , $lines , FILE_APPEND);
}
// json
public static function write_json($filename , $datas){
$data = json_encode($datas , JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
file_put_contents($filename.".json" , $data);
}
// json multi
public static function write_json_multi($filename , $datas){
$lines = "";
foreach($datas as $data){
$lines .= json_encode($data , JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ."\n";
}
file_put_contents($filename.".multi.json" , $lines , FILE_APPEND);
}
}
namespaceとclassで書いてライブラリにしやすく書いてみました。
やっていることはシンプルなので、お好きに改造してお使いください。
ポイントは、受け取ったデータをそれぞれの方式で変換して、書き込んでいるのですが、
追記型のcsvと複数業型jsonは、最後に必ず改行コードを追加している点に注意しましょう。
レコードの切り替え単位が改行コードになるので、これがないとデータが壊れることになります。
また、OS毎に改行ルールが違っているのですが、扱いやすい"¥n"に統一しておく事も重要です。
csvデータは区切り文字と基準文字であるカンマ(,)とアンパサンド(&)をそれぞれ文字列変換してますが、変換している順番を逆にするとデータ損傷になってしまうので、注意しましょう。
注意すべき点は、送られてくるデータが、複数のデータを配列で受け取っているんですが、基本的には単一データを送る事を想定しておき、複数データの場合は送り側のプログラムで複数回行う方が汎用性が増します。
※今回はデモ用にしてます。
json_encodeのoption値は、それぞれ必要に応じて変更してお使いください。
今回は、jsonフォーマットは、マルチバイト対応と、バックスペースが不意に入らない指定と、見た目が改行整形されるoption、などを使っています。
プログラム実行と結果
同じデータをそれぞれ3パターンの方法でテキストに書き出してみます。
それぞれの書き込まれた後の状態を把握して、どういうケースの時にどの書式を使うかをイメージできると設計する時にパターン別に処理ができるでしょう。
// test-data
$datas = array(
array(
"name" => "apple",
"count" => 10,
"price" => "1,200"
),
array(
"name" => "orange",
"count" => 20,
"price" => "3,000"
),
array(
"name" => "banana",
"count" => 1,
"price" => 98
)
);
// test-write
\textDatabase\dataWrite::write_csv("data" , $datas);
\textDatabase\dataWrite::write_json("data" , $datas);
\textDatabase\dataWrite::write_json_multi("data" , $datas);
exit("finish !");
apple,10,1,200,
orange,20,3,000,
banana,1,98,
CSVデータは、カンマ区切りのシンプルデータで、今回のパターンの中で最も容量を少なく抑えられます。
その反面、key値などの情報を持っておらず、順番も可変にすることができないので、登録時にきちんと必須データや文字列のバリデーションを処理しておかなければいけません。
※今回は割愛してます。
[
{
"name": "apple",
"count": 10,
"price": "1,200"
},
{
"name": "orange",
"count": 20,
"price": "3,000"
},
{
"name": "banana",
"count": 1,
"price": 98
}
]
JSONデータをそのまま保存する方式は、2回目の書き込みの際に、上書きになりますので、データ更新型のシステムで利用するのがいいですが、履歴も残らないのでデータ欠損に要注意です。
{"name":"apple","count":10,"price":"1,200"}
{"name":"orange","count":20,"price":"3,000"}
{"name":"banana","count":1,"price":98}
複数業型JSONは、履歴の残るJSONフォーマットの為、データの扱いが最もしやすいでしょう。
内部データがkey=value形式になりますが、場合によっては、さらに階層を深くする事も可能です。
※1階層にしておく方が扱いやすいですが・・・
まとめ
データベース設計の際に、「マスター」と「ログ(データ)」という区分けをして、大きく2つの扱いにわけると思いますが、今回紹介した3パターンも同じような分類で使い分けるのがいいかと思います。
基本システムのマスター情報に当たるものは、「json形式」
履歴が欲しいマスターは「複数業json形式」
ログデータなどの大量データ取得は、「csv形式」
データ整形と書き込み処理自体はさほど難しくないプログラムなので、重要なのはデータの概念を理解する事だと覚えておきましょう。
0 件のコメント:
コメントを投稿