■ところで、この前フリ、要る?笑

なんとなく、こっちの方がツカみが良さそうなので、たまにやってます。

 

写真は一昨日見つけたタイ料理の店から。

"カオパット"つまりタイのエビチャーハンです。

日本米だった・・・orz

まあ、気にならない程に美味しかったのでOK。

 

ちなみに人形町では人気のようですね!

■ピーナッツ食堂

https://tabelog.com/tokyo/A1302/A130204/13137879/

 

■さて続編。

 

早速考えた案を基に現場で構造体を考えてみました。

規則上、現場に資料を持ち込めないので、全部記憶を思い出しつつの作業になりました(コレ本当にどうにかならないのかね…ツラい)

 

■もう一度要点を整理すると

①一つの大きなSQLの分解・解析が必要

②分解・解析結果をデータモデルとして、クラス・或いは構造体として保持するのが肝心

 

ここまでが大きな概要。

そして「ではどの様にデータモデル」を作るのか。

これは、SQLと言う「他のプログラミング言語にない、比較的にルールに厳密な特徴を生かし、SQLをキーワードで分解してデータとして正規化する」手法となります。

 

■いよいよ具体的な項目です

【最初に】

如何せん、現場で考えた物は自宅に持ち帰れない、逆も然りと言う厳しい環境なので、若干の記憶違いは出てきます。

とはいえ大体は覚えてるので(そりゃ自分で考えたモデルだしね…。)以下に記載。

 

■まずは軽く分解

いきなり全てを完璧に設計するのは無理なので、順序立てて考えて行きます。

 

■1.全てのCRUD(Create(Insert), Reference(Select), Update, Delete)共通

 CRUD全てに共通していえるのは

 R以外のCUDそれぞれ、select文を条件句として付与する事が可能

 

 結局の所、設計書上で考えておくべき事は。

どのCRUDを設計書化する場合でも再利用可能なような機能となるように、select文のデータ分析結果を最適化させる事。

 

 insert, update, delete等に組み込まれるのを想定したselectの解析・分解・データ格納が可能な作り・機能が必要だってことですね。

 (というよりも、selectを正しく設計書化する事ができれば、今回の一連の思考・作業は70%は完成でしょう)

 

 と言う事で、selectを最優先して作りこんでいきます。

 まず、1機能完成すると、モチベーション上がるからねw

 

■2.ではselectの分解・解析・データ格納とは

 どんな作業でもそうですが、分析・設計は概要からはじめ、徐々に細かいところに目を行き届かせるのが正解です。

 今回はselect文の分析なので、まずはselectの構造からですよね。

 

 周知の事実ではありますが、selectとは

 select (必要に応じてdistinct) 

  カラム(出力データ編集含む) as (必要に応じて別名),

  カラム(出力データ編集含む) as (必要に応じて別名),

  カラム…

 from

  テーブル名またはクエリ名または一時領域(with句) as (両者必要に応じて別名)

  (必要に応じて結合)

 where(必要に応じて)

  条件(必要に応じてサブクエリ)

 group by(必要に応じて)

 having(必要に応じて)

 order by(必要に応じて)

 

■3.では、データモデル

書いていきましょう。

今回はメソッドが付かないので、構造体モデルで考えて行きましょうね。

結合やサブクエリを一旦忘れて、シンプルに考えてましょう

 

今回はC言語をベース書いてきます。

(C言語の構造体ベースであれば、どの言語でも流用しやすいだろうし)

(尚、はっきり言って、今回の作業は細かいコーディング上の作り込みよりも、データモデルの作りがほぼ全てを決めてしまうと思うので、慎重に何度もフィードバックしながら進めていくつもりです。)

 

/* SQL分析用フォーマット */

typedef struct ST_SQL {

    char Crud[10+1];    /* "Insert", "Select", "Update", "Delete" */

    int DistinctFlg;    /* Distinct:有⇒1, 無⇒0                 */

    char *ColumnsStr;   /* 抽出カラム編集文字列                   */

    char *WhereStr;     /* Where句の中身                          */

    char *GroupByStr;   /* グループ化項目                         */           

    char *HavingStr;    /* グループ化前処理条件                   */

    char *OrderByStr;   /* ソート項目                             */

}

 

まずはここまで。

select文を句別に分ければ、上記以外に存在しないはずです。

(union, except等の集合とサブクエリを含めた結合を除けば、純粋な一つのselect文の解析はこれだけに絞られますね)

 

この続きを今夜書くかは、気分次第で笑

では、また!