MySQL: bit shiftして値を抽出
以下のような3つのテーブルがあったとする。
specとは、人物の付随情報を表すことを目的としたテーブルで、
普通のrelationalテーブルで、
これにより、一見してどういうデータかわからなくなるが、
spec_keyとspec_valueのフィールドを1つにまとめることができ、
また、valueがintであるので、後々、範囲でも調べることができる。
制約としては、valueが16bit(65536)を超えない値であることや、
key数にも上限値が下がる。
こんなことをして、何がしたいかはまた別で書く。
mysql> select * from people;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 石川遼 |
| 2 | 斎藤佑樹 |
+----+--------------+
2 rows in set (0.00 sec)
mysql> select * from spec_keys;
+----+-----------+
| id | name |
+----+-----------+
| 1 | 身長 |
| 2 | 誕生年 |
+----+-----------+
2 rows in set (0.00 sec)
mysql> select * from specs;
+-----------+---------+---------+
| person_id | key_int | val_int |
+-----------+---------+---------+
| 2 | 1 | 176 |
| 2 | 2 | 1988 |
| 1 | 1 | 175 |
| 1 | 2 | 1991 |
+-----------+---------+---------+
4 rows in set (0.00 sec)
specとは、人物の付随情報を表すことを目的としたテーブルで、
普通のrelationalテーブルで、
石川遼が1991年生まれ、
といったことがわかるようにしている。
データを抽出するときにちょっと細工をして、
以下のようにbit shiftとbit演算をして抽出してみる。
mysql> select person_id, key_int << 16 | val_int from specs;
+-----------+-------------------------+
| person_id | key_int << 16 | val_int |
+-----------+-------------------------+
| 2 | 65712 |
| 2 | 133060 |
| 1 | 65711 |
| 1 | 133063 |
+-----------+-------------------------+
4 rows in set (0.00 sec)
これにより、一見してどういうデータかわからなくなるが、
spec_keyとspec_valueのフィールドを1つにまとめることができ、
また、valueがintであるので、後々、範囲でも調べることができる。
制約としては、valueが16bit(65536)を超えない値であることや、
key数にも上限値が下がる。
こんなことをして、何がしたいかはまた別で書く。