【データ設計アンチパターン】誤ったステータスカラムの設計

Webアプリの開発では、あるテーブルにステータスカラムを持たせるということはよくあります。
今回は、実際に業務で遭遇したBadなステータスカラムの設計を教材として、正しいステータスカラムの設計とは何かを考えていきたいと思います。

ステータスの定義

ステータスとは文字通り、対象の状態のことです。
開発では、操作対象(オブジェクト)のある状態に名前をつけたり値を割り振ったりします。
例えば、記事が公開中であるか、下書き状態であるかです。

ステータスをそのように区別しなければならない理由としては下記があります。

・当該ステータスにおいてのみ、実行させたい処理がある
・当該ステータスでは、実行させたくない処理がある

アンチパターンその1. ステータスを抽出する粒度がおかしい

仮にYahoo!ニュースのようなニュースを配信するメディアがあったとします。
このメディアでは、記者が書いた記事を運営事務局が検閲し、内容に問題がなければ掲載を開始するという業務フローになっています。

このケースで以下のようなデータ設計がされていたらどうでしょうか?

※ステータスにフィーチャーするため、ユーザIDなどの外部キーや記事本文など他のカラムについては記載していません。

まず、edit_statusというカラムについてです。
抽出されているステータスとして「申請中・再申請中」というものがありますが、両者は区別する必要はありません。

なぜなら、申請中というステータスは記者が事務局に「記事の内容を確認してね」という要請を出していますよという状態ですが、それが初回であろうが2回目の申請であろうが事務局が行う検閲という業務フローには影響がありません。

ステータスは抽出しようと思えば、いくらでも作れてしまいます。
例えば、対象を人間変えると「新婚・風邪・食あたり・食事中・休憩中」などなど。

こうなってしまうと際限がなくなってしまいますので、粒度が細かいものはまとめなければなりません。
ではどういった基準でまとめるのかというと、前述した「当該ステータスにおいてのみ、実行させたい処理がある」かどうかです。

例えば勤怠管理のシステムにおいて欠勤理由などを保存する場合「風邪・食あたり」では細かすぎます。「体調不良」というより大きな粒度にまとめてしまうといいでしょう。
制御に利用されないステータスは混乱を招くだけですのでなくすようにしましょう。

アンチパターンその2. ステータスが重複している

上記データ設計にはもう1点悪い箇所があります。
それはステータス保存するカラムが2つあることです。

まずこの実装でステータスを定義する目的は「記事を公開できる状態であるか区別する」もしくは「オペレーション(申請に対する検閲)が必要であるか区別する」ことです。
2つに分けられたステータスを比較したときに、これらを制御し得る値であるが複数存在しちゃっています。
表にしてみると一目瞭然です。

具体的に重複している箇所は以下の通りです。

・「下書き中」「未公開」はどちらかひとつあれば、記事を編集中であるかどうかは判断可能
・「完了」「公開中」はどちらかひとつあれば、記事を公開できる状態かどうかは判断可能
・※「申請中」・「再申請」は前述した通り
このケースだと、statusカラムは1つにまとめちゃって、値は「編集中・申請中・公開中」の3つにしてしまえばずっとシンプルになります。

以上、ステータスカラムの設計についてでした。

シェル、sh

shellでの$$(ダラーマーク/ドルマークが2つ並んでいる)の意味
ログインしたシェルのプロセスIDを知ることができます。
ttps://kamotora.net/system/aix/shell-doubledolloar-mark/

AWKプログラミング
レコードの先頭から$1、$2、$3
レコードの末尾からは$NF、$(NF – 1)、$(NF – 2) ……と定義されます。
This is a pen.
$1 $2 $3 $4
$(NF – 3) $(NF – 2) $(NF – 1) $NF
https://codezine.jp/article/detail/7852

Linuxでのドル記号「$(…)」の意味と使い方
$ echo “現在のディレクトリは、$(pwd)です”
現在のディレクトリは、/home/userです

