55276
HTMLフォーム内のセレクトボックスで選択した内容をデータベースへ保存したいのですが、何れを保存すべきかで迷っています

```

    $data = array("選択肢1","選択肢2","選択肢3");
    
```

* * *

**案1.受信した「配列のインデックス」を保存**  
・0 または 1 または 2  
・DBだけ見た際、値が分かりづらい  
・仕様変更により$data内容を変更することになった場合は、対応が大変そう  
・intで保存することになるので処理が速そう  
・こちらが一般的ですか？

**案2.「配列の値」を保存**  
・選択肢0 または 選択肢1 または 選択肢2  
・DBだけ見た際、値が分かる  
・仕様変更により$data内容を変更することになった場合でも、対応できそう  
・文字列で保存しても、速度的にはほとんど変わらなそう
CC BY-SA 4.0
2019-05-27T02:10:07.767
55273
2019-05-28T01:47:08.870
2019-05-28T01:47:08.870
29826
7886
question
php mysql database
セレクトボックスで選択した内容をデータベースへ保存する時は、何を保存するべき？
* 送られてくるフォームデータが常に期待する並び順であるとは限らない
  * フォームの並び順を変更したくなった時、"インデックスで保存"だと修正が面倒

通常は「送られてきた **値** 」をそのまま保存すべきかと思います。
CC BY-SA 4.0
2019-05-27T02:28:11.817
55275
2019-05-27T02:28:11.817
3060
55273
answer
それぞれの案におけるデメリットと、その上でどうすべきかという案3を回答します。

# 案1. 受信した「配列のインデックス」を保存

値が分かりづらいのに加え、今後セレクトボックスの順序が変更になるような改修が起こった場合にDBの値を変更する必要が生じます。

しかし、 `int` で保存するので、処理速度はともかく保存される容量は比較的小さくなるでしょう。

# 案2. 「配列の値」を保存

値は分かりやすくなりますが、案1では **配列の順序** が変更されたときにDBの内容を変更する必要があるのと同様に、こちらでは **配列の値**
、すなわち文言が修正された場合にDBの内容を変更する必要が生じるでしょう。

また、 `TEXT` などの文字列を保存する都合上、サイズが膨らみやすくなりそうです。

# 案3. ENUM型を利用する

文字列に対応する値のリストを保存する方法です。値も分かりやすくなり、DBに保存する値も小さくなるでしょう。選択肢の順序や文言に変更が生じた場合も対応が容易になるかと存じます。

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.4.4 ENUM
型](https://dev.mysql.com/doc/refman/5.6/ja/enum.html)
CC BY-SA 4.0
2019-05-27T02:28:57.237
55276
2019-05-27T02:28:57.237
29826
55273
answer