<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SQL on 設計で、迷わなくなるために | 奥田智紘</title><link>https://design.okuda-studio.com/tags/sql/</link><description>Recent content in SQL on 設計で、迷わなくなるために | 奥田智紘</description><generator>Hugo -- 0.159.2</generator><language>ja</language><lastBuildDate>Wed, 11 Feb 2026 17:30:00 +0900</lastBuildDate><atom:link href="https://design.okuda-studio.com/tags/sql/index.xml" rel="self" type="application/rss+xml"/><item><title>SQL の条件を固定しない</title><link>https://design.okuda-studio.com/posts/0010-do-not-fix-sql-conditions/</link><pubDate>Wed, 11 Feb 2026 17:30:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0010-do-not-fix-sql-conditions/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#sql-%E3%81%AE%E6%9D%A1%E4%BB%B6%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%84"&gt;SQL の条件を固定しない&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"&gt;はじめに&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%94%B9%E5%96%84%E5%89%8D%E3%81%AE%E5%AE%9F%E8%A3%85"&gt;改善前の実装&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#dao-%E3%81%AB%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%8C%E5%85%A5%E3%82%8A%E8%BE%BC%E3%82%93%E3%81%A7%E3%81%84%E3%81%9F"&gt;DAO にドメインの意味が入り込んでいた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%95%8F%E9%A1%8C%E6%84%8F%E8%AD%98"&gt;問題意識&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%94%B9%E5%96%84%E6%96%B9%E9%87%9D"&gt;改善方針&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%94%B9%E5%96%84%E5%BE%8C%E3%81%AE%E5%AE%9F%E8%A3%85"&gt;改善後の実装&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#dao%E6%A4%9C%E7%B4%A2%E8%BB%B8%E3%81%A0%E3%81%91%E3%82%92%E7%9F%A5%E3%82%8B"&gt;DAO：検索軸だけを知る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#repository--usecase%E6%84%8F%E5%91%B3%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B"&gt;Repository / UseCase：意味を与える&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A7%E5%BE%97%E3%82%89%E3%82%8C%E3%81%9F%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88"&gt;この設計で得られたメリット&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-sql--dao-%E3%81%AE%E6%95%B0%E3%81%8C%E5%A2%97%E3%81%88%E3%81%AB%E3%81%8F%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F"&gt;1. SQL / DAO の数が増えにくくなった&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-dao-%E3%81%AE%E8%B2%AC%E5%8B%99%E3%81%8C%E6%98%8E%E7%A2%BA%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F"&gt;2. DAO の責務が明確になった&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E5%A4%89%E6%9B%B4%E3%81%AB%E5%BC%B7%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F"&gt;3. ドメインの変更に強くなった&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB"&gt;おわりに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="sql-の条件を固定しない"&gt;SQL の条件を固定しない&lt;/h1&gt;
&lt;p&gt;DAO の責務を整理して、ドメインに意味を寄せる設計改善&lt;/p&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Android アプリ開発において、
「とりあえず動く」状態から一段上の設計に進もうとすると、
&lt;strong&gt;ViewModel・UseCase・Repository・DAO の責務の境界&lt;/strong&gt;で悩むことが多い。&lt;/p&gt;
&lt;p&gt;今回は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL で条件を固定していた実装を見直し&lt;/li&gt;
&lt;li&gt;条件をパラメータ化して SQL の数を減らし&lt;/li&gt;
&lt;li&gt;その「意味」を Domain / UseCase 側で与える&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という設計改善を行ったので、その考え方をまとめる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="改善前の実装"&gt;改善前の実装&lt;/h2&gt;
&lt;h3 id="dao-にドメインの意味が入り込んでいた"&gt;DAO にドメインの意味が入り込んでいた&lt;/h3&gt;
&lt;p&gt;もともと DAO には、次のような Query が定義されていた。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Query&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;SELECT * FROM transfer_item WHERE isSourceItem = 1&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;observeSources&lt;/span&gt;(): Flow&amp;lt;List&amp;lt;TransferItemEntity&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この実装はシンプルで分かりやすいが、次の問題を抱えていた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DAO が「Source（振替元）」という&lt;strong&gt;ドメインの意味&lt;/strong&gt;を知っている&lt;/li&gt;
&lt;li&gt;条件が増えるたびに SQL / DAO メソッドが増える&lt;/li&gt;
&lt;li&gt;将来的に Query が爆発する兆候がある&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="問題意識"&gt;問題意識&lt;/h2&gt;
&lt;p&gt;ここで違和感を覚えたのは、次の点だった。&lt;/p&gt;</description></item></channel></rss>