0

MS Visio を使用してデータベースをモデル化し、モデルの一部にトランザクション カテゴリが含まれています。親テーブルには、トランザクション ID、タイムスタンプ、金額、およびトランザクション タイプがあります。小切手、銀行振込、クレジット カードの 3 つの子テーブルがあり、すべて transactionId によって親に関連付けられています。

この種の関係を SQL Server に実装する特定の方法はありますか?それとも、実装を私に任せている概念モデルにすぎませんか? 後者の場合、テーブルがすべて transactionId に関連付けられている場合、親テーブルに transactionType 列があるのはなぜですか?クエリを絞り込むだけですか? つまり、親テーブルの行が transactionType として「小切手」を指定している場合、小切手の子テーブルを照会/結合するだけでよいことがわかりますか?

ふと思いついたのですが、これは単なる ISA 階層でしょうか。その場合、ISA 親エンティティで識別される列をそれぞれ含む 3 つの異なるテーブルを作成することになりますか?

4

2 に答える 2

1

これは基本的に複数テーブルの継承ですが、必要に応じてドメイン内で単純な参照関係としてモデル化することもできます。

セレクタ フィールド/プロパティを使用する正当な理由はたくさんあります。明らかな 1 つは、アプリケーションまたはサービスが詳細をロードする方法に関するヒントを取得するためです。そのため、考えられるすべてのテーブルから考えられるすべての行をロードする必要はありません (20 種類のトランザクションがある場合にこれを試してください)。

もう 1 つの理由は、多くの場合、エンド ユーザーは必ずしもトランザクションの詳細を知る必要はありませんが、タイプを知る必要があるためです。何らかの財務システムまたは請求システムからの売掛レポートを見ている場合、ほとんどの場合、基本的なレポートについて知る必要があるのは、以前の残高、金額、後続の残高、およびトランザクションの種類だけです。その情報がなければ、読むのは非常に困難です。元帳は必ずしもすべてのトランザクションの詳細を表示するとは限りません。システムによっては、詳細をまったく追跡できない場合もあります。

このタイプのモデルに代わる最も一般的な方法は、異なるトランザクション タイプごとに多数の null 許容列を持つ単一のテーブルです。私は個人的にこのモデルを嫌いますが、これは、単一テーブルの継承のみをサポートする多くのオブジェクト リレーショナル マッパーの要件です。これは、データベースでこれをモデル化したい (または望まない) 唯一の方法です。

于 2010-01-20T16:25:10.863 に答える
1

親テーブルの transactionType は、たとえばトランザクション タイプごとの金額を合計するなど、すべてのトランザクションに対してクエリを実行する場合に役立ちます。

select transactionType, sum(amount)
from transactions 
group by transactionType

列がなくても、子テーブルに対してクエリを実行することでそれを行うことができます。

select 
    case when c.transactionId is not null then 'CHEQUE'
         when cc.transactionId is not null then 'CREDIT CARD'
         ...
    end
,   sum(amount)
from transactions t
left join cheque c on t.transactionId = c.transactionId
left join creditcard cc on t.transactionId = cc.transactionId
...
group by 
    case when c.transactionId is not null then 'CHEQUE'
         when cc.transactionId is not null then 'CREDIT CARD'
         ...
    end

ご覧のとおり、これははるかに難しく、追加するトランザクションの種類ごとにクエリを拡張する必要があります。

于 2010-01-20T16:19:27.600 に答える