仕事でSQLを使うことは多いのですが、色々と困りごとも多いので、実際に困った内容を備忘録します。
MySQLとPostgreSQLの方言
OSSとして、コストメリットがあるデータベースとして多く使われるのが、MySQLとPostgreSQLです。
どっちがいいかと考えてみたら、どちらにもメリットデメリットがあるので、正直どっちでもいいというのが本音です。
でも、一度どちらかを使い始めたら、別のSQLに切り替えるというのは極めて難しくなるんですよね。
なぜならそれぞれ、個別の機能を持っていて、SQLを切り替える時にその機能を使っていた場合、置き換える機能開発や翻訳を行う必要があるからなんですね。
当たり前ですが、SQL選びは非常に重要なんですよ。
また、こうした行き来を簡単にする手法として、特別な機能を使わずに、標準SQLを主体とした記述に徹底するという事で、方言を無視することも可能になります。
でも、エンジニアって、新しい機能、個別の機能を使うことにモチベーションを感じてしまう生き物なので、よほど統制しなければ、難しいかもしれませんね。
SQLiteはデータベース概念がファイル単位
SQLiteは、データベース・サーバーを立てなくてもフォルダ内で操作できる.sqlファイルがデータ本体になって、便利に使えるため、スマホアプリなどでよく使われるSQLです。
これもかなりクセが強くて、USE DATABASEという命令がそもそも無くて、1ファイルが1データベースとして扱われて、その中にテーブル群が詰め込まれている仕様になっているため、
データベースをまたぐSELECTが極めて書きにくい(ていうかどう書いて良いのかわからん)。
もしかしたら、便利に他のSQLの様にマルチDBでの記述ができるのかもしれないが、現時点で分からないので、やはり特殊仕様のSQLとして使うしかなさそう・・・と判断した。
MySQLのバージョンが古かった話
先日、MySQLを使っている会社さんのお手伝いをした時の事です。
その会社のデータベース構成がとてもイケていなくて、1つのカラム内に、カンマ区切りでマスターIDの登録がされていました。
Database : fruits
ID | name | price | items |
1 | Apple | 100 | 10,11,12 |
2 | Orange | 80 | 5,6,7,8,9 |
3 | banana | 50 | 15,17,19 |
※データ内容はブログ用のサンプルです。
普通にデータ取得すると、次のようになります。
SELECT items FROM fruits WHERE name='Apple'
> items : 10,11,12
こういう状態の時に、itemsカラムのデータを,(カンマ)でsplitした状態で、列取得したいですよね?
その場合、次のように書くと良いんです。
SELECT item_id FROM fruits WHERE name='Apple'
cross join unnest( split(items, ',') ) as t (item_id)
> item_id : 10
> item_id : 11
> item_id : 12
これをさらに、JOINなどでリレーション連結してデータを取得していけばいいのですが、
これを実行すると、MySQLでエラーが出力されてうまく動作しない・・・
もしかして・・・と思って、バージョンを確認してみる。
SELECT version();
> 5.7.37
MySQLで、unnestが使えるようになるのは、おそらくバージョン8からなのだと思った(正確に確認できていないけど、ver8でunnest使える記事が山のように検索で引っかかったので)。
こりゃあ、古いSQLバージョン使うのは、デメリットだな〜と思って、2回のSELECTを叩くことにした。
あとがき
何かと仕事で使う機会の多いSQLですが、個人的には、データ汎用性という事を重視しているため、サーバーIOを用いた独自手法を使うようにしています。
サーバーや環境依存することが無く、
運用管理が極めて楽、
処理速度もプログラミング次第で高速に行える。
こんな手法を使うエンジニアが少ないのももったいないですが、前職の秘伝のタレとして技術研究して、今の会社で実践しているSQLよりも便利な手法です。
これ使うと、もはやSQLのバージョンに悩まされる必要もないんですよね。
でも、世の中の大半の会社さんが、SQL大好きエンジニアによって、システム構築されているので、そうした会社さんには、今後もSQLにてご対応して行きたいと思っています。
0 件のコメント:
コメントを投稿