SQLアンチパターン-10章 31のフレーバー-まとめ
列に入る値を限定する
列に入る値を限定するとき、テーブル設計時にCHECK制約を利用することで定義が可能になります。
また、MySQLではENUM
というデータ型をサポートしています。
CREATE TABLE Books (
author VARCHAR(100)
category ENUM('human','social','history')
);
しかし、上記のようにテーブルを設計したとして、
category列でソートをかけるとどうなるでしょうか。
答えは、アルファベット順にソートされるのではなく
値のリストの定義順でソートされることになります。
デメリット
ENUM
やCHECK制約
を使う際には、その中の値が今後変更されうることが起きないか、新しい値が追加される可能性があるのか、よく考えましょう。
列定義を変更する
列定義をもし追加するとしたら、元々の列定義の内容を知っておく必要があります。
また、定義されている値を変更する場合は既存のデータを編集した上で更新する必要が出てきます。
それはとてもコストのかかる作業となります。
データの移植が難しい
例えばENUM
型はMySQLでしか対応しておらず、他のDBに移植しようとなった場合には設計を見直す必要があります。
解決策
限定する値は別テーブルで定義しましょう
今回の場合、外部キーでcategory
テーブルを扱えば問題は簡単になるでしょう。
category
の値を変更することもできるし、
新しくcateogry
を増やすことも容易になります。
データの属性が増えた場合も変更は容易です。
例えばcategory
を扱う際に、親子関係を考える必要が出てきたとします。
その際はcategory
テーブルでその親子関係を表せば良いです。(Closure tableなどを使いましょう)
ENUM
やCHECK制約
で設計していては実現できないことです。
値の制限を、テーブルを増やして表しただけなので
他のDBへの移植も容易です。
Author And Source
この問題について(SQLアンチパターン-10章 31のフレーバー-まとめ), 我々は、より多くの情報をここで見つけました https://qiita.com/aaaaanochira/items/8d2224d4fb3b6e8df18a著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .