SQL Antipatterns ch11 31 Flavors (WIP)

SQL勉強メモ

出典: 


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が必要

      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

    • わざとあいまいにした言葉