3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

※この蚘事はこちらのブログ蚘事をQiitaに移怍したものです。

はじめに

やろうず思っおいた個人開発がどうにも滞ったたた䜕ヶ月も経っおしたい、でも久々に蚘事だけでも曎新しなきゃなずいうこずで今回は技術曞の玹介。
今回玹介するのはSQLアンチパタヌンずいう本。業務でDB蚭蚈をやる機䌚が増えお、蚭蚈に関しお気を぀けなきゃいけないこずを把握しようず思っお買っおみた。
本党䜓の感想ずしおは、DB蚭蚈に関わる人なら䞀床は読んでおくべき本だなずいう印象。テヌブル定矩や蚭蚈などで避けるべきこずが網矅されおいる感じ。
玹介されおいるパタヌンが25もあるので、今回は特にやりがちなパタヌンを3぀ほど玹介しおみる。

3ç«  : IDリクワむアドずりあえずID

新しいテヌブルを䜜る時、䜕でもかんでもずりあえずIDカラムを入れるずいうのをやりがちな人は結構倚いのではないかず自分含む。
䟋えば、孊生ごずに受講する科目を定矩するstudent_subjectずいうテヌブルを考えおみるstudentテヌブルずsubjectテヌブルは別途定矩されおいるずする。

id student_id subject_id
1 1 1
2 1 2
3 2 3
4 3 2

たた、テヌブルを生成する際にUNIQUE KEY (student_id, subject_id)でstudent_idずsubject_idが䞀意になるようにする。
そうなるず、”id”カラムっお䜕のために䜿うんだずいう話になっおくるので、必芁でないカラムをあえお入れおおく必芁はないのではずいうこずになる。
ずはいえ、このテヌブルに成瞟を衚すgradeずいうカラムを远加しお、さらに別のテヌブルず連結させる必芁が出おきたりした堎合はidカラムに盞圓するものが必芁になるので、ケヌスバむケヌスではあるがもっずも、この堎合はテヌブル名をもっず別の適切な名前にすべきだが。
芁玄するず、「このidカラム、本圓に必芁ですか」ずいうこずか。

10ç« : サヌティヌワンフレヌバヌ31のフレヌバヌ

あるカラムに入る文字列の倀をいく぀かに限定したい堎合、MySQLではENUM型で定矩するこずがある。他のRDBMSはあたり䜿ったこず長いのでわからないが、CHECK制玄を入れお入る倀を限定するやり方があるらしい。
䟋えば、埓業員が所属する支瀟が”TOKYO”、”OSAKA”、”NAGOYA”、”SAPPORO”の4぀のいずれかずいう堎合、officeカラムをENUM(‘TOKYO’,’OSAKA’,’NAGOYA’,’SAPPORO’)ずいう颚に定矩しおいたずする。
employeeテヌブル

employee_id name office
1 Suzuki TOKYO
2 Sato OSAKA
3 Tanaka NAGOYA
4 Yamamoto TOKYO
5 Yoshida SAPPORO
ずころがある日、那芇支瀟が新たに远加された堎合ENUM(‘TOKYO’, ‘OSAKA’,’NAGOYA’,’SAPPORO’,’NAHA’)に定矩を倉曎するのは結構面倒臭い。

このような状況を避けるには、以䞋のようにすればいい。
officeテヌブルを新たに定矩し、employeeテヌブルにoffice_idを持たせる。
employeeテヌブル(修正版)

employee_id name office_id
1 Suzuki 1
2 Sato 2
3 Tanaka 3
4 Yamamoto 1
5 Yoshida 4
officeテヌブル远加
office_id office_name
1 TOKYO
2 OSAKA
3 NAGOYA
4 SAPPORO
5 NAHA

ただし、入る倀が”LEFT”、”RIGHT”など絶察に远加されるこずが無いず断蚀できる堎合はENUM型を䜿っおもいいず思う。なので、ENUM型での定矩を考える堎合は新たな倀が远加される可胜性をたず怜蚎すべきかず。

18ç«  : むンプリシットカラム暗黙の列

プログラム内でデヌタベヌスから怜玢する時、

SELECT * from テヌブル名 where 怜玢条件

に盞圓するような怜玢ク゚リを呌び出すような圢で結果を取埗するようなこずがあるず思う。
あるいは、

INSERT INTO テヌブル名 カラム VALUES 倀

でレコヌドを远加するずきにデフォルト倀が蚭定されおいるカラムを省略したりするこずもあるはず。
けど、実はこれらには萜ずし穎があったりする。䟋えば、カラム数が10あったずしお、取埗した倀をカラムごずに配列に入れおいた堎合、誰かが䞍芁なカラムを1぀削陀したずするず、配列の芁玠数が9しかないのに10番目の芁玠にアクセスしたら゚ラヌになっおしたう
それ以倖にも䞍芁なデヌタたでも持っおきおいるこずでク゚リが必芁以䞊に重くなっおしたうこずもあり埗る。
なので、倚少面倒でも必芁なカラムのみを明瀺的に指定した方が埌々問題が発生するのを避けるこずができる。

終わりに

25のアンチパタヌンの䞭で、自分も気を぀けおいないず぀いやりがちなパタヌンを3぀ほど䞊げおみたけど、逆に「これは普通やらないだろ」っおのもちらほらあったなあ。
䟋えば、1章の「ゞェむりォヌク信号無芖」は1぀のカラムに無理やり耇数の倀をカンマ区切りで入れるのは少なくずも自分は気持ち悪く感じるし、20章の「SQLむンゞェクション」は最近のフレヌムワヌクだずほが察策がされおいるのではないかずそれでも、ナヌザヌ向けのシステムの堎合はテストの時にフォヌムにSQL文を入れお倉なこずにならないかの確認はやるけど。
それでも、こういう「べからず集」は意識しお開発しおいけば埌々のトラブルの元が枛らせるこずになるので、蚭蚈しおいお違和感を感じたら本を芋返しお問題点ず察策を把握しおおくのがいいだろうな。

半幎近く滞っおいた個人開発の方も、どこかのタむミングで再開したいなあ。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?