ノーマライズ(Normalize)とカノニカライズ(Canonicalize)の違いをまとめた。両方とも数学・コンピュータサイエンスの世界では正規化と翻訳され、構造の標準化・簡易化を意味するが、概念・処理内容は異なる。
※音楽に対するNormalizeは音の大きさを合わせること。これは毛色が異なる処理のため対象外とする
結論
Normalizeのゴールは項目内部での冗長削減である。
対して、Canonicalizeのゴールは項目間での横断的な比較体制の確立である。項目間に相違ないか確認できるよう表記を統一すると言っても良い。Normalizeにある冗長削減は必須でないが、Normalizeにない項目間比較のためのユニーク制約を含む文脈的な対応となる。
シンプルな例でイメージを掴む
数式の例:
- Y = 32 + 2X + 8a + 4
- 32 -2x + y = 8b+4
これら二つの数式をNormalize(冗長削減)すると、それぞれ『Y=36+2X+8a』、『28-2x+y=8b』に出来る。「同類項はまとめられるし、半角スペースは表現の無駄だから消して冗長を削減しよう」という話である。
Canonicalizeは目的によって実施事項が揺れる。
同じ表記にして、項目間に違いがあるか、同じ項目のことを表しているかを明らかにするのがCanonicalizeのゴールだから、式の目的により『同じ項目』の定義が変わってくる。
字ずらが違ったら別のもの扱いしたい:
両方の式がCanonicalize済みの状態。完全一致しないから、二つの式を比較出来て両者に相違ありと機械的に判断できる。
項目を維持した状態で比較したい:
『変数を昇順、定数を昇順(a, bは数値よりも先に記載)、末尾は = 0 で終える』と表記のルールを決めれば『-2X + Y -8a – 32 – 4 = 0』、『-2x + y – 8b + 32 – 4 = 0』にCanonicalize出来る。統一した表記方法になっているから二つの式を比較出来て大文字X, 小文字xの差により両者に相違ありと機械的に判断出来る。
簡素化した式に相違ないか比較したい:
大文字小文字に意味がなく、定数のa, b, c もただの表記ゆれというなら二つの式は『-2x + y -8a – 36 = 0』、『-2x + y – 8a + 28 = 0』にCanonicalize出来る。統一した表記方法になっているから二つの式を比較出来て-36と28の差により両者に相違ありと機械的に判断出来る。
URLの例:
- /home/canonical/shortcut/test/url/
- /hoge/../test/url/
- /test/url/index.html
- /test/url/
- /test/url
※shortcut は /test へのシンボリックリンクとする、index.html はDirectoryIndex設定済みする。
Normalizeすると、二つ目は『/test/url/』にNormalize(冗長削減)出来る
対して、末尾スラッシュありのURLにCanonicalizeすると5項目ともすべて /test/url/ に置き換えられ、同一の基準でURLを比較できる。
※例では静的URLのみを取り扱ったが、#での見出し有の場合や?でのクエリありの場合、更にそのヴァリエーションとして ?hoge=a&fuga=b、?fuga=b&hoge=a、?hoge=a&hoge=aa&fuga=bなんかも取り扱ってみるとよりCanonicalURLの学びになる
※一つのサーバー上でのURLを取り扱ったが、複数サーバーの存在を考慮してURLをCanonicaizeするならドメイン名/ホスト名も含めて考えることとなる
XMLの例:
- <record data1=”x” data2=”y” />
- <record data2=”y” data1=”x1″></record>
Normalizeすると二つ目は<record data2=”y” data1=”x” />に出来る。
『要素(data1, data2)を昇順に並べる』とルール化してCanonicalizeすると二つ目は<record data1=”x1” data2=”y” />となり、表記を統一したので内容が同じか比較しやすくなった。data1の値に相違があるため異なる内容を表すと比較出来る状態となった。
歴史
数学世界ではCanonicalizeは1900年代(1900~1910年)には存在した話。コンピューターを利用するようになり、データの表記揺れ対応や冗長削減対応が増えたから大きく注目を浴びるようになったようだ。