■ところで、この前フリ、要る?笑
なんとなく、こっちの方がツカみが良さそうなので、たまにやってます。
写真は一昨日見つけたタイ料理の店から。
"カオパット"つまりタイのエビチャーハンです。
日本米だった・・・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文の解析はこれだけに絞られますね)
この続きを今夜書くかは、気分次第で笑
では、また!
