Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails アンチパターン「RDBMS を単なるデータストアとして扱う」 / Rails Anti-pattern RDBMS is not more than datastore

Rails アンチパターン「RDBMS を単なるデータストアとして扱う」 / Rails Anti-pattern RDBMS is not more than datastore

RDBMS は便利だからもっと使っていきましょうというお話。

表参道.rb #25 Rails アンチパターン で話しました。
https://omotesandorb.connpass.com/event/62936/

OSA Shunsuke

August 03, 2017
Tweet

More Decks by OSA Shunsuke

Other Decks in Technology

Transcript

  1. ʮ3%#.4Λ୯ͳΔσʔλετΞͱͯ͠ѻ͏ʯ
    දࢀಓSCd3BJMTΞϯνύλʔϯd

    [email protected]@

    View Slide

  2. ୭ʁ
    • OSA Shunsuke
    • Rails Ͱ Web ΞϓϦέʔγϣϯΛॻ͍͍ͯ·͢
    • Working on ΫοΫύουྉཧڭࣨ
    • ޷͖ͳ͜ͱɿϞσϦϯά
    • ΦϒδΣΫτ΍ͦͷ૬ޓ࡞༻Λߟ͑Δͷ͕޷͖
    • Twitter: @s_osa_
    • GitHub: s-osa

    View Slide

  3. ͜Μͳ͜ͱͰࠔ͍ͬͯ·ͤΜ͔ʁ

    View Slide

  4. ਌Ϧιʔεͷଘࡏ֬ೝ
    • belongs_to Ͱఆٛ͞Ε͍ͯΔϦιʔεͷଘࡏ֬ೝΛ
    සൟʹ͍ͯ͠Δ
    • if article.blog
    • nil?
    • blank?
    • present?
    • try
    • &.

    View Slide

  5. ͔ͭ͠ͳ͍͸ͣͷϨίʔυ͕ෳ਺͋Δ
    • ຊདྷ͸ unique Ͱ͋Δ͸ͣͷΧϥϜ͕ unique ʹͳͬ
    ͍ͯͳ͍
    • ʮFavorite ΛऔΓফ͚ͨ͠Ͳফ͑ͳ͍ʯ
    • ௐ΂ͯΈͨΒ2݅σʔλ͕Ͱ͖͍ͯͯɺยํ͔͠
    ࡟আ͞Ε͍ͯͳ͔ͬͨ

    View Slide

  6. ͳͥ͜Μͳ͜ͱʹʁ

    View Slide

  7. ਌Ϧιʔεͷ࡟আ
    • ଞͷϦιʔεʹΑͬͯࢀর͞Ε͍ͯΔϦιʔεΛ࡟আ
    ͯ͠͠·͏
    • Rails Ͱ͸ Association ͷఆٛʹ dependent Φϓγϣ
    ϯΛ౉͢ͱ࡟আ࣌ͷಈ࡞͕ఆٛͰ͖Δ
    • nullify: ݁ہ nil check ͕ඞཁ
    • restrict_with_*: ʢ࢖͍ͬͯΔਓΛݟͨ͜ͱ͕ͳ͍ʣ

    View Slide

  8. WBMJEBUJPODBMMCBDLΛհ͞ͳ͍σʔλߋ৽
    • update_attribute(:column, value)
    • save(validate: false)
    • ଞͷΞϓϦέʔγϣϯ
    • SQL

    View Slide

  9. ଟॏੜ੒
    • ಉ͡σʔλΛෳ਺ճॻ͖ࠐΉͱॏෳσʔλ͕࡞੒͞
    Εͯ͠·͏
    • ʮϘλϯ͸1ճ͚ͩԡ͍ͯͩ͘͠͞ʯ

    View Slide

  10. ΞϓϦέʔγϣϯʹ͸όά͕ೖΓ΍͍͢
    • ਓؒ͸ؒҧ͑ΔͷͰόάΛੜΜͰ͠·͏
    • ΞϓϦέʔγϣϯ͸සൟʹߋ৽͞ΕΔ

    View Slide

  11. ΞϓϦέʔγϣϯͰ͸๷͛ͳ͍

    View Slide

  12. 3%#.4ͷ੍໿Λ࢖͏

    View Slide

  13. '03&*(/,&:੍໿
    • ֎෦Ωʔͷࢀরઌ͕ଘࡏ͢Δ͜ͱΛอূ͢Δ
    • ࢀরઌ͕ଘࡏ͠ͳ͍ϨίʔυΛ INSERT/UPDATE
    ͨ͠Γɺࢀর͞Ε͍ͯΔϨίʔυΛ DELETE ͢Δ
    ͱΤϥʔʹͳΔ
    • Rails 4.2 Ͱαϙʔτ͞ΕΔΑ͏ʹͳͬͨ

    View Slide

  14. 6/*26&੍໿
    • ࢦఆͨ͠ΧϥϜͷσʔλ͕ҰҙͰ͋Δ͜ͱΛอূ
    • ॏෳϨίʔυΛൃੜͤ͞ΔΫΤϦ͸Τϥʔ
    • ֎෦Ωʔʹઃఆ͢Δͱศརͳ͜ͱ͕ଟ͍
    • has_one ͞Ε͍ͯΔ֎෦Ωʔʹఆٛͯ͠࠷େ1݅Ͱ͋Δ͜ͱ
    Λอূ
    • தؒςʔϒϧͷ֎෦Ωʔʹෳ߹ UNIQUE ੍໿Λఆٛͯ͠ɺ
    ಉ͡૊Έ߹Θͤ͸อଘ͞Εͳ͍Α͏ʹ
    • users <— favorites —> articles

    View Slide

  15. ͓·͚ɿͦͷଞͷ੍໿
    • NOT NULL ੍໿
    • σϑΥϧτͰ͚ͭΔ΂͖
    • ϛοΫ͞ΜʹΑΔʮNULLʹ·ͭΘΔॾ໰୊ʯ͕Φεεϝ
    • http://www.geocities.jp/mickindex/database/idx_database.html
    • CHECK ੍໿
    • ศར͚ͩͲϨʔϧ͔Β֎Εͯ͠·͏
    • schema.rb -> structure.sql
    • MySQL Ͱ͸࢖͑ͳ͍

    View Slide

  16. ੍໿ʹΑͬͯಘΒΕΔ΋ͷ

    View Slide

  17. σʔλΛ৴པͰ͖Δ
    • FOREIGN KEY ੍໿͕͍͍ͭͯΔ֎෦Ωʔ͸࣮֬ʹ
    ؔ࿈ϦιʔεΛͨͲΕΔ
    • UNIQUE ੍໿͕͍͍ͭͯΔΧϥϜ͸࣮֬ʹ unique
    • nil check ΍Ϩίʔυ਺ͷ֬ೝ͕ෆཁʹͳͬͯίʔυ
    ͕εοΩϦ͢Δ

    View Slide

  18. ޡΓʹૣ͘ؾ෇͚Δ
    • ෆਖ਼ͳσʔλΛੜ੒͠Α͏ͱ͢ΔΫΤϦ͕౤͛ΒΕ
    ͨΒɺྫ֎ʹΑͬͯͦΕʹؾͮ͘͜ͱ͕Ͱ͖Δ
    • ҟৗঢ়ଶʹૣ͘ؾ͚ͮ͹ݪҼΛಥ͖ࢭΊΔͷ͕༰қ
    ʹͳΔ
    • յΕͨσʔλΛදࣔ͢Δͱ͖·ͰҟৗͰ͋Δ͜ͱ
    ʹؾ͚ͮͳ͍ͱɺͲ͜Ͱੜ੒ɾߋ৽͞Εͨͷ͔Λ
    ௐ΂Δͷ͸େม

    View Slide

  19. 3%#.4ͱ஥ྑͯ͘͠
    ָ͘͠ίʔυΛॻ͜͏

    View Slide