3

DataTables としてメモリ内に 5 つのテーブル スキーマと、他の 5 つのテーブル間の参照制約のスキーマであるもう 1 つの DataTable があるとします。

5 つのスキーマ テーブルは、テーブル A に B の外部キーに関連する主キー列が含まれるように関連付けられています。B にも C の外部キー列に関連する主キー列が含まれ、C から D に、 C、および D は、E と直接的または間接的に関連していません。

2 つのデータテーブルを取り、これらのテーブルが関連しているか「リンクされている」かを示すブール値を返す関数はどれですか。

私が達成しようとしていること

ドラッグ アンド ドロップ スタイルのインターフェイスで、5 つのテーブルのすべての列をユーザーに提示するとします。ユーザーがグラフィカルにクエリを作成できるようにしたいのですが、同じ select ステートメントで返されるかどうかに基づいて、特定の列を有効/無効にする必要があります。

4

3 に答える 3

1

他のテーブル間の制約を含む 6 番目のテーブルがあるとします。

この情報を効果的に使用でき、直接的な関係のみをマッピングしようとしていると仮定すると、おそらく次のようにすることができます。

  • 他のテーブルから参照される可能性のある主キーを含む可能性のあるすべてのテーブルのリストをコンパイルします
  • そのような各テーブルを反復します X
    • X関連する可能性のあるテーブルのリスト L をコンパイルする
    • テーブル X の主キー K ごとに、L の各テーブルを反復処理し、K への参照を検索します。
    • 任意の K への参照に遭遇するとすぐに、ブレークして L の次のテーブルにスキップします
    • リレーションシップに関する情報を何らかの方法で保存します (例: テーブル X ごとに L からのテーブルのリスト)

これは非常に高レベルで抽象的であることは承知していますが、意味があることを願っています..

テーブルの数とそれらの関係の複雑さによっては、実行に時間がかかる場合がありますが、これ以上の代替手段はありません。

たとえば、各テーブルのキーとリストを含むディクショナリに「禁止された」関係に関する情報を保存できます。このようなもの(一方向の関係の場合、情報の二重登録を避けるため):

{TableA => {TableB, TableC}, 
 TableB => {TableC, TableD}, 
 TableC => {}, 
 etc..}
于 2012-08-14T14:48:04.160 に答える
0

テーブルがデータセット内に存在する場合、データセットには反復可能な Datarelationsも含まれる場合があります。

ただし、データをロードするときに、データベース プロバイダーがデータセットのデータ関係を埋めない可能性が高くなります。

データベースに関係情報を取得するように依頼する必要があります。これは、データベースとデータベースプロバイダーに大きく依存します。

mygeneration mymetaまたはNHibernateのソースを調べて、これを行う方法を確認できます。

于 2012-08-14T15:11:35.133 に答える
-1
// we have not defined which argument is the "parent" and which is the "child"
public bool IsTableRelated(DataTable thisOne, DataTable thatOne) {

    bool thisToThat = DiveDive(thisOne.Constraints, thatOne);
    bool thatToThis = DiveDive(thatOne.Constraints, thisOne);

    return thisToThat || thatToThis;
}


public bool DiveDive(ConstraintsCollection constraints, DataTable target) {

    bool theyRelate = false;

    foreach (Constraint aConstraint in constraints){

        if (aConstraint is ForeignKeyConstraint) {
            if(aConstraint.Table.TableName == target.TableName) {
                theyRelate = true;
                break;  // quit while we're ahead.
            }else{
               theyRelate = DiveDive(aConstraint.Table.Constraints, target);
            }
        } 
    }

    return theyRelate;
}
于 2012-08-14T17:21:51.047 に答える