2

私は、事前に選択された一連のデータベース テーブル (およびその関係) を使用して、それらのテーブル内のデータを管理するためのユーザー インターフェイスを生成する汎用アプリケーションに取り組んでいます。基本的には、情報スキーマから情報を検索し、主キーと外部キーをすべて取得し、それに基づいて入力フィールドと他のダイアログへのリンクを生成するだけです。これは一般的なソリューションであると想定されているため、相互に意味のある関係を持つ任意のテーブル セットで機能するはずです。

私が遭遇したことの 1 つは外部キー、特に 1 つの制約下の COMPOSITE 外部キーです。たとえば、次のテーブルがあるとします。

会社

CompanyID, CompanyName, CompanyID
--companyID is the primary key which identifies the company. 

分割

DivisionID, CompanyID, DivisionName, DivisionID+CompanyID
--DivisionID+CompanyID is a composite primary key for a division, because it's a one-to-many relationship and division is DEPENDENT on Company. 

チーム

TeamID, DivisionID, CompanyID, TeamName, TeamID+DivisionID+CompanyID
--same as above - a Team is dependent on Division, which has a composite primary key.

さて、このデータベース モデルは - すべての定義で - 有効なモデルです (そして SQL Server はそれを可能にします) - しかし、ある問題に遭遇しました。

たとえば、情報スキーマでは、DivisionID と CompanyID の両方が同じ CONSTRAINT に「割り当て」られます。したがって、正しいテーブルに参加すると、問題が発生します。一方のテーブルのどの列がもう一方のテーブルのどの列であるかを知る方法はありません。上記の例では、列名は同じです (CompanyID は、会社の ID に関連するすべての列の名前です - それは COMPANY テーブルまたは TEAM テーブルなどにあります...)。しかし、そのルールはありません。列の名前は同じでなければならないと言っているので、どの列がどれであるかを実際にプログラムに知らせる方法に途方に暮れています。

TABLE1    COLUMN1        CONSTRAINT         TABLE2     COLUMN2
TEAM      CompID      TEAM_HAS_DIVISION    DIVISION   CompanyID
TEAM      DivID       TEAM_HAS_DIVISION    DIVISION   DivisionID

テーブル TEAM の CompID が、DIVISION テーブルの DivisionID ではなく、CompanyID を参照していることをコンピューターが認識する方法はありますか?

INFORMATION_SCHEMA ビューのデータからこれを行う方法が見つかりませんでした。

はい、人間はその CompID=CompanyID などを簡単に把握できます...しかし、前に述べたように、私は人がこれを見て決定や間違いをする必要のない一般的な解決策を作ろうとしています := )

4

1 に答える 1

2

列の順序でそれらを一致させる必要があります。

  • REFERENTIAL_CONSTRAINTS は、TEAM_HAS_DIVISION 制約が主キーとして PK_Division を持っていることを示します
  • KEY_COLUMN_USAGE は、TEAM_HAS_DIVISION が ORDINAL_POSITION 列で指定された順序で DivID と CompID を持っていることを示します
  • KEY_COLUMN_USAGE は、PK_Division が ORDINAL_POSITION 列で指定された順で DivisionID と CompanyID を持っていることも示しています。

これで、どれがどれを指しているかがわかります。

于 2011-04-14T00:09:13.560 に答える