読者です 読者をやめる 読者になる 読者になる

ネットの海の片隅で

技術ネタの放流、あるいは不法投棄。

関係モデル(Relational model)における剰余について

Relational Model DB

浮かんだ疑問

リレーショナルデータベース入門[新訂版] p.71 によると

\( R(A_1, A_2, \cdots , A_{n-m}, B_1, B_2, \cdots , B_m) \)を\(n\)次、\( S(B_1, B_2, \cdots , B_m) \) \( (m < n) \)を\(m\)次のリレーションとするとき、\(R\)を\(S\)で割った商(\(R \div S\)と書く)は次のように定義されるリレーションである。

\( R \div S = \lbrace t | t \in R[A_1, A_2, \cdots, A_{n-m}] \land ( \forall u \in S ) ( ( t, u ) \in R ) \rbrace \)

なお、\( \div \)なる演算を“商”と名付けている理由は\( ( R \times S ) \div S = R \)となるからである。商演算は直積演算と射影演算と差演算を使って表すことができる。

\( R \div S = R[A_1, A_2, \cdots, A_{n-m} ] - ( ( R[A_1, A_2, \cdots , A_{n-m} ] \times S ) - R ) [A_1, A_2, \cdots , A_{n-m} ] \)

division ではなく modulo を考えてみる

整数では商(division)に関して、\( ( 17 \times 5 ) \div 5 = 17 \)が成り立つ。これを一般化してリレーションに拡張したのが\( ( R \times S ) \div S = R \)だと思う。

ここで剰余(modulo)に関して剰余演算子を\(\%\)と書くことにすると、整数について\( ( 17 \div 5 ) \times 5 + ( 17 \% 5 ) = 3 \times 5 + 2 = 17 \)、すなわち\( ( R \div S ) \times S + ( R \% S ) = R \)という形式が成り立つ。

これを変形すると\(R \% S = R - ( R \div S ) \times S \)となり、冒頭の疑問が導かれる。

フォーマルに定義しようとすると(かなり自信ないけど)こんな感じだろうか。

\( R \% S = \lbrace t | ( t \in R ) \land ( ( \exists u \in S ) ( ( t[A_1, A_2, \cdots , A_{n-m}], u ) \notin R ) \lor ( t[ B_1, B_2, \cdots , B_m ] \notin S ) ) \rbrace \)

気になるポイント

  • そもそもこの考え方は合っているのか。
  • 商が定義されているのに剰余が定義されていないのは何故か。
  • 商も有用性が低いように思われるが、剰余の有効な利用方法はあるのか。

参考になるエントリや書籍があったら教えて頂けると嬉しいです。