しばらく前に、 CJ Dateの著書SQL and Relational Theoryを読んでいました。著者は、SQL の 3 値論理 (3VL) を批判したことで有名です。1)
著者は、SQL で 3VL を避けるべき理由についていくつかの強力な点を述べていますが、null 許容列が許可されていない場合にデータベース モデルがどのようになるかについては概説していません。私はこれについて少し考え、次の解決策を考え出しました。他のデザインオプションを見逃した場合は、それらについて聞きたいです!
1) SQL の 3VL に対する Date の批判も同様に批判されています。Claude Rubinsonによるこの論文を参照してください(CJ Date による元の批判を含みます)。
表の例:
例として、1 つの null 許容列 ( DateOfBirth
)がある次のテーブルを取り上げます。
# +-------------------------------------------+
# | People |
# +------------+--------------+---------------+
# | PersonID | Name | DateOfBirth |
# +============+--------------+---------------+
# | 1 | Banana Man | NULL |
# +------------+--------------+---------------+
オプション 1:NULL
フラグとデフォルト値によるエミュレート:
列を null 可能にする代わりに、任意のデフォルト値が指定されます (例: 1900-01-01
)。追加のBOOLEAN
列では、値DateOfBirth
を単に無視するか、実際にデータが含まれているかを指定します。
# +------------------------------------------------------------------+
# | People' |
# +------------+--------------+----------------------+---------------+
# | PersonID | Name | IsDateOfBirthKnown | DateOfBirth |
# +============+--------------+----------------------+---------------+
# | 1 | Banana Man | FALSE | 1900-01-01 |
# +------------+--------------+----------------------+---------------+
オプション 2: null 許容列を別のテーブルに変換する:
NULL 可能列は、新しいテーブル ( ) に置き換えられますDatesOfBirth
。レコードにその列のデータがない場合、新しいテーブルにはレコードがありません。
# +---------------------------+ 1 0..1 +----------------------------+
# | People' | <-------> | DatesOfBirth |
# +------------+--------------+ +------------+---------------+
# | PersonID | Name | | PersonID | DateOfBirth |
# +============+--------------+ +============+---------------+
# | 1 | Banana Man |
# +------------+--------------+
これはより良い解決策のように思えますが、1 つのクエリで多くのテーブルを結合する必要がある可能性があります。OUTER JOIN
s は許可されないため (結果セットに導入さNULL
れるため)、必要なすべてのデータを以前のように単一のクエリだけでフェッチすることはできなくなりました。
質問:
他に排除するためのオプションはありますかNULL
(ある場合、それは何ですか)?