31 flavors
Use metadata when validating against a fixed set of values.
Use data when validating against a fluid set of values.
-
「いくつかの決まった値しかとらないデータ」というものが存在する
- 典型例: Salutation (あいさつの文句、Mrs.とか)
- かといって追加変更がないわけではない
-
メタデータで管理するとテーブル定義の変更が必要になってしまい大変
- 影響範囲甚大
- 可用性を損ねる
Objective: Restrict a Column to Specific Values
-
バグトラッキングシステムなら、バグにラベルをつけたくなる
- NEW
- IN PROGRESS
- FIXED
-
変なラベルを付けられないように縛りたい
- BANANA とか
Antipattern: Specify Values in the Column Definition
-
メタデータによる縛り
- ENUM (MySQL)
- Check制約 (MySQL以外)
- domain
- UDTs: User Defined Types
- トリガー
コラム: Baskin-Robbins 31 Ice Cream
- 今や31種類じゃないよね、という話
- システムでも同じ。ドメインはきっと広がるはず
What Was the Middle One?
- UI上で「設定可能な値」だけ表示するにはどうするか
-
「今設定されている値」をSELECT DISTINCTするのでは駄目
- 鶏と卵の問題
- 今設定されていない新しい値を設定できない
-
じゃあどうする
-
メタデータの文字列を取得してアプリケーション側で解析する
ENUM('NEW, 'IN PROGRESS', 'FIXED')
とか
-
アプリケーションコードに独立して記述する
- DBとの同期がとれなくなる
-
Adding a New Flavor
- ALTER TABLE文でテーブル定義を変更する必要がある
-
DB製品によっては、データがすでに入っているテーブルのテーブル定義を変更できない
-
ETLが必要
- データを退避(Extract)
- テーブル再定義(Transform)
- データ再読込(Load)
- ダウンタイム生ずる
-
- データがすでに入っているテーブルのテーブル定義を変更できる製品もある
- が、いずれにせよ複雑で高コストなオペレーションである
- 一般論として、テーブルのメタデータの変更は頻繁に行うべきではなく、行う際には最新の注意をもってテスト・品質保証しなければならない
Old Flavors Never Die
-
FIXEDをさらに2段階に分けたくなった
- CODE COMPLETE
- VERIFIED
- FIXEDはObsoleteなのでUI上からは消したい
-
FIXEDを制約のホワイトリストから消す場合
- もともとFIXEDだったデータはどうする?
-
FIXEDを残す場合
- FIXEDがObsoleteであることをどう表現する?
Portability Is Hard
-
いずれも移植性が低い
- ENUM (MySQL)
- Check制約 (MySQL以外)
- domain
- UDTs: User Defined Types
- トリガー
How to Recognize the Antipattern
- 取りうる値の集合が変わるかもしれない場合、ENUMやCheck制約で制限をかけるべきではない
-
こんなのが聞こえてきたら注意
-
「アプリケーションのメニューに選択肢を追加するためにダウンタイムが必要」
- 取りうる値の集合がカラム定義 = テーブルのメタデータに織り込まれてしまっている
-
「取りうる値のリストを変更する必要があるべきではない」
-
わざとあいまいにした言葉
- できなくはないがやりたくない
-
-
「アプリケーションコード中の『取りうる値のリスト』がDBと乖離してしまったよ、まただ」
- 多重管理
-
Legitimate Uses of the Antipattern
-
取りうる値が変化しない場合
- LEFT/RIGHT
- ACTICE/IN-ACTIVE
- ON/OFF
- INTERNAL/EXTERNAL
-
ENUM的でない制約をCHECK制約で課す場合
start
がend
未満である、など
Solution: Specify Values in Data
Querying the Set of Values
Updating the Values in the Lookup Table
Supporting Obsolete Values
Portability Is Easy
英語
-
weasel words
- わざとあいまいにした言葉