勉強日記

チラ裏

SQL Antipatterns ch11 31 Flavors (WIP)

pragprog.com


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

コラム: 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が必要
      1. データを退避(Extract)
      2. テーブル再定義(Transform)
      3. データ再読込(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制約で課す場合
    • startend未満である、など

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
    • わざとあいまいにした言葉