<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ビューサポートの基礎理論 &#8211; SRA OSS Tech Blog</title>
	<atom:link href="https://www.sraoss.co.jp/tech-blog/tag/9a6dd168e746dc8992ec9e1eaa739147/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<description>OSS専門の技術ブログ。PostgreSQL、Zabbixを中心に10種類以上のOSSの解説、アップデート情報、運用ヒントを提供。</description>
	<lastBuildDate>Wed, 04 Nov 2026 06:42:41 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/07/blog-icon-150x150.png</url>
	<title>ビューサポートの基礎理論 &#8211; SRA OSS Tech Blog</title>
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>増永教授のDB特論⑫「ビューサポートの基礎理論」</title>
		<link>https://www.sraoss.co.jp/tech-blog/db-special-lecture/masunaga-db-special-lecture-12/</link>
		
		<dc:creator><![CDATA[増永良文 (Yoshifumi Masunaga)]]></dc:creator>
		<pubDate>Thu, 30 Mar 2023 01:00:19 +0000</pubDate>
				<category><![CDATA[増永教授のDB特論]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[RDB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[ビューサポートの基礎理論]]></category>
		<category><![CDATA[リレーショナルデータベース]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=12133</guid>

					<description><![CDATA[&#160; 1. はじめに  ビュー（view）はリレーショナルデータベースの始祖コッド（E.F. Codd）がリレーショナルデータモデル[1]を世に問うてから 4 年後の 1974 年に彼自身により導入されました[2 ...]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>
<h4>1. はじめに</h4>
<p style="margin-top: -14px;"> ビュー（view）はリレーショナルデータベースの始祖コッド（E.F. Codd）がリレーショナルデータモデル[1]を世に問うてから 4 年後の 1974 年に彼自身により導入されました[2]．ビューは定義だけが存在し実体は伴わない仮想的なリレーションであるところがデータベースに格納されているリレーション，これを実リレーション（stored relation）という，と根本的に異なるところです．</p>
<p><span id="more-12133"></span></p>
<p style="margin-top: -28px;"> ビューは<b>質問変形</b>（query modification）と呼ばれる手法[3]により，ビューに対するいかなる「質問」（query，問合せ）も常に実行可能です．これは理論でも実践（=SQL）でもその通りです．つまり，ビューへの問合せは常にサポートされているということです．しかしながら，ビューを「更新」（update）しようとすると一筋縄ではいかなくなります．つまり，更新できるビューもあれば更新できないビューもあります．その理由は「ビューは実リレーションではなくあくまでも仮想的なリレーションであるから」です．では，一体どのような条件を満たすときに，ビューは更新可能となるのでしょうか？これは<b>ビュー更新問題</b>（view update problem）と呼ばれ，コッドがビューを提案した当初からさまざまな研究がなされて現在に至っています．<br />
さて，ビュー更新問題は理論的にはビュー定義の逆関数を一意に不都合なく決定できるか否かという問題として定式化できますが，一意性には意味論（semantics）が関わってくること，逆関数の存在をタップルの重複出現を許さない集合意味論のもとで論じるのか，そうではなく（SQL テーブルのように）タップルの重複出現を許すバッグ意味論のもとで論じるのかという立場の違い，あるいは逆関数の存在を従来のようにリレーションスキーマレベルで問うのか，そうではなくインスタンスレベルで問うのか，などさまざまな観点があり，それによりビューの更新可能性に大きな変化が生じることともなり，今なお，ビュー更新問題は解決済みとは言い難い状況です．<br />
このような認識のもと，本稿では「ビューサポートの基礎理論」と題して，ビューとその更新可能性の概念，ビューの更新可能性をスキーマレベルで論じることとインスタンスレベルで論じることとの違い，スキーマレベルにおけるリレーショナルビューとバッグビューの更新可能性の違いなど，ビューサポートに関するさまざまな観点を念頭に置きつつ諸概念を整理しながら議論することで，そこから見えてくるビューサポートの全貌を報告してみたいと思います．</p>
<h4>2. ビューとその更新可能性</h4>
<p style="margin-top: -18px;"><strong>2.1 ビューとは</strong></p>
<p style="margin-top: -20px;"> ビューとその更新可能性をリレーショナルデータモデルの観点から論じるとき，その基礎となるのは<b>リレーショナル代数</b>（relational algebra）です．一方，SQL のテーブルを念頭においてビューとその更新可能性を考えると，SQL ではタップルの重複出現を許すテーブル，これを<b>バッグ</b>（bag）という，の存在を前提としているので，その基礎となるのは<b>バッグ代数</b>（bag algebra）です．そこで，本稿ではリレーショナル代数で定義されるビューを<b>リレーショナルビュー</b>，バッグ代数で定義されるビューを<b>バッグビュー</b>と呼び両者を区別します．</p>
<p style="margin-top: -20px;"> さて，リレーション R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) は dom(R)=dom(A<sub>1</sub>)✕dom(A<sub>2</sub>)✕・・・✕dom(A<sub>n</sub>) の有限部分集合として定義されます．ここに dom(A<sub>i</sub>) は属性 A<sub>i</sub> がとりうる値の全集合を表します．では，ビューは一体どのように定義されるのでしょうか？その詳細な定義は 3.1 節で与えますが，たとえば，リレーション R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) の選択ビューV は V=σ<sub>φ</sub>(R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>)) と定義されます．ここに，φ は dom(R) の元を引数とする述語で，σ<sub>φ</sub> はリレーショナル代数演算で選択（selection）を表します．バッグビューの定義は 4.1 節で与えますが，たとえば R(A, B) と S(A, B) を和両立なバッグとした時，<br />
R と S の加法和ビュー V は V(A, B)＝S(A, B)⨄R(A, B) と定義されるということです．ここに，⨄ は<br />
加法和を表すバッグ代数演算で，これはリレーショナル代数にはないバッグ代数に特有の演算です．</p>
<p style="margin-top: -20px;"> 理論上，リレーショナルビューはバッグビューの特殊な場合となるのですが，まずリレーショナルビューの更新可能性を論じ，それが拡張される形でバッグビューの更新可能性を論じる方がビューサポート理論の全貌を見通しやすいと考えられるのでそのような展開とします．本章では引き続きビューとその更新可能性について論じ，続く第 3 章でリレーショナルビューの更新可能性を，第 4 章でバッグビューの更新可能性を論じます．</p>
<p style="margin-top: -00px;"><strong>2.2 ビューの更新とは</strong></p>
<p style="margin-top: -20px;"> ビューの更新（update）とは，ビューは仮想的な構成体（construct）であるにも関わらず， SQL の用語を借りればビュー表（viewed table）として，あたかも実リレーションや実バッグであるかのように捉えてビューを更新しようとすることをいいます．しかしながら，ビューには実体がないことから更新できる場合もあればできない場合もあります．</p>
<p style="margin-top: -20px;"> 更新には，削除（delete），挿入（insert），書換（rewrite）があります．まず，削除と挿入を定義します．ここに dom(V) はビュー V のドメインを表します．</p>
<p style="margin-top: -20px;">   削除（<b>d</b>）：delete σ<sub>φ</sub>(V) from V; ここに φ は dom(V) の元を引数とする述語である．<br />
挿入（<b>i</b>）：insert X into V; ここに X⊆dom(V) とする．</p>
<p> リレーショナルビューの削除と挿入の定義は次の通りです（バッグビューの削除と挿入の定義は 4.2 節で与えます）．</p>
<p>● 削除（<b>d</b>）は，リレーショナル代数表現で表せば <b>d</b>: V←V－σ<sub>φ</sub>(V) と定義するということです．<br />
ここに－は差，φ は V に対する選択条件で，←はリレーションの置換を表します．<br />
● 挿入（<b>i</b>）は，リレーショナル代数表現で表せば <b>i</b>: V←V∪Xと定義するということです．<br />
ここに∪は和を表します．</p>
<p>ここで，ビューのドメインと書換について補足説明を行います．</p>
<h4 style="margin-top: -20px;">■ ビューのドメインについて</h4>
<p style="margin-top: -14px;"> ビュー V(A<sub>1’</sub>, A<sub>2’</sub>, <sub>…</sub>, A<sub>r’</sub>) のドメイン dom(V) は，一般に dom(A<sub>1’</sub>)×dom(A<sub>2’</sub>)×・・・×dom(A<sub>r’</sub>) そのものではなく，ビュー定義を満たすその部分集合として定義されます．</p>
<p style="margin-top: -20px;"> たとえば，リレーション R(A, B) の選択ビューを V(A, B)=σ<sub>B≦b</sub>(R(A, B)) とした場合，<br />
dom(V)=dom(A)×dom(B) ではなく， dom(V)=dom(A)×σ<sub>B≦b</sub>(dom(B))となります．具体的には，リレーション社員(社員番号，給与)を実リレーションとし，ビューを貧乏社員=σ<sub>給与≦20</sub>(社員) とした時，dom(貧乏社員)= dom(社員番号)×σ<sub>給与≦20</sub> (dom(給与)) と定義されます．その結果，ビュー貧乏社員に対して，挿入 insert {(100, 10), (101, 15)} into 貧乏社員; は受け付けられてその更新可能性が検証の対象となりますが，insert {(100, 10), (101, 40)} into 貧乏社員; は (101, 40) の存在により {(100, 10), (101, 40)}⊆dom(貧乏社員) とはならないのでビュー貧乏社員に対して発行できる挿入ではないということです．つまり，上記の dom(V) の定義はビューの持つ意味に抵触するような挿入をあらかじめ排除する意図があります．これにより，リレーショナル DBMS は発行された挿入がビュー定義に抵触しないか否かの検証，これはインスタンスレベルの検証となります，を行わなくて済むので大いに助かりますが，一方でクライアントにはビューの定義に抵触しない挿入を発行しなければならないことが求められます．この条件はビュー更新を（本稿では）スキーマレベルで論じたいから課せられた条件ということです．<br />
dom(V) の他の基本的な例としては，V＝R ならば dom(V)=dom(R) です．R と S を和両立とするとき和ビュー V=R∪S や差ビュー V=R－S のドメインは dom(V)=dom(R)=dom(S) です．直積ビュー V=R×S のドメインは dom(V)=dom(R)×dom(S) です．リレーション R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) の属性集合 X（⊆Ω<sub>R</sub>），ここに Ω<sub>R</sub> ={A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>}，上の射影ビュー V=π<sub>X</sub>(R) のドメインは，X={A<sub>1’</sub>, A<sub>2’</sub>, <sub>…</sub>, A<sub>r’</sub>}，ここに 1≦1’≦2’≦…≦r’≦n として，dom(V)=dom(A<sub>1’</sub>)×dom(A<sub>2’</sub>)×･･･×dom(A<sub>r’</sub>) となります．選択ビューについては上記の通りです．R(A, B) と S(B,C) の等結合ビュー V(A, R.B, S.B, C)=<br />
R⨝<sub>R.B=S.B</sub>S のドメインは dom(V)=σ<sub>R.B=S.B</sub>(dom(A)×dom(R.B)×dom(S.B)×dom(C)) となります．<br />
R(A, B) と S(B,C) の自然結合ビュー V(A, R.B, C)=R⨝S のドメインは dom(V)=π<sub>{A, R.B, C}</sub>(σ<sub>R.B=S.B</sub><br />
(dom(A)×dom(R.B)×dom(S.B)×dom(C))) となります．リレーショナル代数演算を複合して適用して定義される一般的ビュー，たとえば，リレーション R(A, B, C)の選択と射影で定義されるビュー V=π<sub>{A, B}</sub>(σ<sub>C=c</sub>(R)) のドメインは dom(V)=dom(A)×dom(B) です．これは，中間ビュー V<sub>1</sub>=σ<sub>C=c</sub>(R) のドメインは dom(V<sub>1</sub>)= dom(A)×dom(B)×σ<sub>C=c</sub>(dom(C))ですが，V のドメインは dom(V<sub>1</sub>) の {A, B} 上の射影をとって定義されているのでそうなります．このようにビューのドメインはいずれもビュー定義と表裏一体の関係で定義されます．</p>
<h4 style="margin-top: -20px;">■ 書換について</h4>
<p>本稿では<b>書換</b>を削除と挿入の系列とみなします．このとき，ビューの削除は可能であったとしても，続く挿入には注意を払う必要があります．どういうことかを上記のビュー貧乏社員=σ<sub>給与≦20</sub>(社員)を例にすれば次の通りです．たとえば，社員番号 200 の社員の給与が 15 であったとすると，タップル (200, 15) がビュー貧乏社員に出現します．給与倍増ということで，社員番号=200 の給与を 30 に書換えるとします．このとき，書換は削除と挿入の系列とみなしているので，まずビュー貧乏社員から (200, 15) を削除して，続いて (200, 30) が挿入されるということです．3.2 節[11]項で示される通り，選択ビューは削除可能なのでビュー貧乏社員からの (200, 15) の削除は基底リレーション社員からの (200, 15) の削除に変換できます．しかしながら，続く，ビュー貧乏社員への (200, 30) の挿入は挿入の条件である {(200, 30)}⊆dom(貧乏社員)，ここに dom(貧乏社員)=dom(社員番号)×σ<sub>給与≦20</sub> (dom(給与))，とはならないので許されません．これは社員番号が 200 の社員は給与が 30 なのでもはや貧乏社員ではないので当然のことです．つまり，給与が倍増されたこの社員はビュー貧乏社員に挿入されるべきではなく，基底リレーション社員に直接挿入されるべきなわけです．つまり，(200, 30) をビュー貧乏社員に挿入するすべがないのではなく，それはリレーション社員に挿入され，その結果として社員番号 200 の社員はビュー貧乏社員には現れなくなる，それがビューの更新を考察する場合の「書換は削除と挿入の系列とみなす」の意味と処理です．</p>
<p style="margin-top: -00px;"><strong>2.3 ビューの更新可能性</strong></p>
<p style="margin-top: -20px;"> 一般にビューは仮想的な構成体なので，実リレーションや実バッグと異なりすべてのビューが更新可能とは限りません．ビューはどのようなときに更新可能となるのか，それをダヤール（U. Dayal）ら [4] が与えた定義を参考にして規定すると次のようになります． ここにデータベーススキーマを <span style="font-style: italic;"><b>S</b></span>，時刻 τ におけるデータベース状態を S<sub>τ</sub>（つまり，S<sub>τ</sub> は時刻 τ における <span style="font-style: italic;"><b>S</b></span> のインスタンス），ビュー定義を <b>V</b> で表すと，時刻 τ におけるビュー（状態）は V<sub>τ</sub>（=<b>V</b>(S<sub>τ</sub>)）です．</p>
<p style="margin-top: -20px;"><b>【定義１】</b>（ビューの更新可能性）<br />
時刻 τ におけるビュー V<sub>τ</sub> への更新 <b>u</b> が<b>変換可能</b>（translatable）であるとは，<b>u</b> の V<sub>τ</sub> から S<sub>τ</sub> への<b>変換</b>（translation）T が存在して，次の条件を満たすときをいう．</p>
<p style="margin-top: -20px;"> (a)</p>
<p>変換 T は一意（unique）である．</p>
<p style="margin-top: -20px;"> (b)</p>
<p>V<sub>τ</sub> に副作用がない（no side effect）．</p>
<p style="margin-top: -20px;"> (c)</p>
<p>T(<b>u</b>) には S<sub>τ</sub> に対する余計な更新がない（no extraneous update）．</p>
<p style="margin-top: -20px;"> (d)</p>
<p>T(<b>u</b>) はデータベーススキーマ <span style="font-style: italic;"><b>S</b></span> の一貫性制約に抵触しない．</p>
<p>以下，定義 1 を補足します．</p>
<p style="margin-top: -00px;"> <b>(a)</b></p>
<p><b>一意性</b></p>
<p style="margin-top: -20px;"> 更新可能性の大前提である変換に「一意性」を課したことは，変換 T に代替案があった時にその選択基準を設けられないためです．たとえば，リレーション R(A, B)={(1, 2)} と S(B, C)={(2, 3)} の自然結合ビュー V=R⨝S が定義されていて，V に対して削除 <b>d</b>=delete {(1, 2, 3)} from V; が発行されたとします．このとき，この削除を実現できる <b>d</b> の変換は次に示す 3 つ考えられます．<br />
T<sub>1</sub>(<b>d</b>)= delete {(1, 2)} from R;<br />
T<sub>2</sub>(<b>d</b>)= delete {(2, 3)} from S;<br />
T<sub>3</sub>(<b>d</b>)= begin; delete {(1, 2)} from R; delete {(2, 3)} from S; end;<br />
注意するべきは，T<sub>1</sub>(<b>d</b>)～T<sub>3</sub>(<b>d</b>) の持つ削除の意味がそれぞれ異なるということです．意味が異なるということは勝手な選択はデータベースの一貫性に問題を生じさせかねないということです．サイコロを振ってどれかにするというようなことは許されないということです．「一意性」はデータベースの一貫性維持のために必要な制約です．</p>
<p>&nbsp;</p>
<p style="margin-top: -00px;"> <b>(b)</b></p>
<p><b>副作用がない</b></p>
<p style="margin-top: -20px;"> 「副作用がない」とは<b>図 1</b> に示す可換図式が成立することをいいます．副作用が生じる例としては，2 つのリレーションを R(A, B)={(1, 1)}, S(C, D)={(1, 1)} として，V=R×S={(1, 1, 1, 1)} を直積ビューとします．このとき，V に対して挿入 <b>i</b>=insert {(2, 2, 2, 2)} into V; が発行されたとします．<b>i</b> を R と S への挿入の系列 T(<b>i</b>)=begin; insert {(2, 2)} into R; insert {(2, 2,)} into S; end; に変換すれば，確かに (2, 2, 2, 2) が V に挿入されますが，同時に (1, 1, 2, 2) と (2, 2, 1, 1) が V に出現してしまいます．これを副作用といい，それは意図した更新ではなかったので，その発生の源となった挿入 <b>i</b> を上記のように変換することは許されないということです．</p>
<p>&nbsp;</p>
<p style="margin-top: -00px;"> <b>(c)</b></p>
<p><b>余計な変換がない</b></p>
<p style="margin-top: -20px;"> S<sub>τ</sub>に対する「余計な変換がない」とは，たとえば，リレーション社員(<u>社員番号</u>, 社員名, 給与, 部門)={(001, 山田太郎，50，K55)，(002，鈴木花子，40，K41)，(003，田中桃子，60，K41)，(004，佐藤一郎，40，K55)}，ここに社員番号は社員の主キーとする，の射影ビュー V=π<sub>{社員番号，社員名}</sub>社員={ (001, 山田太郎)，(002，鈴木花子)，(003，田中桃子)，(004，佐藤一郎)} に挿入 <b>i</b>=insert {(007，ボンド)} into V; が発行されたとき，<b>i</b> をリレーション社員に対する挿入 T(<b>i</b>)= insert {(007，ボンド，null，<br />
null)} into 社員; ここに null は属性に値がないことを表す，に変換すれば問題は生じませんが，そうではなく，たとえば，T’(<b>i</b>)= insert {(007，ボンド，100，null)} into 社員;とすると，これで確かに射影ビュー V に (007，ボンド) が挿入されますが，基底リレーション社員にはボンドの給与が 100 であるという余計な値が挿入されることになり，これは許さないということです．</p>
<p>&nbsp;</p>
<p style="margin-top: -00px;"> <b>(d)</b></p>
<p><b>データベーススキーマの一貫性制約に抵触しない</b></p>
<p style="margin-top: -20px;"> 「データベーススキーマの一貫性制約に抵触しない」ですが，その意味するところは次の通りです．時刻 τ でビュー V に対して発行された更新 <b>u</b> に対して，条件 (a)～(c) を満たす更新変換 T(<b>u</b>) が存在したとします．このとき，時刻 τ におけるデータベース状態を S<sub>τ</sub> で表すと，S<sub>τ</sub> は T(<b>u</b>) で更新されないといけないわけですが，この更新がデータベーススキーマ <span style="font-style: italic;"><b>S</b></span> に課せられている一貫性制約に抵触してはならないということです．<br />
一貫性制約は多様です．キー制約はすべてのリレーションに課せられている一貫性制約ですが，データベース化の対象となった実世界に存在する意味的制約を反映した一貫性制約もあります．たとえば，リレーションスキーマ<span style="font-style: italic;"><b>社員</b></span>(<u>社員番号</u>, 社員名, 給与, 部門)について，「各部門には最低 2 名の社員が所属していなければならない」という一貫性制約が課せられていたとします．そして，ビュー「K55 社員」を K55 社員=σ<sub>部門=K55</sub>(社員)と定義したとします．このとき，ビュー K55 社員に対して一名の K55 社員を削除する操作が発行されたとします．ビュー K55 社員は選択ビューなので，それに対して発行された削除はそのまま基底リレーションであるリレーション社員の削除に変換可能です（3.2 項【11】項）．しかしながら，もし K55 社員が 2 名しかいなかった場合，この削除は「各部門には最低 2 名の社員が所属していなければならない」というリレーションスキーマ<span style="font-style: italic;"><b>社員</b></span>の一貫性制約に抵触するので受け付けてはなりません．これが条件 (d) の意味するところです．<br />
しかしながら，条件 (d) はビューに特有の条件ではないことに注意する必要があります．たとえば，上記のリレーションスキーマ<span style="font-style: italic;"><b>社員</b></span>に上記と同じ一貫性制約が課せられていれば，この制約は<span style="font-style: italic;"><b>社員</b></span>のいかなるインスタンスとしてのリレーション社員に（ビューを通してではなく）直接更新がかけられたときにもそれに抵触してはならない制約です．したがって，条件 (d) を特段にビューの更新可能性の条件として課するべきではないと捉え，本稿では<u>ビューへの更新は定義 1 の条件 (a)～(c) を満たすとき，変換可能とする</u>ことにします（関連した議論を 3.1.2 項でも行っています）．<br />
なお，ビュー V<sub>τ</sub> への更新 <b>u</b> が変換可能（translatable）であるとき，ビュー V<sub>τ</sub> は更新可能（updatable）であるともいいます．</p>
<div style="text-align: center;"><img decoding="async" style="margin-top: -08px; width: 600px;" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2023/03/viewsupport-figure11.png" alt="図１　時刻τにおいてビュー更新要求 u が変換可能であることを示す可換図式" /></div>
<p>&nbsp;</p>
<p style="margin-top: -12px;"><strong>2.4　スキーマレベル vs. インスタンスレベルアプローチ</strong></p>
<p style="margin-top: -20px;"> リレーショナルデータモデルにはリレーションスキーマとそのインスタンスという概念区分があります．時間的に不変なリレーションの構造がリレーションスキーマ（relation schema）で，一般に時間と共に変化するコンテンツとしてのリレーションがリレーションスキーマのインスタンス（instance）です．そして，両者の関係性は次の通りです[10]．<br />
「リレーションスキーマ <span style="font-style: italic;"><b>R</b></span> である性質 P が成り立つということは，<span style="font-style: italic;"><b>R</b></span> のすべての<br />
インスタンス R に対してその性質 P が成り立つとき，およびそのときのみである」</p>
<p> たとえば，リレーションスキーマ<span style="font-style: italic;"><b>社員</b></span>(<u>社員番号</u>, 社員名, 給与, 部門)があったとき「社員番号が<span style="font-style: italic;"><b>社員</b></span>のキーである」という性質は，リレーションスキーマ<span style="font-style: italic;"><b>社員</b></span>のすべてのインスタンス社員に対して次が成立することです．ここに t[社員番号]はタップル t の属性である社員番号がとる値を表します（⇒は含意を表す）．<br />
(∀t, t’∈社員)(t[社員番号]=t’[社員番号]⇒t=t’)</p>
<p>さて，先に与えた定義 1 はビューの更新可能性をインスタンスレベルで規定しています．しかしながら上記の観点から定義 1 で与えられたビューの更新可能性の定義を見直すと，ビューの更新可能性を定義通りにインスタンスレベルで規定することは勿論できますが，スキーマレベルで規定することも可能であることが分かります．どちらのアプローチをとるべきなのでしょうか，素朴な疑問に直面してしまいます．<br />
しかしながら，これまで行われてきたビューの更新可能性の議論に目を向けてみると，この問題は理論的にも実践的にもスキーマレベルで議論されてきました．なぜでしょうか？その理由は，スキーマレベルで規定することにより，与えられたビューの更新可能性をリレーショナル DBMS が検証するにあたり，検証を<b>テーブル参照</b>（table lookup）で行えるからです．つまり，ビューの更新可能性をスキーマレベルで規定しておくと，基本的ビューの更新可能性を<ruby>予<rt style="background-color: white;">あらかじ</rt></ruby>めメタデータとしてカタログに登録しておけば，一般的ビューが与えられた時，それが更新可能かどうかは，そのビュー定義を構文解析して，その構文解析木のノードに一つでも更新不可能とされる基本的ビュー定義があれば，その時点でその一般的ビューは更新不可能と判定できるからです．たとえば，「直積ビューは削除不可能」とカタログに登録されていれば，一般的ビューの定義に直積が用いられていることを見つけた時点で，このビューは削除不可能と判定できるわけです．これはビュー更新をサポートしようとするリレーショナル DBMS にとっては負荷が少なくとても嬉しく映るはずです．実際，現在のプロプライエタリあるいは OSS のリレーショナル DBMS のすべてはこのアプローチに基づいています．<br />
一方，もしビューの更新可能性をインスタンスレベルで判定すると状況は一変します．何が変わるのかといえば，<u>スキーマレベルで更新不可能とされるビューがインスタンスレベルでは状況により更新可能となる</u>ということです．たとえば，リレーション R(A, B) と S(B, C) の自然結合ビュー定義 V=R⨝S の更新可能性は，スキーマレベルのアプローチでは「押し<ruby>並<rt style="background-color: white;">な</rt></ruby>べて結合ビューは更新不可能だから V は更新不可能」となってしまいますが，インスタンスレベルのアプローチではそうはならず，「<ruby>この<rt style="background-color: white;">・・</rt></ruby>自然結合ビュー V に対して発行された<ruby>この<rt style="background-color: white;">・・</rt></ruby>更新 <b>u</b> は変換可能か否か」をケースバイケースで検証していくということです．したがって，インスタンスレベルのアプローチを採るとリレーショナル DBMS の負荷は増大するのですがクライアントにとっては更新できるビューが却下されてしまうことが少なくなるので福音となります．つまり，ビューの更新可能性をスキーマレベルで規定するのかインスタンスレベルで規定するのかは処理コストと更新可能性のトレードオフということになります．筆者らが考案した「更新意図の外形的推測に基づいたビューの更新可能性」[6, 7] はインスタンスレベルの考え方に基づいたビュー更新の新しいアプローチです．興味を抱いた方は是非，拙著論文にあたってみてください．</p>
<h4>3. リレーショナルビューの更新可能性（スキーマレベル）</h4>
<p style="margin-top: -12px;"><strong>3.1 リレーショナルビューの定義</strong></p>
<p style="margin-top: -12px;"><strong>3.1.1 リレーショナル代数</strong></p>
<p style="margin-top: -12px;"> リレーショナルビューはリレーショナル代数を使って定義されます．リレーショナル代数はコッドがリレーショナルデータモデルの一環として導入しましたが，以下に示す演算からなります [1]．<br />
<b>【定義２】</b>（リレーショナル代数演算）<br />
● 和（∪），差（－），共通（∩）<br />
● 直積（×）<br />
● 射影（π<sub>X</sub>(R)，ここに X⊆Ω<sub>R</sub>）<br />
● 選択（σ<sub>φ</sub> (R)，ここに φ は dom(R)上の選択条件）<br />
● <span style="font-style: italic;">θ</span>-結合（R⨝<sub>AiθBj</sub>S，ここに A<sub>i</sub>∈Ω<sub>R</sub>，B<sub>j</sub>∈Ω<sub>S</sub> で A<sub>i</sub> と B<sub>j</sub> は θ-比較可能）<br />
● 商（÷）</p>
<p> これら 8 つの演算の定義を<b>表 1</b> に示します．</p>
<div style="text-align: center;"><img decoding="async" style="margin-top: -08px; width: 726px;" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2023/03/viewsupport-chart11.png" alt="表1　リレーショナル代数演算" /></div>
<p>&nbsp;</p>
<p>補足をすれば次の通りです．</p>
<p style="margin-top: -20px;"> ●</p>
<p>リレーション R の全属性集合を Ω<sub>R</sub>={A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>}としたとき，R はdom(R)=dom(A<sub>1</sub>)×dom(A<sub>2</sub>)×・・・×dom(A<sub>n</sub>) の有限部分集合と定義されます．</p>
<p style="margin-top: -20px;"> ●</p>
<p>述語 R(t) はタップル t がリレーション R の元であるとき，つまり t∈R のとき及びそのときのみ真（true）となります．</p>
<p style="margin-top: -20px;"> ●</p>
<p>∨，∧，¬，⇒，⇔ はそれぞれ論理和，論理積，論理否定，含意，必要かつ十分，を表す命題結合子です．</p>
<p style="margin-top: -20px;"> ●</p>
<p>タップルを結合する演算子* は (a<sub>1</sub>, a<sub>2</sub>, <sub>…</sub>, a<sub>n</sub>)*( b<sub>1</sub>, b<sub>2</sub>, <sub>…</sub>, b<sub>m</sub>)=(a<sub>1</sub>, a<sub>2</sub>, <sub>…</sub>, a<sub>n</sub>, b<sub>1</sub>, b<sub>2</sub>, <sub>…</sub>, b<sub>m</sub>) と定義されます．</p>
<p style="margin-top: -20px;"> ●</p>
<p>R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) と S(B<sub>1</sub>, B<sub>2</sub>, <sub>…</sub>, B<sub>m</sub>) をリレーションとするとき，それらが和両立（union compatible）であるとは n=m∧∀<sub>i</sub>(dom(A<sub>i</sub>)=dom(B<sub>i</sub>)) が成立しているときをいいます．</p>
<p style="margin-top: -20px;"> ●</p>
<p>t =(a<sub>1</sub>, a<sub>2</sub>, <sub>…</sub>, a<sub>n</sub>) をリレーション R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) のタップル，Ω<sub>R</sub> の部分集合を X={ A<sub>1’</sub>, A<sub>2’</sub>, <sub>…</sub>, A<sub>ℓ’</sub>}，1≦1’≦2’≦・・・≦ℓ’≦n としたとき，t の X 上の射影は t[X]=(a<sub>1’</sub>, a<sub>2’</sub>, <sub>…</sub>, a<sub>ℓ’</sub>) と定義されます．</p>
<p style="margin-top: -20px;"> ●</p>
<p>比較演算子を <span style="font-style: italic;">θ</span>∈{＜, ≦，≠，＝,＞，≧} とします．</p>
<p style="margin-top: -20px;"> ●</p>
<p>A<sub>i</sub>∈Ω<sub>R</sub>，B<sub>j</sub>∈Ω<sub>S</sub> で A<sub>i</sub> と B<sub>j</sub> が <span style="font-style: italic;">θ</span>-比較可能とは A<sub>i</sub><span style="font-style: italic;">θ</span>B<sub>j</sub> の真，偽が常に決まることをいいます（3 値論理の場合は，真，偽，不定となります）．</p>
<p style="margin-top: -20px;"> ●</p>
<p>選択を定義する際に使用される選択条件 φ は次のように再帰的に定義されます．ここに A<sub>i</sub> や A<sub>j</sub> はリレーション R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) の属性で，A<sub>i</sub> と A<sub>j</sub> は <span style="font-style: italic;">θ</span>-比較可能，c を定数，<span style="font-style: italic;">θ</span> を比較演算子とします．</p>
<p><b>【定義３】</b>（選択条件 φ）<br />
(i) A<sub>i</sub>θc，A<sub>i</sub>θA<sub>j</sub> は選択条件である．<br />
(ii) α と β を選択条件としたとき，¬α，α∨β，α∧β は選択条件である．<br />
(iii) (i) と (ii) で定義されるもののみが選択条件である．</p>
<p>選択条件は合成可能です．つまり，リレーション R に対して選択条件 φ を施した結果である σ<sub>φ</sub>(R) に対して，新たな選択条件 ψ を施すと，その結果は σ<sub>ψ</sub>(σ<sub>φ</sub>(R))となりますが，質問変形[3] により，<br />
σ<sub>ψ</sub>(σ<sub>φ</sub>(R))=σ<sub>ψ∧φ</sub>(R) が成立します．したがって，σ<sub>ψ</sub>(σ<sub>φ</sub>(R))=σ<sub>φ</sub>(σ<sub>ψ</sub>(R)) や σ<sub>φ</sub>(σ<sub>φ</sub>(R))=<br />
σ<sub>φ</sub>(R) などが成立します．また，選択条件とリレーショナル代数演算との最も基本的な関係は次の通りです．ここに，R, S をリレーション，ψ，φ は述語を表します．</p>
<p style="margin-top: -20px;"> ●</p>
<p>σ<sub>ψ∨φ</sub>(R)=σ<sub>ψ</sub>(R)∪σ<sub>φ</sub>(R)</p>
<p style="margin-top: -20px;"> ●</p>
<p>σ<sub>ψ∧φ</sub>(R)=σ<sub>ψ</sub>(R)∩σ<sub>φ</sub>(R)</p>
<p style="margin-top: -20px;"> ●</p>
<p>σ<sub>¬φ</sub>(R)=R－σ<sub>φ</sub>(R)</p>
<p>なお，コッドはリレーショナル代数演算として上記のごとく 8 つの演算を導入しましたが，演算の<br />
独立性に着目すると，たとえば，<b>和，差，直積，射影，選択</b>の 5 つはお互いに独立した演算であり，<br />
共通，結合，商やその他の演算をそれらを使って表せることはよく知られていることです．たとえば<br />
次の通りです．</p>
<p style="margin-top: -20px;"> ●</p>
<p>共通：R∩S=R－(R－S)</p>
<p style="margin-top: -20px;"> ●</p>
<p><span style="font-style: italic;">θ</span>-結合：R⨝<sub>AiθBj</sub>S=σ<sub>R.AiθS.Bj</sub>(R×S)</p>
<p style="margin-top: -20px;"> ●</p>
<p>自然結合：R⨝S=π<sub>ΩR∪ΩS</sub> (<sub>σR.C1=S.C1∧R.C2=S.C2∧．．．∧R.Cr=S.Cr</sub>(R×S))，ここに<br />
{C<sub>1</sub>, C<sub>2</sub>, <sub>…</sub>, C<sub>r</sub>}=Ω<sub>R</sub>∩Ω<sub>S</sub></p>
<p style="margin-top: -20px;"> ●</p>
<p>左外結合：R⟕S= (R⨝S)∪(R –π<sub>ΩR</sub>(R⨝S))×{(null, <sub>…</sub>, null)}</p>
<p style="margin-top: -20px;"> ●</p>
<p>右外結合：R⟖S= (R⨝S)∪{(null, <sub>…</sub>, null)}×(S –π<sub>ΩS</sub>(R⨝S))</p>
<p style="margin-top: -20px;"> ●</p>
<p>完全外結合：R⟗S= (R⨝S)∪(R –π<sub>ΩR</sub>(R⨝S))×{(null, <sub>…</sub>, null)}∪{(null, <sub>…</sub>, null)}×<br />
(S –π<sub>ΩS</sub>(R⨝S))</p>
<p>さらに補足をすると，リレーショナルデータモデルが提案された当初，選択は <span style="font-style: italic;">θ</span>-選択として定義されていました．その定義は次の通りです．<br />
<img decoding="async" style="margin-top: -00px; width: 726px;" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2023/03/viewsupport-theta.png" alt="θ-選択" align="middle" /><br />
つまり，<span style="font-style: italic;">θ</span>-選択は選択条件 φ の定義 3 の (i) 項の A<sub>i</sub><span style="font-style: italic;">θ</span>A<sub>j</sub> は選択条件であるという定義から直接導けます．また，上で記しましたが，選択条件は合成可能ですから <span style="font-style: italic;">θ</span>-選択を合成した演算が選択ということになります．したがって，両者をいたずらに区別する必要はなく，特に φ=A<sub>i</sub><span style="font-style: italic;">θ</span>A<sub>j</sub> を強調したい場合に <span style="font-style: italic;">θ</span>-選択という，と使い分けをすることとします．<br />
結合演算には上記のようにさまざまな結合形態があり，それらを峻別するために最も基本的な結合を <span style="font-style: italic;">θ</span>-結合としたと理解すればよいと思います．他の結合は <span style="font-style: italic;">θ</span>-結合を合成していくことで得られます．</p>
<h4 style="margin-top: -20px;">■ Null と 3 値論理</h4>
<p>コッドが初めてリレーショナルデータモデルを提案したとき，リレーションの属性が null（空，値がないことを表す）をとることは想定されていませんでした [1]．そこでは，リレーション R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) は dom(R)=dom(A<sub>1</sub>)×dom(A<sub>2</sub>)×・・・×dom(A<sub>n</sub>) の有限部分集合と定義されますが，各ドメイン dom(A<sub>i</sub>) は単純（simple）である，つまり，integer あるいは文字列からなる集合で，それが null を含むことは想定されていませんでした．したがって，リレーショナル代数演算は 2 値論理に基づいて定義できました．<br />
リレーショナルデータモデルに null が導入されたのは，より多くの意味をリレーショナルデータモデルに取り込もうとレーショナルデータモデルを拡張したコッドの 1979 年の論文で，そこで初めて 3 値論理に基づくリレーショナル代数が導入されました [5]．<br />
一方，ビューの更新可能性を論じるときには，リレーションやビューの属性が null をとらざるを得ない状況が発生します．たとえば，リレーション R(<u>A</u>, B, C)，ここに A は主キー，の属性集合 {A, B} 上の射影ビュー V=π<sub>{A, B}</sub>(R) はキー保存なので，V に対する挿入は変換可能です（3.2 節【10】項）．たとえば，<b>i</b>=insert (a, b) into V; は R への挿入 T(<b>i</b>)=insert (a, b, null) into R; に変換可能です．つまり，リレーション R に当初は属性が null となるタップルが存在しなかったとしても，いずれはそのようなタップルが存在する可能性があるわけです．<br />
したがって，ビューサポートの理論ではリレーショナル代数演算は 3 値論理を導入した拡張が前提となります．この導入により影響を受ける演算は選択や <span style="font-style: italic;">θ</span>-結合で，それらは推量 <span style="font-style: italic;">θ</span>-選択（maybe <span style="font-style: italic;">θ</span>-selection）や推量 <span style="font-style: italic;">θ</span>-結合（maybe <span style="font-style: italic;">θ</span>-join）の導入に繋がります．定義 3 の (i) 項で与えたようにA<sub>i</sub><span style="font-style: italic;">θ</span>c，A<sub>i</sub><span style="font-style: italic;">θ</span>A<sub>j</sub> は選択条件であるので，これらの述語の値は A<sub>i</sub> や A<sub>j</sub> が null でなければ真か偽をとりますが，そうでない場合には「不定」（unknown）をとります．たとえば，「2＞3=偽」ですが「2＞null=不定」となります．そうすると，リレーション R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) の推量 <span style="font-style: italic;">θ</span>-選択は σ<sub>AiθωAj</sub>(R)={t|R(t)∧t[A<sub>i</sub>]<span style="font-style: italic;">θ</span>[A<sub>j</sub>] IS UNKNOWN} と定義されます．ここで t[A<sub>i</sub>]<span style="font-style: italic;">θ</span>[A<sub>j</sub>] IS UNKNOWN の真理値は<b>表 2</b> に示される「3 値論理の IS ブール演算子真理値表」で規定されます．たとえば，属性に null を許容したリレーションを R(A, B, C)={(1, 5, 3), (2, 3, 8), (3, 2, null), (4, null, 6), (5, null, null)} とすれば，<br />
σ<sub>B＞C</sub>(R)={(1, 5, 3)} ですが，σ<sub>B＞ωC </sub>(R)={(3, 2, null), (4, null, 6), (5, null, null)} となります．なお，<br />
推量 <span style="font-style: italic;">θ</span>-結合は推量 <span style="font-style: italic;">θ</span>-選択を用いて，推量 <span style="font-style: italic;">θ</span>-結合は R⨝<sub>AiθωBj</sub>S=σ<sub>R.AiθωS.Bj</sub>(R×S) と定義できます [10]．<br />
このように，ビューサポートでは null を導入した 3 値論理に基づいた論理展開が必要なのですが，表 1 のリレーショナル代数演算の選択や <span style="font-style: italic;">θ</span>-結合の定義には推量 <span style="font-style: italic;">θ</span>-選択や推量 <span style="font-style: italic;">θ</span>-結合が陽には表れていません．もちろんそれらを許すように表 1 を拡張できますが，表 1 にそれらを明示していないのは，もっぱら 2 値論理のリレーショナル代数演算の下でビューの更新可能性を論じることで，ビューサポートの議論全体の見通しをよくしようと考えたからです．null を扱わないといけない状況に直面したときには，3 値論理に従って思考してください．たとえば，リレーション R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) の属性 A<sub>i</sub> と A<sub>j</sub> 上の <span style="font-style: italic;">θ</span>-選択ビュー V は 3 値論理では V=σ<sub>AiθAj</sub>(R)={t|R(t)∧t[A<sub>i</sub>]θ[A<sub>j</sub>] IS TRUE} と定義されますが，これは 2 値論理での V=σ<sub>AiθAj</sub>(R)={t|R(t)∧t[A<sub>i</sub>]θ[A<sub>j</sub>]} と同値です．一方，R の属性 A<sub>i</sub> と A<sub>j</sub> 上の推量 <span style="font-style: italic;">θ</span>-選択ビュー V は V=σ<sub>AiθωAj</sub>(R)={t|R(t)∧t[A<sub>i</sub>]θ[A<sub>j</sub>] IS UNKNOWN} と定義され，3 値論理に従います．より具体的には，上記のリレーションR(A, B, C)={(1, 5, 3), (2, 3, 8), (3, 2, null), (4, null, 6), (5, null, null)} の属性 B と C 上の「推量大なり（＞）選択ビューV」は V=σ<sub>B＞ωC </sub>(R)={(3, 2, null), (4, null, 6), (5, null, null)} となりますが，B 上の「推量以下（≦）演算」を使った削除 <b>d</b>=delete σ<sub>B≦ω10 </sub>(V) from V; が発行されたとすると，<b>d</b> は T(<b>d</b>)= delete σ<sub>B≦ω10 </sub>(R) from R; と基底リレーション R に変換可能で，R から {(4, null, 6), (5, null, null)} が削除され，その結果 V={(3, 2, null)} となり，所望の削除が実現されていることがわかります．このような拡張はバッグ代数についても同様です．</p>
<div style="text-align: center;"><img decoding="async" style="margin-top: -08px; width: 520px;" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2023/03/viewsupport-chart2.png" alt="表2　3 値論理の IS ブール演算子真理値表" /></div>
<p>&nbsp;</p>
<p style="margin-top: -12px;"><strong>3.1.2 リレーショナル代数表現としてのリレーショナルビュー</strong></p>
<p style="margin-top: -12px;"> リレーショナルデータベースに対する問合せ（query）はリレーショナル代数表現（relational algebra expression）として記述できますが，ビューは問合せによって定義される仮想的リレーションなので，リレーショナルビューはレーショナル代数表現を使って再帰的に定義することができます．それを定義 4 に与えます．リレーショナル代数演算の独立性から，和，差，直積，射影，選択の 5 つの演算を使ってビューを定義しています．実リレーションとはデータベースに格納されているリレーショナルのことをいいます．なお，本来はリレーショナルビューと書くべきなのですが，ここでは特段の混乱は生じないと考えられるので，単にビューと記しています．<br />
<b>【定義４】</b>（ビュー）</p>
<p style="margin-top: -20px;"> (1)</p>
<p>実リレーション R はビューである．</p>
<p style="margin-top: -20px;"> (2)</p>
<p>V<sub>1</sub> と V<sub>2</sub> を和両立なビューとするとき，それらの和 V<sub>1</sub>∪V<sub>2</sub> はビューである（和ビュー）．</p>
<p style="margin-top: -20px;"> (3)</p>
<p>V<sub>1</sub> と V<sub>2</sub> を和両立なビューとするとき，それらの差 V<sub>1</sub>－V<sub>2</sub> をはビューである（差ビュー）．</p>
<p style="margin-top: -20px;"> (4)</p>
<p>V<sub>1</sub> と V<sub>2</sub> をビューとするとき，それらの直積 V<sub>1</sub>×V<sub>2</sub> はビューである（直積ビュー）．</p>
<p style="margin-top: -20px;"> (5)</p>
<p>V をビューとするとき，その射影 πx(V) はビューである（射影ビュー）．</p>
<p style="margin-top: -20px;"> (6)</p>
<p>V をビューとするとき，その選択 σ<sub>φ</sub>(V) はビューである（選択ビュー）．</p>
<p style="margin-top: -20px;"> (7)</p>
<p>(1)～(6) で定義されるもののみがビューである．</p>
<p>ビューを定義するときに使われる実リレーションをそのビューの<b>基底リレーション</b>（underlying base relation）といいます．基底リレーションを使って (1)～(6) 項のいずれかの演算を 1 度だけ使用して定義されるビューを<b>基本的ビュー</b>（basic view），定義4 の (1)～(6) 項で定義された演算を再帰的に適用して定義されるビューを<b>一般的ビュー</b>（general view）ということにします．この定義に従えば，（定義 4 には陽には出現しなかった）共通ビュー，結合ビュー，商ビュー，外結合ビューなどは一般的ビューとして定義されることになります．ちなみに，R(<u>A</u>, B, C)，S(<u>B</u>, D) をリレーション（アンダーバーは主キーを表す）としたとき，連言問合せ（conjunctive query）として定義されるビュー V=<br />
π<sub>{R.A, R.B}</sub>(σ<sub>C=c</sub>(R)⨝<sub>R.B=S.B</sub>σ<sub>D=d</sub>(S)) は一般的ビューの典型です．なお，テーブルにタップルの重複<br />
出現を許している SQL では avg, sum, max, min, count といった集約（aggregation）が有効ですが，リレーションは重複タップルの出現を許していないので SQL ほどの有効性はないと考えて，リレーショナル代数表現としてビューを定義する際には集約関数は特段に考慮していません．</p>
<h4 style="margin-top: -00px;">■ ビューと一貫性制約</h4>
<p>リレーショナル代数を使ってビューを定義しているということは，リレーショナルデータベースに対する問合せの結果をビューと称し，それらを再帰的にリレーショナル代数演算のオペランドに使用することで，あらゆる問合せの結果をビューとすることができるという意味です．ここで注意しないといけないことは，たとえば，定義 4 の (1) 項より「実リレーション R はビュー V である」と定義できますが，<u>V と R は同一ではなく</u>，SQL の表現を用いれば，問合せ SELECT * FROM R の結果リレーションをビュー V と定義したということです．どういうことかというと，R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) としたとき V(A<sub>1</sub>, A<sub>2</sub>, …, A<sub>n</sub>) と書けて，インスタンスとしての R と V は同一ではあるものの，R をインスタンスとするリレーションスキーマ <span style="font-style: italic;"><b>R</b></span>(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) に定義されている一貫性制約は V では定義されていないということです．あくまで，V は SQL で表現すれば CREATE VIEW V AS SELECT * FROM R と定義されるように，単に SELECT * FROM R の結果リレーションでしかないからです．実リレーションとビューとのこの差異は大きいと認識するべきで，すでに関連した議論を 2.3 節 (d) 項で行っていますが，ビューはあくまで更新の窓口であって，それが更新可能である場合，その更新がデータベースの一貫性制約に抵触するかしないかの検証はそのビューを定義するために使われた基底リレーションで行うということです．なお，更新時の一貫性制約の検証はビューに特有ではなく，一般にリレーショナルデータベースの実リレーションを更新した場合でも必ず行われないといけないわけで，これがビューの更新可能性を規定した定義1の条件から (d) 項を外した理由となったことは前述の通りです．<br />
以下，実リレーション R がビュー V であることを V=R と表示したり，実リレーション R と S の和ビュー V を V=R∪Sと 表示したりしますが，「=」（等号）の意味は上記のごとく，単に右辺での問合せの結果リレーションを左辺（＝ビュー）としたということで，リレーションスキーマとしての同一性を表現しているものではありません．この議論はバッグビューに対しても全く同様に成立します．</p>
<p style="margin-top: -12px;"><strong>3.2 基本的リレーショナルビューの更新可能性（スキーマレベル）</strong></p>
<p style="margin-top: -12px;"> <b>表 3</b> に「基本的リレーショナルビューの更新可能性（スキーマレベル）」の結果を示します（ここでは，コッドの定義した 8 つのリレーショナル代数演算で定義されるビューを基本的ビューとしています）．行列値の 〇 は更新可能，× は更新不可能を表します．†はキー保存という条件を表しています．</p>
<div style="text-align: center;"><img decoding="async" style="margin-top: -08px; width: 680px;" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2023/03/viewsupport-chart333.png" alt="表3　基本的リレーショナルビューの更新可能性（スキーマレベル）" /></div>
<p>&nbsp;</p>
<p>以下，表 3 が得られた論拠を示します．要点は，ビューの更新可能性をスキーマレベルで論じているので，更新可能であることを示すにはすべてのインスタンスに対して更新可能であることを示す必要があること，一方で更新不可能を示すにはそのようなインスタンスと更新の組合せを 1 例示せばよいということです．</p>
<p style="margin-top: -00px;"><strong>【1】和ビューは削除可能</strong></p>
<p style="margin-top: -12px;"> R と S を和両立なリレーション，V=R∪S を和ビューとする．<br />
V に対して削除 <b>d</b>=deleteσ<sub>φ</sub>(V) from V; が発行されたとする．ここに φ は探索条件である．削除の定義は V←V－σ<sub>φ</sub>(V) なので，この削除を表す論理式は次の通りである．<br />
∀t(t∈σ<sub>φ</sub>(V)⇒¬V(t))<br />
つまり，φ(t)=真となる V のタップル，つまり σ<sub>φ</sub>(V) のタップル，は（削除後は）V のタップルであってはいけないと言っている．<br />
一方，V=R∪S なので t∈σ<sub>φ</sub>(V)⇔t∈σ<sub>φ</sub>(R∪S)⇔t∈σ<sub>φ</sub>(R)∨t∈σ<sub>φ</sub>(S) である．したがって，<br />
t∉σ<sub>φ</sub>(V)⇔t∉σ<sub>φ</sub>(R)∧t∉σ<sub>φ</sub>(S) である．<br />
つまり，「<b>d</b> を実現するためには，R から探索条件 φ を満たすタップルをすべて削除しかつ S からも探索条件 φ を満たすタップルをすべて削除することが必要かつ十分である」と言っている．このとき，(R－σ<sub>φ</sub>(R))∪(S－σ<sub>φ</sub>(S))=(R∪S)－(σ<sub>φ</sub>(R)∪σ<sub>φ</sub>(S)) =V－σ<sub>φ</sub>(R∪S)=V－σ<sub>φ</sub>(V) が成り立つ．したがって，<b>d</b> を実現するための必要かつ十分条件は <b>d</b> を T(<b>d</b>) に変換することである．<br />
T(<b>d</b>)=begin; deleteσ<sub>φ</sub>(R) from R; deleteσ<sub>φ</sub>(S) from S; end;<br />
このことは，特定のR，S，φ に依存することなく成立するので，「和ビューは削除可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p><b>【例題１】</b>R(A, B), S(A, B), dom(A)=dom(B)={i|Integer(i)}, R={(1, 1), (2, 2)}, S={(2, 2), (3, 3)}, V=R∪S={(1, 1), (2, 2), (3, 3)}, φ=(A=2∧B=2) とする．このとき，σ<sub>φ</sub>(V)={(2, 2)} なので，V－σ<sub>φ</sub>(V)={(1, 1), (3, 3)} であり, 一方，R－σ<sub>φ</sub>(R)={(1, 1)}, S－σ<sub>φ</sub>(S)={(3, 3)} なので (R－σ<sub>φ</sub>(R))∪(S－σ<sub>φ</sub>(S))= {(1, 1)}∪{(3, 3)}={(1, 1), (3, 3)} となり，<b>d</b>=deleteσ<sub>φ</sub>(V) from V; が T(<b>d</b>)=begin; deleteσ<sub>φ</sub>(R) from R; deleteσ<sub>φ</sub>(S) from S; end; により実現できていることが確認できる．</p>
<p style="margin-top: -00px;"><strong>【2】和ビューは挿入不可能</strong></p>
<p style="margin-top: -12px;"> 和ビューは挿入不可能であるインスタンスレベルの反例を一つ示せばよい．たとえば，和両立な 2 つのリレーションを R(A, B)=∅, S(A, B)= ∅（ここに ∅ は空集合を表す）とすると，V=R∪S=∅ である．このとき，V に対する挿入 <b>i</b>=insert {(1, 1)} into V; が発行されたとする．挿入の定義は V←V∪{(1, 1)} なので，この挿入を表す論理式は次の通りである．<br />
∀t(t∈{(1, 1)}⇒V(t))<br />
一方，∀t(V(t)⇔R(t)∨S(t)) なので，<b>i</b> を実現する変換 T は 3 つ存在することが分かる．<br />
T<sub>1</sub>(<b>i</b>)= insert {(1, 1)} into R;<br />
T<sub>2</sub>(<b>i</b>)= insert {(1, 1)} into S;<br />
T<sub>3</sub>(<b>i</b>)= begin; insert {(1, 1)} into R; insert {(1, 1)} into S; end;<br />
しかしながら，これら 3 つの変換の存在は変換の一意性に反するので，定義 1 より V への挿入 <b>i</b> は変換不可能である．したがって，「和ビューは挿入不可能である」という命題がスキーマレベルで成立する．</p>
<p>したがって，「和ビューは書換不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【3】差ビューは削除不可能</strong></p>
<p style="margin-top: -12px;"> 差ビューは削除不可能であるインスタンスレベルの反例を一つ示せばよい．たとえば，和両立な 2 つのリレーションを R(A, B)={(1, 1), (2, 2)}, S(A, B)={(1, 1), (3, 3)} とする．このとき，差ビュー V=R－S={(2, 2)} である．<br />
そこで，V に対する削除 <b>d</b>=deleteσ<sub>φ</sub>(V) from V; ここに φ=(A=2∧B=2)，つまり σ<sub>φ</sub>(V)= {(2, 2)}，が発行されたとする．<br />
削除の定義は V←V－σ<sub>φ</sub>(V) なので，この削除を表す論理式は次の通りである．<br />
∀t(t∈σ<sub>φ</sub>(V)⇒¬V(t))<br />
一方，¬V(t)⇔t∉V⇔t∉(R－S)⇔t∉R∨t∈S である．<br />
したがって，<b>d</b> を実現する変換 T が 3 つ存在することが分かる．<br />
T<sub>1</sub>(<b>d</b>)= delete {(2, 2)} from R;<br />
T<sub>2</sub>(<b>d</b>)= insert {(2, 2)} into S;<br />
T<sub>3</sub>(<b>d</b>)= begin; delete {(2, 2)} from R; insert {(2, 2)} into S; end;<br />
この 3 つの変換の存在は変換の一意性に反するので，定義 1 より V への削除 <b>d</b> は変換不可能である．したがって，「差ビューは削除不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【4】差ビューは挿入可能</strong></p>
<p style="margin-top: -12px;"> R と S を和両立なリレーション，V=R－S を差ビューとする．<br />
V に対して挿入 <b>i</b>=insert X into V;　ここに X⊆dom(<span style="font-style: italic;"><b>R</b></span>)，が発行されたとする．挿入の定義は V←V∪X なので，この挿入を表す論理式は次の通りである．<br />
∀t(X(t)⇒V(t))<br />
一方，差ビューの定義より，∀t(V(t)⇔R(t)∧¬S(t)) である．<br />
したがって，挿入に関して次に示す論理式を得る．<br />
∀t(X(t)⇒R(t)∧¬S(t))<br />
つまり，「V に X を挿入するためには，R に X を挿入し S から X を削除しなさい」と言っている．このとき，(R∪X)－(S－X)=(R－S)∪X=V∪X が成り立つ．したがって，<b>i</b> を実現するための必要かつ十分条件は <b>i</b> を T(<b>i</b>) に変換することである．<br />
T(<b>i</b>)=begin; insert X into R; delete X from S; end;<br />
このことは，特定の R，S，X に依存することなく成立するので，「差ビューは挿入可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p>したがって，「差ビューは書換不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【5】共通ビューは削除不可能</strong></p>
<p> 和両立なリレーション R と S の共通は R∩S=R－(R－S) であるので，一般的ビューとなる「差ビューは削除不可能である」という命題がスキーマレベルで成立しているので，「共通ビューは削除不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【6】共通ビューは挿入可能</strong></p>
<p> R と S を和両立なリレーション，V=R∩S を共通ビューとするとき，それは次のように定義される．<br />
∀t(V(t)⇔(R(t)∧S(t)))<br />
そこで，V に対して挿入 <b>i</b>=insert X into V; ここに X⊆dom(R) が発行されたとする．挿入の定義はV←V∪Xなので，この挿入を表す論理式は次の通りである．<br />
∀t(X(t)⇒V(t))<br />
したがって，挿入に関して次に示す論理式を得る．<br />
∀t(X(t)⇒(R(t)∧S(t)))<br />
つまり，「V に X を挿入するためには，R に X を挿入しかつ S に X を挿入しなさい」と言っている．このとき，(R∪X)∩(S∪X)=(R∩S)∪X=V∪X である．したがって，<b>i</b> を実現するための必要かつ十分条件は <b>i</b> を T(<b>i</b>) に変換することである．<br />
T(<b>i</b>)=begin; insert X into R; insert X into S; end;<br />
このことは，特定の R，S，X に依存することなく成立するので，「共通ビューは挿入可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p>したがって，「共通ビューは書換不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【7】直積ビューは削除不可能</strong></p>
<p> インスタンスレベルでの反例を一つ示す．2 つのリレーションを R(A, B)={(1, 1)}, S(C, D)={(1, 1)}，直積ビューを V=R×S={(1, 1, 1, 1)} とする．このとき，V に対して削除 <b>d</b>=delete σ<sub>φ</sub>(V) from V; ここに φ=(A=1∧B=1∧C=1∧D=1) が発行されたとする．<br />
削除の定義は V←V－σ<sub>φ</sub>(V) なので，この削除を表す論理式は次の通りである．<br />
∀t(t∈σ<sub>φ</sub>(V)⇒¬V(t))<br />
V=R×S={u*v|u∈R∧v∈S} なので，¬V(t)⇔t∉(R×S)⇔u∉R∨v∉S，ここに t=u*v とする，である．<br />
一方，σ<sub>φ</sub>(V)⇔σ<sub>φ</sub>(R×S)⇔σ<sub>φ1</sub>(R)×σ<sub>φ2</sub>(S)，ここに φ はΩ<sub>R×S</sub>=Ω<sub>R</sub>×Ω<sub>S</sub> 上の選択条件で，φ<sub>1</sub>=φ|Ω<sub>r</sub> と φ<sub>2</sub>=φ|Ω<sub>S</sub> はそれぞれ φ を Ω<sub>R</sub> とΩ<sub>S</sub> 上に制限した探索条件を表す．この例では φ<sub>1</sub>=(A=1∧B=1)，φ<sub>2</sub>=(C=1∧D=1) である．<br />
したがって，<b>d</b> を実現する変換 T が 3 つ存在することが分かる．<br />
T<sub>1</sub>(<b>d</b>)= delete σ<sub>φ1</sub>(R) from R; ここに φ<sub>1</sub>=(A=1∧B=1)<br />
T<sub>2</sub>(<b>d</b>)= delete σ<sub>φ2</sub>(S) from S; ここに φ<sub>2</sub>=(C=1∧D=1)<br />
T<sub>3</sub>(<b>d</b>)= begin; delete σ<sub>φ1</sub>(R) from R; delete σ<sub>φ2</sub>(S) from S; end;<br />
これは，変換の一意性に反するので，定義 1 より V への削除 <b>d</b> は変換不可能である．したがって，「直積ビューは削除不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【8】直積ビューは挿入不可能</strong></p>
<p> インスタンスレベルで反例を一つ示す．2 つのリレーションを R(A, B)={(1, 1)}, S(C, D)={(1, 1)} とする．このとき，V=R×S={(1, 1, 1, 1)} を直積ビューとする．このとき，V に対して挿入 <b>i</b>=insert {(2, 2, 2, 2) } into V; が発行されたとする．このとき，<b>i</b> を実現するためには R に (2, 2) を挿入し S には (2, 2) を挿入しないといけない．しかしながら，それにより V={(1, 1, 1, 1), (2, 2, 2, 2), (1, 1, 2, 2), (2, 2, 1, 1) } となり副作用が生じる．したがって，「直積ビューは挿入不可能である」という命題がスキーマレベルで成立する．</p>
<p>したがって，「直積ビューは書換不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【9】射影ビューは削除可能</strong></p>
<p> リレーション R の属性集合 X（X⊆Ω<sub>R</sub>）上の射影ビューを V=π<sub>X</sub>(R) とする．V に対して削除 <b>d</b>=delete σ<sub>φ</sub>(V) from V; が発行されたとする． ここに選択条件 φ は dom(V)（=dom(X)）の元を引数とする述語であるが，X⊆Ω<sub>R</sub> なのでdom(R) の元を引数とする述語ともなっている．<br />
このとき，σ<sub>φ</sub>(V)=σ<sub>φ</sub>(π<sub>X</sub>(R))= π<sub>X</sub>(σ<sub>φ</sub>(R)) である．<br />
<b>d</b> の定義は V←V－σ<sub>φ</sub>(V) であるので，V－σ<sub>φ</sub>(V)= π<sub>X</sub>(R)－π<sub>X</sub>(σ<sub>φ</sub>(R))=π<sub>X</sub>(R－σ<sub>φ</sub>(R)) となる．<br />
つまり，<b>d</b> を実現するためには，「R から σ<sub>φ</sub>(R) を削除して，その結果を X 上で射影しなさい」と言っている．このとき，φ は dom(R) の元を引数とする述語ともなっているので，<br />
π<sub>X</sub>(R－σ<sub>φ</sub>(R))=π<sub>X</sub>(R)－π<sub>X</sub> (σ<sub>φ</sub>(R))=π<sub>X</sub>(R)－σ<sub>φ</sub>(π<sub>X</sub>(R))=V－σ<sub>φ</sub>(V) が成立する．<br />
したがって，<b>d</b> が変換可能であるための必要かつ十分条件は <b>d</b> を T(<b>d</b>) に変換することである．<br />
T(<b>d</b>)=deleteσ<sub>φ</sub>(R) from R;<br />
このことは R と X と φ がどのような場合でも成り立つ．よって，「射影ビューは削除可能である」という命題はスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p><b>【例題２】</b>R(A, B)={(1, 1), (1, 2), (2, 1)}, V=π<sub>{B}</sub>(R)={(1), (2)} とし, V に対して削除 <b>d</b>=delete <sub>σB=1∨B=3</sub>(V) from V; が発行されたとする．T(<b>d</b>)=delete <sub>σB=1∨B=3</sub>(R) from R; に変換されるが，T(<b>d</b>) により B=1 の R のタップル (1, 1) と (2, 1) は R から削除される．B=3 のタップルは R に存在しないので R から削除されるタップルはない．したがって，R={(1, 2)} となるから，π<sub>{B}</sub>(R)={(2)}と 所望の結果となっている．</p>
<p style="margin-top: -00px;"><strong>【10】射影ビューはキー保存ならば挿入可能</strong><br />
リレーション R の属性集合 X⊆Ω<sub>R</sub> 上の射影ビューを V=π<sub>X</sub>(R) とするとき，射影ビュー V が<b>キー保存</b>（key preservation）であるとは，X がリレーション R の主キー K を含むときをいう．<br />
そこで，リレーション R の属性集合 X 上の射影ビューを V=π<sub>X</sub>(R) とすると，V の定義から次が成立する．<br />
∀u(V(u)⇔∃t(R(t)∧u=t[X]))<br />
V に対して挿入 <b>i</b>=insert W into V; ここに W⊆dom(V) が発行されたとする．この挿入を表す論理式は次の通りである．<br />
∀v(W(v)⇒V(v))<br />
したがって，次が成立する．<br />
∀v(W(v)⇒∃t(R(t)∧v=t[X]))<br />
このとき，挿入 <b>i</b>=insert W into V; の R への変換 T を次のように定義する．<br />
T(<b>i</b>)=insert <ruby>W<rt style="background-color: white;">～</rt></ruby> into R;<br />
ここに <ruby>W<rt style="background-color: white;">～</rt></ruby> は W から次のように定義されるタップル <ruby>w<rt style="background-color: white;">~</rt></ruby> の集合で，w∈W とした時，タップル <ruby>w<rt style="background-color: white;">~</rt></ruby> は次のように定義される．<br />
<ruby>w<rt style="background-color: white;">~</rt></ruby>[X]=w∧<ruby>w<rt style="background-color: white;">~</rt></ruby>[Ω<sub>R</sub>－X]=(null, null, <sub>…</sub>, null)<br />
さて，射影ビュー V がキー保存であるとすると，K を R の主キーとしたとき，K⊆X であるので，∀w, w’(W(w)∧W(w’)∧(w[K]≠w’[K]⇒w≠w’))が成立する．加えて，K は（候補キーではなく）主キーなので，キー制約からその属性が null をとることはないから，W と <ruby>W<rt style="background-color: white;">～</rt></ruby> の間には w<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /><ruby>w<rt style="background-color: white;">~</rt></ruby> という 1 対 1 の対応が成立する．<br />
このとき，π<sub>X</sub>(R∪<ruby>W<rt style="background-color: white;">～</rt></ruby>)=π<sub>X</sub>(R)∪π<sub>X</sub>(<ruby>W<rt style="background-color: white;">～</rt></ruby>)=π<sub>X</sub>(R)∪W=V∪W が成立するので，<b>i</b> を実現するための必要かつ十分条件は <b>i</b> を T(<b>i</b>) に変換することであることが分かる．<br />
T(<b>i</b>)=insert <ruby>W<rt style="background-color: white;">～</rt></ruby> into R;<br />
したがって，「射影ビューはキー保存であれば挿入可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p>したがって，「射影ビューはキー保存ならば書換可能である」という命題がスキーマレベルで成立する．</p>
<p>なお，「キー保存」という条件自体は属性集合 X が主キー K を含んでいるかどうかという判定なのでスキーマレベルの検証であるので，定義 1 の条件 (a)～(c) をクリアして「射影ビューはキー保存ならば挿入可能である」という命題はスキーマレベルで成立することとなった．<br />
ただし，変換可能ならば基底リレーション R に <ruby>W<rt style="background-color: white;">～</rt></ruby> が挿入されることになるが，その挿入が R のキー制約に抵触するのかしないのかのチェックが必ず必要となってくることに注意したい．</p>
<p><b>【例題３】</b>R(A, B)={(1, 1), (2, 2), (3, 3)}, V=π<sub>{A}</sub>(R)={(1), (2), (3)}, <b>i</b>=insert {(4)} into V; が発行されたとする．<b>i</b> の変換 T(i)= insert {(4, null)} into R; とする．その結果，R(<u>A</u>, B)={(1, 1), (2, 2), (3, 3), (4, null)} となり，改めて π<sub>{A}</sub>(R)= {(1), (2), (3), (4)} となりなって，所望の挿入が実現していることがわかる．</p>
<p style="margin-top: -00px;"><strong>【11】選択ビューは削除可能</strong><br />
リレーション R の選択ビューを V=σ<sub>φ</sub>(R) とする．V に対して削除 <b>d</b>=deleteσ<sub>ψ</sub>(V) from V; が発行されたとする．<b>d</b> の定義は V←V－σ<sub>φ</sub>(V) であるが，V－σ<sub>φ</sub>(V)=σ<sub>φ</sub>(R)－σ<sub>ψ</sub>(σ<sub>φ</sub>(R))=σ<sub>φ</sub>(R)－σ<sub>φ</sub>(σ<sub>ψ</sub>(R))=σ<sub>φ</sub>(R－σ<sub>ψ</sub>(R)) となる．<br />
つまり，<b>d</b> を実現するためには，「R から σ<sub>ψ</sub>(R) を削除して，その結果に φ を施しなさい」，つまり，<b>d</b> を T(<b>d</b>) に変換しなさいと言っている．<br />
T(<b>d</b>)=deleteσ<sub>ψ</sub>(R) from R;<br />
このとき，上記のごとく σ<sub>φ</sub> (R－σ<sub>ψ</sub>(R))= V－σ<sub>φ</sub>(V) であるので，この変換は <b>d</b> が変換可能であるための必要かつ十分条件になっている．この性質は R と φ と ψ がどのような場合でも成り立つので，「選択ビューは削除可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p><b>【例題４】</b>社員(社員番号，給与)={(1, 10), (2, 20), (3, 30)} を実リレーション，ビューを貧乏社員=σ<sub>給与≦20</sub>(社員)={(1, 10), (2, 20)} とし，削除 <b>d</b>=delete σ<sub>給与≧10 </sub>(貧乏社員) from 貧乏社員; が発行されたとする．<b>d</b> は変換可能で次の通りである．<br />
T(<b>d</b>)=deleteσ<sub>給与≧10∧給与≦20</sub>(社員) from 社員;</p>
<p style="margin-top: -00px;"><strong>【12】選択ビューは挿入可能</strong><br />
リレーション R の選択ビューを V=σ<sub>φ</sub>(R)とする．V に対して挿入 <b>i</b>=insert X into V; が発行されたとする．<b>i</b> の定義は V←V∪X なので，この挿入を表す論理式は次の通りである．<br />
∀t(X(t)⇒V(t))<br />
一方，選択ビューの定義より，∀t(V(t)⇔R(t)∧<sub>φ</sub>(t)) である．したがって，次に示す論理式を得る．<br />
∀t(X(t)⇒(R(t)∧φ(t)))<br />
ところで，X⊆dom(V)=σ<sub>φ</sub>(dom(R)) なので，∀t(X(t)⇒<sub>φ</sub>(t))，つまり ∀t(t∉X(t)∨<sub>φ</sub>(t)) が成立している．したがって，<br />
∀t(X(t)⇒(R(t)∧φ(t)))⇔∀t(t∉X(t)∨(R(t)∧<sub>φ</sub>(t)))⇔∀t((t∉X(t)∨(R(t))∧(t∉X(t)∨<sub>φ</sub>(t)))⇔∀t(t∉X(t)∨(R(t)) ⇔∀t(X(t)⇒R(t)) となる．<br />
つまり，「<b>i</b>を実現するためには，R に X を挿入しなさい」と言っている．このとき，X⊆σ<sub>φ</sub>(dom(R))なので σ<sub>φ</sub>(X)=X となり，σ<sub>φ</sub>(R∪X) =σ<sub>φ</sub>(R)∪σ<sub>φ</sub>(X)=V∪X である．したがって，<b>i</b> を実現するための必要かつ十分条件は <b>i</b>を T(<b>i</b>) に変換することである．<br />
T(<b>i</b>)= insert X into R;<br />
このことは，特定の R，φ，X に依存することなく成立するので，「選択ビューは挿入可能」であるという命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p>したがって，「選択ビューは書換可能である」という命題がスキーマレベルで成立する．</p>
<p><b>【例題５】</b>社員(社員番号，給与)={(1, 10), (2, 20), (3, 30)} を実リレーション，貧乏社員=σ<sub>給与≦20</sub>(社員)={(1, 10), (2, 20)} をビューとし，挿入 <b>i</b>=insert {(100, 10), (101, 15)} into 貧乏社員; が発行されたとする．<b>i</b> は変換可能で，その変換は次の通りである．<br />
T(<b>i</b>)=insert {(100, 10), (101, 15)} into社員;</p>
<p style="margin-top: -00px;"><strong>【13】結合ビューや商ビューは共に削除不可能，挿入不可能，書換不可能</strong><br />
これらを定義するためには直積演算が使われるので，それらの更新可能性に則して，共にスキーマレベルで削除不可能，挿入不可能，書換不可能である．</p>
<p style="margin-top: -00px;"><strong>3.3 一般的リレーショナルビューの更新可能性（スキーマレベル）</strong></p>
<p style="margin-top: -12px;"> 一般にリレーショナルビューはリレーショナル代数演算を「再帰的」に適用して定義されます．このようなビューを「一般的リレーショナルビュー」といいますが，そのようなビューの更新可能性はそのビュー定義に使われたリレーショナル代数演算で定義される中間ビューの更新可能性に依存することになります（このことは，後述する一般的バッグビューについても同様です）．<br />
ここではリレーショナルデータベースで最も典型的であるといわれている連言問合せ（conjunctive query）で定義されるビューを例として説明します．<br />
<b>【例題６】</b>（一般的リレーショナルビューの更新可能性判定）<br />
R(<u>A</u>, B, C)，S(<u>B</u>, D) をリレーション（アンダーバーは主キーを表す），V=π<sub>{R.A, R.B}</sub>(σ<sub>C=c</sub>(R)<br />
⨝<sub>R.B=S.B</sub>σ<sub>D=d</sub>(S)) を連言問合せビュー定義とする．このビューの定義木（＝構文解析木）を図 2 に示す．<br />
このとき，V へ更新 <b>u</b> が発行されると，V=π<sub>{R.A, R.B}</sub> 中間ビュー<sub>1</sub> なので，射影ビューに対する <b>u</b> の変換可能性をチェックする．表 3 を参照すると（table lookup），<b>u</b> が削除ならば変換可能，<b>u</b> が挿入ならばキー保存という条件付きで変換可能であることを知る．ともに，（挿入には条件が付くが）変換可能なので，V への更新 <b>u</b> の変換可能性は，中間ビュー<sub>1</sub> に対する更新の変換可能性のチェック結果に依ることとなる．ところが，中間ビュー<sub>1</sub> は結合ビューである．そこで，再び表 3 を参照すると，結合ビューは削除不可能，挿入不可能，書換不可能であることを知る．したがって，<b>u</b> は押し並べて変換不可能であることを知る．この時点で，ビュー V への更新 <b>u</b> が変換不可能であると判定される．</p>
<p>このように，一般的リレーショナルビューの更新可能性はそのビューの定義木をトップダウンに，たとえば幅優先探索（breadth first）で走査しながら，ノードごとでその更新可能性を表 3「基本的リレーショナルビューの更新可能性（スキーマレベル）」に参照していけば，その更新可能性をスキーマレベルで検証することができます．</p>
<div style="text-align: center;"><img decoding="async" style="margin-top: -08px; width: 380px;" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2023/03/viewsupport-figure22.png" alt="図2　連言問合せビューVの定義木" /></div>
<p>&nbsp;</p>
<h4>4. バッグビューの更新可能性（スキーマレベル）</h4>
<p style="margin-top: -12px;"><strong>4.1 バッグビューの定義</strong></p>
<p style="margin-top: -12px;"><strong>4.1.1 バッグ</strong></p>
<p style="margin-top: -12px;"> SQL のテーブルはリレーションと異なりタップルの重複出現を許します．タップルの重複出現を許すことで問合せの結果から重複タップルを削除する手間が省けるので（つまりソートや突合せなどの処理を省ける），問合せ処理がリレーションの場合に比べて高速になります．また，タップルの重複出現を許容することで集約関数を駆使できるという利点もあります．反面，SQL のテーブルを格納しておくためにはリレーションに比べて余計に記憶領域を必要とすることは明らかです．<br />
さて，一般に元（element）の重複出現を許す元の集まりを<b>マルチ集合</b>（multiset）あるいは<b>バッグ</b>（bag）といいます．数学ではマルチ集合，SQL ではバッグを用いることが多いので本稿ではバッグとします．タップルの重複出現を許さないリレーションとそれを許すバッグではデータの表現・操作・管理などで違いを生じますが，それはリレーショナルデータモデルは集合意味論（set semantics）に立脚し，SQL は<b>バッグ意味論</b>（bag semantics）に立脚しているからだと表現します．リレーショナルデータモデルでリレーショナル代数（relational algebra）が定義されたと同様に，バッグに対しては<b>バッグ代数</b>（bag algebra）が定義されます [8]．リレーショナル代数表現と同様に<b>バッグ代数表現</b>（bag algebra expression）を定義でき，リレーショナルビューがリレーショナル代数表現で定義されたのと同様に，バッグビュー（bag view）はバッグ代数表現として定義されます．まずはバッグを定義することから始めます．<br />
<b>【定義５】</b>（バッグ）</p>
<p style="margin-top: -20px;"> バッグ R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>) は<b>潜在リレーション</b>（concealed relation）<u>R</u>(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>)と重複度関数 m: dom(<u>R</u>)→<span style="font-style: italic;"><b>Z</b></span><sup>+</sup>（<span style="font-style: italic;"><b>Z</b></span><sup>+</sup> は正の整数）の組である．ここに dom(<u>R</u>)=dom(A<sub>1</sub>)×dom(A<sub>2</sub>)×・・・×dom(A<sub>n</sub>)とする．</p>
<p>つまり，バッグは R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>)=(<u>R</u>(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, An), <span style="font-style: italic;">m</span>) と定義されるということです．たとえば，バッグ R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>) の潜在リレーションを <u>R</u>(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>)= {t<sub>1</sub>, t<sub>2</sub>, <sub>&#8230;</sub>, t<sub>p</sub>}，重複度関数を <span style="font-style: italic;">m</span>(t<sub>i</sub>)=k<sub>i</sub>（k<sub>i</sub>≧1）とするとき，バッグ R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>)={t<sub>1</sub>(k<sub>1</sub>), t<sub>2</sub>(k<sub>2</sub>), <sub>&#8230;</sub>, t<sub>p</sub>(k<sub>p</sub>)} となります．ここに t<sub>i</sub>(k<sub>i</sub>) はタップル t<sub>i</sub> が丁度 k<sub>i</sub> 本あることを表すための記法で，k<sub>i</sub> はバッグ R 中に生起するタップル t<sub>i</sub> の<b>重複度</b>（multiplicity）です．t(k)∈R で重複度 k のタップル t がバッグ R の元であることを表すことにすると，t(k)∈R⇔t∈<u>R</u>∧k=<span style="font-style: italic;">m</span>(t) ということです．バッグ R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>) ={t<sub>1</sub>(k<sub>1</sub>), t<sub>2</sub>(k<sub>2</sub>), <sub>&#8230;</sub>, t<sub>p</sub>(k<sub>p</sub>)} は (∀i=1,<sub>..</sub>,p)(k<sub>i</sub>=1) のときリレーション(＝集合)です．k<sub>i</sub>=1 のとき，t<sub>i</sub>(1) と書かずに，単に t<sub>i</sub> と書くことも多く，また t<sub>i</sub>(0) は t<sub>i</sub> が存在していないことを意味します．<br />
バッグ R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>) のドメイン dom(R) は次のように定義されます．dom(R)=dom(<u>R</u>)×<br />
{k|PositiveInteger(k)}=dom(A<sub>1</sub>)×dom(A<sub>2</sub>)×・・・×dom(A<sub>n</sub>)×{k|PositiveInteger(k)}，ここに<br />
PositiveInteger(k) は k が正整数であるとき真となる命題です．ちなみに，(a<sub>1</sub>, a<sub>2</sub>, <sub>…</sub>, a<sub>n</sub>, k)∈<br />
dom(R)⇔(a<sub>1</sub>, a<sub>2</sub>, <sub>…</sub>, a<sub>n</sub>)(k)∈R と解釈します．</p>
<h4 style="margin-top: -00px;">■ 潜在キーと潜在キー制約</h4>
<p>バッグはリレーションと違って重複タップルの出現を許すので，バッグの全属性の組をとってきてもタップルの一意識別能力はなく，したがってリレーションのキー（key）に相当する概念はありません．しかしながら，バッグ　R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>) を定義するために潜在リレーション <u>R</u>(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>) を導入しましたが，<u>R</u> は正真正銘のリレーションなので，<u>R</u> にはキーが存在します．そこで，<u>R</u> のキーを K とし，K をバッグ R の<b>潜在キー</b>（concealed key）と呼ぶことにします．リレーションの主キーと候補キーに対応して潜在主キーと潜在候補キーが定義できます．<br />
潜在キーは一見無秩序に重複タップルの出現を許しているように見えるバッグに「秩序」をもたらしていることになります．換言すれば，潜在キーが K であるバッグ R={t<sub>1</sub>(k<sub>1</sub>), t<sub>2</sub>(k<sub>2</sub>), <sub>&#8230;</sub>, t<sub>p</sub>(k<sub>p</sub>)} に重複行除去（δ）を施して得られるリレーション δ(R)={t<sub>1</sub>, t<sub>2</sub>, <sub>&#8230;</sub>, t<sub>p</sub>} のキーは K なので次が成り立ちます．<br />
∀t, t’(t∈δ(R)∧t’∈δ(R)∧t[K]=t’[K]⇒t=t’)<br />
つまり，バッグで重複して出現しているタップル同士のキー値が等しいならばタップルとしては同一だということになります．マルチ集合論では「重複元の識別不可能性」という原理が知られていますが [9]，上記はその原理のデータベース的解釈といえます．<br />
したがって，たとえば，潜在リレーションを<u>社員</u>(<u>社員番号</u>，氏名，所属，給与)，ここに社員番号が主キー，とするバッグ社員(社員番号，氏名，所属，給与) に (007, 山田太郎，K55，50) というタップルは何本出現しても構いませんが，たとえば，(007, 佐藤一郎，K41，50) というタップルがバッグ社員に (007, 山田太郎，K55，50) と共に出現するということはない，ということです．この制約を<b>潜在キー制約</b>（concealed key constraint）と呼ぶことにしますが，これはリレーションでのキー制約に相当する概念で，バッグあるいはバッグビュー更新時の一貫性制約の一つになります．</p>
<p style="margin-top: -00px;"><strong>4.1.2 バッグ代数</strong></p>
<p style="margin-top: -12px;"> バッグのデータ操作言語であるバッグ代数を定義しますが，以下に示す演算からなります．<br />
<b>【定義６】</b>（バッグ代数）</p>
<p style="margin-top: -20px;"> 一般に，R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>)={t<sub>1</sub>(k<sub>1</sub>), t<sub>2</sub>(k<sub>2</sub>), <sub>&#8230;</sub>, t<sub>p</sub>(k<sub>p</sub>)} とS(B<sub>1</sub>, B<sub>2</sub>, <sub>&#8230;</sub>, B<sub>m</sub>)={u<sub>1</sub>(ℓ<sub>1</sub>), u<sub>2</sub>(ℓ<sub>2</sub>), <sub>&#8230;</sub>, u<sub>q</sub>(ℓ<sub>q</sub>)} をバッグとするとき，バッグ代数は次に示す演算子からなる．加法和（additive union），モーナス（monus），共通を定義するにあたり R と S は和両立とする．<br />
● 重複行除去（δ）<br />
● 加法和（⨄），モーナス（∸），共通（∩）<br />
● 直積（×）<br />
● 射影（π<sub>X</sub>(R)，ここに Ｘ⊆Ω<sub>R</sub>）<br />
● 選択（σ<sub>φ</sub> (R)，ここに φ は dom(R) 上の選択条件）<br />
● <span style="font-style: italic;">θ</span>-結合（R⨝<sub>AiθBj</sub>S，ここに R.A<sub>i</sub> と S.B<sub>j</sub> は θ-比較可能）</p>
<p>これらの演算子の定義を<b>表 4</b> で与えます．</p>
<p><img decoding="async" style="margin-top: -08px; width: 726px;" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2023/03/viewsupport-chart44.png" alt="表4　バッグ代数演算" align="middle" /></p>
<p>補足すれば，バッグ代数に特有な演算として，重複行削除演算（δ），モーナス（∸），加法和（⨄）をあげられます．モーナス（∸）はリレーショナル代数演算の差（－）に対応した演算ですが，タップルの重複度を考慮しています．マルチ集合論では和には加法和とは別に最大和（maximum union，∪）を定義することもできます．その定義は R∪S={t(k)|∃t(k<sub>i</sub>)∈R∧∃t(ℓ<sub>j</sub>)∈S∧k= max(k<sub>i</sub>, ℓ<sub>j</sub>)} で，リレーショナル代数の和（∪）はバッグ代数の最大和と両立する演算です．しかしながら，<br />
一般にタップルの重複出現を許す SQL のテーブルの UNION ALLを念頭においている和は加法和です．<br />
SQL との対応付けをすると，重複行削除演算は SQL の SELECT DISTINCT * FROM R に相当します．加法和，モーナス，共通はそれぞれ SQL の UNION ALL，EXCEPT ALL，INTERSECT ALL に相当します．直積，選択，射影，<span style="font-style: italic;">θ</span>-結合の演算結果から重複行は削除されず SQL の SELECT ALL の意味を持っています．上記の演算はお互いに独立ではなく，たとえば，重複行除去，加法和，差，直積，射影，選択の 6 つの演算は互いに独立です．独立でない演算子を許容しているのはその有用性によります．<br />
なお，R, S をバッグ，ψ, φ を述語としたとき，次の性質が成り立ちます [8]．このような性質はバッグ代数で成り立つので，リレーショナル代数でも成り立ちます．<br />
● σ<sub>ψ∨φ</sub>(R)=σ<sub>ψ</sub>(R) ⨄σ<sub>φ</sub>(R)<br />
● σ<sub>ψ∧φ</sub>(R)=σ<sub>ψ</sub>(R)∩σ<sub>φ</sub>(R)<br />
● σ<sub>¬φ</sub>(R)=R∸σ<sub>φ</sub>(R)<br />
● δ(σ<sub>φ</sub>(R))=σ<sub>φ</sub>(δ(R))</p>
<p>バッグ代数でもバッグのタップルの属性が null をとることがありうるので，バッグ代数演算もリレーショナル代数の時と同じように（3.1.1 項），3 値論理に拡張されて，推量 <span style="font-style: italic;">θ</span>-選択や推量 <span style="font-style: italic;">θ</span>-結合が定義できます．</p>
<p style="margin-top: -00px;"><strong>4.1.3 バッグ代数表現としてのバッグビュー</strong></p>
<p style="margin-top: -20px;"> リレーショナルデータベースに対する問合せがリレーショナル代数表現として記述できたのと同様に，バッグデータベースに対する問合せはバッグ代数表現として記述できます．したがって，定義 4 でリレーショナルビューを定義したのと同様に，バッグビューはバッグ代数表現として次のように定義できます．データベースに格納されているバッグを実バッグといいます．<br />
<b>【定義７】</b>（バッグビュー）</p>
<p style="margin-top: -20px;"> (1)</p>
<p>実バッグはバッグビューである．</p>
<p style="margin-top: -20px;"> (2)</p>
<p>V をバッグビューとし，δを重複行除去とするとき，δ(V) はバッグビューである（重複行除去ビュー）．</p>
<p style="margin-top: -20px;"> (3)</p>
<p>V<sub>1</sub> と V<sub>2</sub> を和両立なバッグビューとするとき，それらの加法和 V<sub>1</sub>⨄V<sub>2</sub> はバッグビューである（加法和ビュー）．</p>
<p style="margin-top: -20px;"> (4)</p>
<p>V<sub>1</sub> と V<sub>2</sub> を和両立なバッグビューとするとき，それらのモーナス V<sub>1</sub>∸V<sub>2</sub> はバッグビューである（モーナスビュー）．</p>
<p style="margin-top: -20px;"> (5)</p>
<p>V<sub>1</sub> と V<sub>2</sub> をバッグビューとするとき，それらの直積 V<sub>1</sub>×V<sub>2</sub> はバッグビューである（バッグ直積ビュー）．</p>
<p style="margin-top: -20px;"> (6)</p>
<p>V をバッグビューとするとき，その射影 π<sub>X</sub>(V) はバッグビューである（バッグ射影ビュー）．</p>
<p style="margin-top: -20px;"> (7)</p>
<p>V をバッグビューとするとき，その選択 σ<sub>φ</sub>(V) はバッグビューである（バッグ選択ビュー）．</p>
<p style="margin-top: -20px;"> (8)</p>
<p>(1)～(6) で定義されるもののみがバッグビューである．</p>
<p>基本的バッグビューと一般的バッグビューという用語も基本的リレーショナルビューと一般的リレーショナルビューに準じて使用します．以下，特に混乱が生じないと考えられる場合にはバッグビューを単にビューと記すこともあります．</p>
<p style="margin-top: -00px;"><strong>4.2 バッグビューの更新</strong></p>
<p style="margin-top: -20px;"> バッグビュー V に対する削除や挿入に対する形式や考え方はリレーショナルビューに対する削除や挿入と基本的には同一ですが，削除では差に代わりモーナスが，挿入では和に代わり加法和がその定義に用いられるところが異なります．書換を削除と挿入の系列と定義することや注意点はリレーショナルビューに対する場合と同様です．<br />
削除（<b>d</b>）：deleteσ<sub>φ</sub>(V) from V; ここに φ は dom(V) の元を引数とする述語である．<br />
挿入（<b>i</b>）：insert X into V; ここに X⊆dom(V) とする．<br />
● 削除の定義は V←V∸σ<sub>φ</sub>(V) です．モーナスが使われているとことに注意します．<br />
● 挿入の定義は V←V⨄X です．加法和が使われているとことに注意します．</p>
<p>ここで，バッグビューのドメインについて補足をします．</p>
<h4 style="margin-top: -20px;">■ バッグビューのドメインについて</h4>
<p>4.1.1 項で，バッグ R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>) のドメインは dom(R)=dom(A<sub>1</sub>)×dom(A<sub>2</sub>)×・・・×dom(A<sub>n</sub>)×{k|PositiveInteger(k)} と定義されました．バッグビューのドメインもその延長線上にありますが，（リレーショナルビューのときと同様に）ビュー定義が勘案されます．つまり，バッグビューを V(A<sub>1’</sub>, A<sub>2’</sub>, <sub>…</sub>, A<sub>r’</sub>) としたとき，V のドメインは一般には dom(V)=dom(A<sub>1’</sub>)×dom(A<sub>2’</sub>)×・・・×dom(A<sub>r’</sub>)×{k|PositiveInteger(k)} とはならず，ビュー定義を満たすその部分集合になります．幾つか例題で見ていくと次の通りです．<br />
まず，バッグ R(A<sub>1</sub>, A<sub>2</sub>, <sub>&#8230;</sub>, A<sub>n</sub>) の重複行削除ビュー V=δ(R) のドメインは dom(V)= dom(A<sub>1</sub>)×<br />
dom(A<sub>2</sub>)×・・・×dom(A<sub>n</sub>)×{1} です．R と S を和両立とするとき加法和ビュー V=R⨄S やモーナスビュー V=R∸S のドメインは dom(V)=dom(R)×{k|PositiveInteger(k)} です．バッグ R と S の直積ビュー V=R×S のドメインは dom(V)=dom(R)×dom(S)×{k|PositiveInteger(k)} です．バッグ R(A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>) の属性集合 X（⊆Ω<sub>R</sub>），ここに Ω<sub>R</sub>={A<sub>1</sub>, A<sub>2</sub>, <sub>…</sub>, A<sub>n</sub>}，上の射影ビュー V=π<sub>X</sub>(R) のドメインは，X={A<sub>1’</sub>, A<sub>2’</sub>, <sub>…</sub>, A<sub>r’</sub>}，ここに 1≦1’≦2’≦…≦r’≦n，として dom(V)=dom(A<sub>1’</sub>)×dom(A<sub>2’</sub>)×･･･×dom(A<sub>r’</sub>)×{k|PositiveInteger(k)} となります．バッグ R(A, B) のバッグ選択ビューを V=σ<sub>B≦b</sub>(R) としたとき，dom(V)=dom(A)×σ<sub>B≦b</sub>(dom(B))×{k|PositiveInteger(k)} となります．バッグ R(A, B) と S(B,C) の等結合ビュー V(A, R.B, S.B, C)=R⨝<sub>R.B=S.B</sub>S のドメインは dom(V)=σ<sub>R.B=S.B</sub>(dom(A)×<br />
dom(R.B)×dom(S.B)×dom(C))×{k|PositiveInteger(k)} となります．このようにビューのドメインはいずれもビュー定義が勘案されて定義されます．なお，クライアントにはビューの定義を考慮したうえでそれに抵触しない挿入を発行しなければならないという負担がかかることはリレーショナルビューの場合と同じです．</p>
<p style="margin-top: -00px;"><strong>4.3 基本的バッグビューの更新可能性（スキーマレベル）</strong></p>
<p style="margin-top: -12px;"> リレーショナルビューが集合意味論に立脚し，バッグビューはバッグ意味論に立脚している点は異なりますが，ビューの更新可能性は定義 1 で与えた通りです．つまり，バッグビュー V への更新 <b>u</b> は，(a) 一意で，(b) 副作用がなく，(c) 余計な更新がない変換 T が存在するとき更新可能であること定義されます．ただ，上述のように，削除にはモーナスが，挿入には加法和が用いられるところが異なります．また，バッグにはそれを定義するための潜在リレーションが存在する点もバッグビューの更新可能性に影響を与えます．なお，本稿ではスキーマレベルでビューの更新可能性を論じているので，リレーショナルビューの場合と同様な理由で，定義 1 の条件 (d) は不問に付しています．</p>
<p>さて，基本的バッグビューの更新可能性（スキーマレベル）をリレーショナル代数の場合と同様なアプローチで解明していきますが，ここで大事なことは次の命題が成立することです．</p>
<p style="margin-top: -20px;">
<p>「リレーション（＝集合）はバッグの特殊な場合なので，バッグで成り立つ性質はリレーションでも成り立つが，リレーションで成り立つ性質が必ずしもバッグで成り立つとは限らない」</p>
<p>したがって，<b>表 3</b> で〇（更新可能）となっている場合でも，それはリレーショナルビューに対する結果なので，それに対応するバッグ代数でのビューの更新可能性がまた〇になるかどうかは分かりません．一方，表3で×（更新不可能）となっている性質がバッグビューで〇となることはないわけですから，バッグビューの更新可能性はリレーショナルビューのそれに比べて限定的となります．<br />
以下，<b>表 5</b> にバッグビューの更新可能性を検証した結果を示すと共に，その論拠を示します．</p>
<p><img decoding="async" style="margin-top: -08px; width: 726px;" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2023/03/viewsupport-chart555.png" alt="表5　基本的バッグビューの更新可能性（スキーマレベル）" align="middle" /></p>
<p style="margin-top: -00px;"><strong>【1】重複行削除ビューは削除可能</strong></p>
<p style="margin-top: -12px;"> 一般にバッグ R={t<sub>1</sub>(k<sub>1</sub>), t<sub>2</sub>(k<sub>2</sub>), <sub>&#8230;</sub>, t<sub>p</sub>(k<sub>p</sub>)} の重複行除去ビュー δ(R)={t<sub>1</sub>, t<sub>2</sub>, <sub>&#8230;</sub>, t<sub>p</sub>} に対して，削除 <b>d</b>=delete σ<sub>φ</sub>(δ(R)) from δ(R); が発行されたとする．<br />
そこで，σ<sub>φ</sub>(δ(R)) ={t<sub>1’</sub>, t<sub>2’</sub>, <sub>&#8230;</sub>, t<sub>q’</sub>}，1≦1’＜2’＜<sub>&#8230;</sub>＜q’≦pとするとき，削除 <b>d</b> を R への削除 T(<b>d</b>)=delete {t<sub>1’</sub>(k<sub>1’</sub>), t<sub>2’</sub>(k<sub>2’</sub>), <sub>&#8230;</sub>, t<sub>q’</sub>(k<sub>q’</sub>)} from R; 変換する．このとき，δ(R∸{t<sub>1’</sub>(k<sub>1’</sub>), t<sub>2’</sub>(k<sub>2’</sub>), <sub>&#8230;</sub>, t<sub>q’</sub>(k<sub>q’</sub>)})=δ(R) ∸{t<sub>1’</sub>, t<sub>2’</sub>, <sub>&#8230;</sub>, t<sub>q’</sub>}=δ(R)∸σ<sub>φ</sub>(δ(R)) である．これはすべてのバッグ R と任意の削除 <b>d</b> に対して成立するので，「重複行削除ビューは削除可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p style="margin-top: -00px;"><strong>【2】重複行削除ビューは挿入不可能</strong></p>
<p style="margin-top: -12px;"> 挿入不可能な重複行削除ビューの例を示す．たとえば，バッグ R={(1)(3)} の重複行除去ビュー δ(R)={(1)} に対して，挿入 <b>i</b>=insert {(2)} into δ(R) が発行されたとする．すると，<b>i</b> の R への変換は次のように無数に存在し一意ではない．したがって，「重複行削除ビューは挿入不可能である」という命題がスキーマレベルで成立する．<br />
T<sub>k</sub>(<b>i</b>)=insert {(2)(k)} into R; ここに k=1, 2, 3, <sub>…</sub></p>
<p>したがって，「重複行削除ビューは書換不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【3】加法和（⨄）ビューは削除可能</strong></p>
<p style="margin-top: -12px;"> 加法和ビューを V=R⨄S とし，削除 <b>d</b>=deleteσ<sub>φ</sub>(V) from V; が発行されたとき，削除の定義から次が成り立つ．<br />
V∸σ<sub>φ</sub>(V)= (R⨄S)∸σ<sub>φ</sub>(R⨄S)=σ<sub>¬φ</sub>(R⨄S)=σ<sub>¬φ</sub>(R)⨄σ<sub>¬φ</sub>(S) = (R∸σ<sub>φ</sub>(R)) ⨄ (S∸σ<sub>φ</sub>(S))．<br />
したがって，削除 <b>d</b>= deleteσ<sub>φ</sub>(V) from V; を実現するための必要かつ十分条件は <b>d</b> を T(<b>d</b>)に変換することである．<br />
T(<b>d</b>)=begin; deleteσ<sub>φ</sub>(R) from R; deleteσ<sub>φ</sub>(S) from S; end;<br />
このことはすべてのバッグ R, S, φ と任意の削除 <b>d</b> に対して成立するので，「加法和ビューは削除可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p>なお，σ<sub>φ</sub>(R⨄S)=σ<sub>φ</sub>(R) ⨄σ<sub>φ</sub>(S) の証明は次の通りである．<br />
<b>【命題１】</b>σ<sub>φ</sub>(R⨄S)=σ<sub>φ</sub>(R) ⨄σ<sub>φ</sub>(S) が成立する．<br />
（証明）t(k)∈σ<sub>φ</sub>(R⨄S) とすると，∃t(k<sub>i</sub>)∈R∧∃t(ℓ<sub>j</sub>)∈S∧k=k<sub>i</sub>＋ℓ<sub>j</sub>∧φ(t) が成り立つ．φ(t)=φ(t)∧φ(t) なので，(∃t(k<sub>i</sub>)∈R∧φ(t))∧(∃t(ℓ<sub>j</sub>)∈S∧φ(t))∧k= k<sub>i</sub>＋ℓ<sub>j</sub> が成り立つ．すなわち，∃t(k<sub>i</sub>)∈σ<sub>φ</sub>(R)∧∃t(ℓ<sub>j</sub>)∈σ<sub>φ</sub>(S)∧k= k<sub>i</sub>＋ℓ<sub>j</sub> が成り立つ．したがって，⨄ の定義により，<br />
t(k)∈σ<sub>φ</sub>(R) ⨄σ<sub>φ</sub>(S) が成り立つ．逆に t(k)∈σ<sub>φ</sub>(R) ⨄σ<sub>φ</sub>(S) とすると，上記の逆の推論をたどることで t(k)∈σ<sub>φ</sub>(R⨄S) であることを示せる．</p>
<p style="text-align: right;">Q.E.D.</p>
<p style="margin-top: -00px;"><strong>【4】加法和（⨄）ビューは挿入不可能</strong></p>
<p style="margin-top: -12px;"> 加法和ビューとそれに対して発行された挿入が変換不可能な一例を示す．<br />
たとえば，和両立なバッグ R と S を R={(1)(3)}, S={(1)(2)} とするとき，加法和ビュー V=R⨄SはV={(1)(5)} である．このとき，V に対して挿入 <b>i</b>=insert {(2)(1)} into V; が発行されたとする．すると，<b>i</b> の変換は次の 2 通り考えられる．<br />
T<sub>1</sub>(<b>i</b>)=insert {(2)(1)} into R;<br />
T<sub>2</sub>(<b>i</b>)=insert {(2)(1)} into S;<br />
このように変換に一意性がないので，「加法和ビューは挿入不可能である」という命題がスキーマレベルで成立する．</p>
<p>したがって，「加法和（⨄）ビューは書換不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【5】モーナス（∸）ビューは挿入不可能</strong></p>
<p style="margin-top: -12px;"> モーナスビューとそれに対して発行された挿入が変換不可能な一例を示す．<br />
和両立なバッグ R と S を，たとえば R={(1)(3)}, S={(1)(2)} とするとき，モーナスビュー V=R∸S は V={(1)(1)} である．このとき，V に対して挿入 <b>i</b>=insert {(1)(2)} into V; が発行されたとする．すると，<b>i</b> の変換は次のように無数にあり一意ではない．<br />
T<sub>k</sub>(<b>i</b>)=begin; insert {(1)(2+k)} into R; insert {(1)(k)} into S; end; ここに k=0, 1, 2, 3, <sub>…</sub><br />
したがって，<b>i</b> は変換可能ではない．このように反例を示せるので，「モーナスビューは挿入不可能である」という命題がスキーマレベルで成立する．</p>
<p>したがって，「モーナスビューは書換不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【6】バッグ共通ビューは挿入不可能</strong></p>
<p style="margin-top: -12px;"> バッグ共通ビューとそれに対して発行された挿入が変換不可能な一例を示す．<br />
和両立なバッグ R と S を，たとえば R={(1)(3)}, S={(1)(2)} とするとき，V=R∩S={(1)(2)} である．このとき，V に対して挿入 <b>i</b>=insert {(1)(1)} into V; が発行されたとすると，<b>i</b> の変換は次の 2 通り考えられる．<br />
T<sub>1</sub>(<b>i</b>)=insert {(1)(1)} into S;<br />
T<sub>2</sub>(<b>i</b>)=begin; insert {(1)(1)} into R; insert {(1)(1)} into S; end;<br />
つまり，変換は一意ではなく <b>i</b> は変換可能ではない．このように反例を示せるので，「バッグ共通ビューは挿入不可能である」という命題がスキーマレベルで成立する．</p>
<p>したがって，「バッグ共通ビューは書換不可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【7】バッグ射影ビューは削除可能</strong></p>
<p style="margin-top: -12px;"> バッグ R の属性集合 X 上のバッグ射影ビューを V=π<sub>X</sub>(R) とし，V へ削除 <b>d</b>= deleteσ<sub>φ</sub>(V) from V; が発行されたとする．このとき σ<sub>φ</sub>(V)=σ<sub>φ</sub>(π<sub>X</sub>(R)) である．<br />
ところで，σ<sub>φ</sub>(π<sub>X</sub>(R))= π<sub>X</sub>(σ<sub>φ</sub>(R)) が成立する．<br />
<b>d</b>: V←V∸σ<sub>φ</sub>(V) であるから，V=V∸σ<sub>φ</sub>(V)= π<sub>X</sub>(R)∸π<sub>X</sub>(σ<sub>φ</sub>(R))= π<sub>X</sub>(R∸σ<sub>φ</sub>(R)) が成立する．したがって，<b>d</b> を実現するための必要かつ十分条件はそれを T(<b>d</b>) に変換することである．<br />
T(<b>d</b>)=deleteσ<sub>φ</sub>(R) from R;<br />
このことはすべてのバッグ R, S, φ と任意の削除 <b>d</b> に対して成立するので，「バッグ射影ビューは削除可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p>バッグ射影ビューとそれに対して発行された削除が変換可能な一例を示す．<br />
<b>【例題７】</b><br />
バッグ　R(A, B)={(1, 1), (1, 2), (1, 3), (2, 1), (2, 2)}　とし，V=π<sub>{A}</sub>(R)={(1)(3), (2)(2)} を R の {A} 上のバッグ射影ビューとする．このとき，V へ削除 <b>d</b>=delete σ<sub>φ</sub>(V) from V; ここに φ=(A=1)，が発行されたとするとき，一意で副作用がなく余分な更新をしない <b>d</b> の変換は次の通りである．<br />
T(<b>d</b>)=delete σ<sub>A=1</sub>(R) from R;</p>
<p style="margin-top: -00px;"><strong>【8】バッグ射影ビューは潜在キー保存ならば挿入可能</strong></p>
<p style="margin-top: -12px;"> バッグ R の属性集合 X 上のバッグ射影ビューを V=π<sub>X</sub>(R) とするとき，バッグ射影ビュー V が<b>潜在キー保存</b>（concealed key preservation）であるとは，X がバッグ R の潜在主キー K を含むときをいう．<br />
バッグ R の属性集合 X 上のバッグ射影ビューを V=π<sub>X</sub>(R) とする．V への挿入 <b>i</b>=insert W into V; が発行されたとする．ここに W={w<sub>1</sub>(k<sub>1</sub>), w<sub>2</sub>(k<sub>2</sub>), <sub>…</sub>, w<sub>m</sub>(k<sub>m</sub>)}，∀i((w<sub>i</sub>, k<sub>i</sub>)∈dom(V)) とする．<br />
このとき，W からバッグ <ruby>W<rt style="background-color: white;">～</rt></ruby> を次のように生成する．ここに null は空を表す．<br />
<ruby>W<rt style="background-color: white;">～</rt></ruby>={<ruby>w<rt style="background-color: white;">~</rt></ruby><sub>1</sub>(k<sub>1</sub>), <ruby>w<rt style="background-color: white;">~</rt></ruby><sub>2</sub>(k<sub>2</sub>), <sub>…</sub>, <ruby>w<rt style="background-color: white;">~</rt></ruby><sub>m</sub>(k<sub>m</sub>)}，ここに <ruby>w<rt style="background-color: white;">~</rt></ruby><sub>i</sub>[X]=w<sub>i</sub> かつ <ruby>w<rt style="background-color: white;">~</rt></ruby><sub>i</sub>[ Ω<span style="font-style: italic;"><b><sub>R</sub></b></span>－X]=(null, null, <sub>&#8230;</sub>, null) とする．<br />
このとき，V が潜在キー保存であるとすると，X は R の潜在主キー K を含み，潜在主キー属性が null をとることはないから，W と <ruby>W<rt style="background-color: white;">～</rt></ruby> の間には w(k)<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /><ruby>w<rt style="background-color: white;">~</rt></ruby>(k) という 1 対 1 の関係性が成立する．<br />
また，π<sub>X</sub>(R⨄<ruby>W<rt style="background-color: white;">～</rt></ruby>)=π<sub>X</sub>(R) ⨄π<sub>X</sub>(<ruby>W<rt style="background-color: white;">～</rt></ruby>)=π<sub>X</sub>(R) ⨄W=V⨄W が成立するので，<b>i</b> を実現するための必要かつ十分条件は <b>i</b> を T(<b>i</b>)に変換することであることが分かる．<br />
T(<b>i</b>)=insert <ruby>W<rt style="background-color: white;">～</rt></ruby> into R;<br />
これは全てのバッグ射影ビュー V と挿入 <b>i</b> に対して成立するので，「バッグ射影ビューは潜在キー保存であれば挿入可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p>したがって，「バッグ射影ビューは潜在キー保存ならば書換可能である」という命題がスキーマレベルで成立する．</p>
<p>なお，「潜在キー保存」という条件自体はスキーマレベルの検証であるが，この検証を通過しただけでは「潜在キー制約」に抵触してしまう可能性がある．そのためにはインスタンスレベルの検証が必須となることは，3.2 節【10】項「射影ビューはキー保存ならば更新可能」のところで指摘したことと同様である．</p>
<p style="margin-top: -00px;"><strong>【9】バッグ選択ビューは削除可能</strong></p>
<p style="margin-top: -12px;"> バッグ R のバッグ選択ビューを V=σ<sub>φ</sub> (R) とし，V への削除 <b>d</b>=deleteσ<sub>ψ</sub>(V) from V; が発行されたとする．ここに ψ は探索条件である．X=σ<sub>ψ</sub>(V) とすると，V=σ<sub>φ</sub> (R) なので，X=σ<sub>ψ</sub>(V)=σ<sub>ψ</sub>(σ<sub>φ</sub> (R))=σ<sub>ψ∧φ</sub> (R)となる．<br />
そこで，<b>d</b> を次に示す T(<b>d</b>) に変換する．<br />
T(<b>d</b>)=deleteσ<sub>ψ∧φ</sub>(R) from R;<br />
このとき，<br />
σ<sub>φ</sub>(R∸σ<sub>ψ∧φ</sub>(R))=σ<sub>φ</sub>(R)∸σ<sub>φ</sub>(σ<sub>ψ∧φ</sub>(R)))=σ<sub>φ</sub>(R)∸σ<sub>ψ∧φ</sub>(R)=σ<sub>φ</sub>(R)∸σ<sub>ψ</sub>(σ<sub>φ</sub>(R))=V∸σ<sub>ψ</sub>(V) が成立する．<br />
この性質は全てのバッグ選択ビュー V と削除 <b>d</b> に対して成立するので，「バッグ選択ビューは削除可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p style="margin-top: -00px;"><strong>【10】バッグ選択ビューは挿入可能</strong></p>
<p style="margin-top: -12px;"> バッグ R のバッグ選択ビューを V=σ<sub>φ</sub> (R) とし，V への挿入 <b>i</b>=insert X into V; ここに X⊆dom(V) が発行されたとする．dom(V)= dom(σ<sub>φ</sub>(R))=σ<sub>φ</sub>(dom(R)) なので，X⊆σ<sub>φ</sub>(dom(R)) である．このとき，σ<sub>φ</sub>(σ<sub>φ</sub>(dom(R)))=σ<sub>φ</sub>(dom(R)) なので，σ<sub>φ</sub> (X)=X である．<br />
そこで，<b>i</b> を T(<b>i</b>) に変換する．<br />
T(<b>i</b>)=insert X into R;<br />
このとき，σ<sub>φ</sub> (R ⨄X)=σ<sub>φ</sub> (R) ⨄σ<sub>φ</sub> (X)=V ⨄X が成立する．<br />
この性質は全てのバッグ選択ビュー V と挿入 <b>i</b> に対して成立するので，「バッグ選択ビューは挿入可能である」という命題がスキーマレベルで成立する．なお，T が定義 1 の条件 (a)～(c) を満たしていることはその定義から明らかである．</p>
<p>したがって，「バッグ選択ビューは書換可能である」という命題がスキーマレベルで成立する．</p>
<p style="margin-top: -00px;"><strong>【11】バッグ <span style="font-style: italic;"><b>θ</b></span>-結合ビューは削除・挿入・書換不可能</strong></p>
<p style="margin-top: -12px;"> バッグ <span style="font-style: italic;">θ</span>-結合ビューの更新可能性については，リレーショナル代数での <span style="font-style: italic;">θ</span>-結合ビューの更新可能性がスキーマレベルで削除，挿入，いずれも不可能なので，バッグビューのそれについても不可能となる．</p>
<p style="margin-top: -00px;"><strong>4.4 一般的バッグビューの更新可能性（スキーマレベル）</strong></p>
<p style="margin-top: -12px;"> 表 5「基本的バッグビューの更新可能性（スキーマレベル）」は 4.3 節の議論の結果をまとめたものです．一般的バッグビューの更新可能性の判定は，3.3 節で論じた一般的リレーショナルビューの更新判定と全く同じように，作成した一般的バッグビューの定義木をトップダウンに，たとえば幅優先探索で走査しながら，ノードごとでその更新可能性を表 5 に参照していけば，その更新可能性をスキーマレベルで検証することができます．</p>
<h4>5．おわりに</h4>
<p style="margin-top: -18px;"> 本稿ではリレーショナルビューとバッグビューの更新可能性をスキーマレベルで論じその全貌を明らかにしました．集合であればバッグですが，逆は成立しないので，当然のこととして，リレーショナルビューが更新可能であっても，それを潜在リレーションとするバッグビューが更新可能となる保証はありません．その違いは表 3 と表 5 を比較することで一目瞭然かと思います．<br />
末筆ながら，理論と実践のはざまに言及しておくと次のとおりです．SQL はバッグ意味論に基づいたリレーショナルデータベース言語なので，SQL でのビューの更新可能性は本稿の表 5 に示したバッグビューの更新可能性に基づき規格化されてしかるべきす．しかしながら，現実には SQL が理論に先行してしまいました．それには歴史的理由があって，バッグビューの更新可能性の理論的研究は 1990 年代に入ってから盛んになったのですが，ビューとその更新可能性の重要性をいち早く認識していた SQL はその初めての国際標準規格である SQL-87 を制定した 1987 年時点でその規格化の第一歩を踏み出していました．そこでの原則は極めて現実的で，SQL-87 を改正した SQL-92 に見るように「更新が可能なビューは，実表から選択または射影だけを行っており，ビュー表の行および列が基となる実表の行および列と 1 対 1 に対応している場合である」というものでした．SQL-87 は SQL-92, SQL:1999, SQL:2003, SQL:2008, SQL:2011 等を経て最新規格の SQL:2016 まで改正され続け，少しでも多様なビューを更新可能にしようとビューとその更新可能性の規格も改正され続けてきましたが，「1 対 1 の対応」という基本的考え方に変更はないようです．本稿で論じたように，バッグビューの更新可能性はあくまで理論的であってそのような呪縛とは無縁です．SQL:2023 が近々発表されるようですが，何か変化はあるのでしょうか，注目したいと思います．<br />
なお，本稿ではビューの更新可能性をスキーマレベルで論じましたが，その対極にある「インスタンスレベルアプローチ」や「SQL のビューサポート」については機会を得て報告できればと思います．</p>
<p><strong>【文献】</strong></p>
<p style="margin-top: -10px;">[1]</p>
<p>Edgar F. Codd. A Relational Model of Data for Large Shared Data Banks. Communications of the ACM, Vol.13, No.6, pp.377-387, 1970.</p>
<p style="margin-top: -22px;">[2]</p>
<p>Edgar F. Codd. Recent Investigations in Relational Database Systems. Information Processing 74, pp. 1017-1021, North-Holland, 1974.</p>
<p style="margin-top: -22px;">[3]</p>
<p>Michael Stonebraker, Eugene Wong, Peter Kreps, and Gerald Held. The Design and Implementation of INGRES. ACM Transactions on Database Systems, Vol. 1, No. 3, pp. 189-222, September 1976.</p>
<p style="margin-top: -22px;">[4]</p>
<p>Umeshwar Dayal and Philip A. Bernstein. On the Updatability of Relational Views. Proceeding of VLDB 1978, pp.368-377, 1978.</p>
<p style="margin-top: -22px;">[5]</p>
<p>Edgar F. Codd. Extending the Database Relational Model to Capture More Meaning. ACM TODS, Vol.4, No.4, pp.397-434, 1979.</p>
<p style="margin-top: -22px;">[6]</p>
<p>増永 良文，長田 悠吾，石井 達夫. 更新意図の外形的推測に基づいたビューの更新可能性とその PostgreSQL 上での実現可能性検証. 日本データベース学会和文論文誌 Vol.18-J, Article No.1, 2020 年 3 月．</p>
<p style="margin-top: -22px;">[7]</p>
<p>増永 良文，長田 悠吾，石井 達夫. 整合ラベリング問題としてのクロス結合ビューの更新可能性. 日本データベース学会和文論文誌 Vol.19-J, Article No.1, 2021 年 3 月．</p>
<p style="margin-top: -22px;">[8]</p>
<p>Joseph Albert. Algebraic Properties of Bag Data Types. Proceedings of the 17th International Conference on Very Large Databases, pp.211-219, 1991．</p>
<p style="margin-top: -22px;">[9]</p>
<p>Wayne D. Blizard. Multiset Thoery. Notre Dame Journal of Formal Logic, Vol.30, No.1. pp.36-66, Winter 1989.</p>
<p style="margin-top: -22px;">[10]</p>
<p>増永良文．リレーショナルデータベース入門[第3版]，サイエンス社，2017．</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
