データベーステーブルのサブタイプ化
-
09-09-2019 - |
質問
データベースを設計するときにテーブルのサブタイプについてよく聞きますし、その背後にある理論はよく知っています。ただし、実際にテーブルのサブタイプが動作しているのを見たことはありません。テーブルのサブタイプはどのように作成できますか?私は MS Access を使用していますが、GUI (Access 2003) だけでなく SQL でも実行する方法を探しています。
乾杯!
解決
簡単な例としては、主キーとそのテーブル内にいくつかの列を持つ Person テーブルを作成することが挙げられます。ここで、person テーブル (そのスーパータイプ) への外部キーを持つ Student という名前の別のテーブルを作成できます。Student テーブルには、GPA、Major などのスーパータイプにはない列がいくつか含まれています。ただし、名前、姓などは親テーブルに含まれます。Student テーブルの外部キーを使用して、いつでも Person テーブルの学生名にアクセスできます。
とにかく、次のことを覚えておいてください。
- 階層はスーパータイプとサブタイプの関係を示します
- スーパータイプには共通の属性があります
- サブタイプには一意の属性があります
他のヒント
テーブルのサブタイプは、EER 図における概念的なものです。これを直接サポートする RDBMS (オブジェクト リレーショナル DBMS を除く) は見たことがありません。これらは通常、次のいずれかで実装されます。
- 単一テーブル内のサブタイプの各プロパティに対する NULL 許容列のセット
- 基本タイプのプロパティ用のテーブルと、サブタイプのプロパティを含むベース テーブルごとに最大 1 行を含むその他のテーブルを使用する場合
テーブルサブタイプの概念は有用である。
のサブタイプのテーブルには戻っても、サブタイプのテーブルの主キーであるその親の両方の外部キーを持つことになります。
Accessアプリケーションと同様に、バインドされたアプリケーションを設計する際に、サブタイプが参加するという点で大きなコストを課すことに留意してください。
たとえば、次の3つのサブタイプのテーブルでスーパータイプのテーブルを持っていて、一度に一つの形で3つのすべてを表示する必要がある(そして、あなただけではなく、スーパータイプの日付を表示する必要がある)場合は、使用しての選択で終わります3つの外部結合とのNz()、またはあなたは、3つの相互に排他的なSELECTステートメント(各サブタイプのための1)のALL UNIONを必要としています。これらのどちらが編集可能になります。
私はスーパー/サブタイプのテーブルで働いていた最初の主要なアプリからいくつかのSQLを貼り付けするつもりだったが、それを見て、SQLはそれだけで人々を混乱させる非常に複雑です。私のアプリが複雑だったので、それはあまりありませんが、問題の性質が複雑であるためです - ユーザにデータの完全なセットを提示し、スーパーやサブタイプの両方、その性質上コンプレックスです。それでの作業から私の結論は、私が唯一のサブタイプのテーブルでオフに良いされているだろうということでした。
それはそれはアクセスの結合形態は、必ずしもユーザーにこのデータを提示することが簡単にしていないだけという、いくつかの状況で有用ではありませんと言うことはありません。
私は、私が取り組んできた同様の問題を持っています。
反復可能なパターンを探している間、、私は(TABLE_NAME、PK_ID)ソリューションを使用しないことを意味している、私は参照整合性を放棄していないことを確認したかった。
私は最終的に解決します:
塩基型テーブル:CUSTOMER
サブタイプテーブル:PERSON、BUSINESS、GOVT_ENTITY
私は、それぞれの外部キーで、CUSTOMERでNULL値可能PRERSON_ID、BUSINESS_IDとGOVT_ENTITY_IDフィールドを入れて、一つだけがNULLでないチェック制約。それはちょうど、NULL可能外部キーを追加し、チェック制約を変更する必要があり、新しいサブタイプを追加するのは簡単です。