Linuxでのドル記号「$(…)」の意味と使い方

bashの配列 @(アットマーク)と *(アスタリスク)の違い
どちらも全件抽出ではあるが、@(アットマーク)の方がきれいにでる
https://qiita.com/mtomoaki_96kg/items/ff82305f1ff4bb4c827c

シェルスクリプトの % (パーセント記号)の意味
https://it-soudan.com/meaning-of-percent-symbol-of-shell-parameter-expansion/

シェルの入力制御
https://qiita.com/tag1216/items/7ce35b7c27d371165e56

http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%EB%B5%AD%B9%E6%CE%E0%A4%DE%A4%C8%A4%E1

改行コードに気を付ける
https://qiita.com/b4b4r07/items/9ea50f9ff94973c99ebe

【シェルスクリプト】ファイルの中身を一行ずつ読み込む方法
https://www.server-memo.net/shellscript/read-file.html

echo オプション eは改行を出力(hをつけると表示されないので省略)
ttps://eng-entrance.com/linux-command-echo

単項演算子が予期されますを防ぐ

https://www.bee-planetz.com/blog/%E3%80%8C%E5%8D%98%E9%A0%85%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%8C%E4%BA%88%E6%9C%9F%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%8D%E3%82%92%E6%8A%91%E5%88%B6%E3%81%99%E3%82%8B/

 

栄枯盛衰?

ジャンクスポーツをみて、過去に出演していたゴルフ選手

諸見里しのぶ
https://www.lpga.or.jp/members/info/1000660
飯島茜
https://www.lpga.or.jp/members/info/1000641
宮里藍
https://www.lpga.or.jp/members/info/1000636
横峯さくら
https://www.lpga.or.jp/members/info/1000639
佐伯三貴
https://www.lpga.or.jp/members/info/1000707
馬場ゆかり
https://www.lpga.or.jp/members/info/1000595
全美貞
https://www.lpga.or.jp/members/info/1000912
酒井美紀
https://www.lpga.or.jp/members/info/1000770
木戸愛
https://www.lpga.or.jp/members/info/1000716
原 江里菜
https://www.lpga.or.jp/members/info/1000734
鈴木 愛
https://www.lpga.or.jp/members/info/1000833
成田 美寿々
https://www.lpga.or.jp/members/info/1000837
渡邉 彩香
https://www.lpga.or.jp/members/info/1000823
吉田 弓美子
https://www.lpga.or.jp/members/info/1000755
有村 智恵
https://www.lpga.or.jp/members/info/1000664
北田 瑠衣
https://www.lpga.or.jp/members/info/1000585
吉本 ひかる
https://www.lpga.or.jp/members/info/1003029
日下部 智子
https://www.lpga.or.jp/members/info/1000624
上原 彩子
https://www.lpga.or.jp/members/info/1000622
大塚 有理子
https://www.lpga.or.jp/members/info/1000505
天沼 知恵子
https://www.lpga.or.jp/members/info/1000452
イ ボミ
https://www.lpga.or.jp/members/info/1003636

黄金世代
河本 結
https://www.lpga.or.jp/members/info/1002999
原 英莉花
https://www.lpga.or.jp/members/info/1004299
小祝 さくら
https://www.lpga.or.jp/members/info/1003044
勝 みなみ
https://www.lpga.or.jp/members/info/1002971
松田 鈴英
https://www.lpga.or.jp/members/info/1003006
新垣 比菜
https://www.lpga.or.jp/members/info/1002929
大里 桃子
https://www.lpga.or.jp/members/info/1003010

正規表現

正規表現チェッカー
https://weblabo.oscasierra.net/tools/regex/

正規表現サンプル
https://www.megasoft.co.jp/mifes/seiki/index_s2.html

文字列結合
https://qiita.com/tmak_tsukamoto/items/e8d11b1fd5a479f03501