2

我正在开发一个通用应用程序,该应用程序使用一组预先选择的数据库表(及其关系)来生成用于管理这些表中的数据的用户界面。基本上,我只是从信息模式中查找内容,获取所有主键和外键,并基于此生成输入字段和指向其他对话框的链接。因为它应该是一个通用的解决方案,所以它应该适用于彼此之间确实具有有意义关系的任何表集。

我遇到的一件事是外键,特别是 - 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 引用的是 CompanyID,而不是 DIVISION 表中的 DivisionID?

我无法从 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

This is how you know which one refers to which.

于 2011-04-14T00:09:13.560 回答