Информационная схема SQL - чтение составных внешних ключей - PullRequest
2 голосов
/ 14 апреля 2011

Я работаю над универсальным приложением, которое использует набор предварительно выбранных таблиц базы данных (и их взаимосвязей) для создания пользовательского интерфейса для управления данными в этих таблицах.По сути, я просто ищу вещи из информационной схемы, получаю все первичные и внешние ключи и генерирую поля ввода и ссылки на другие диалоги на основе этого.Поскольку это должно быть универсальное решение, оно должно работать с любым набором таблиц, которые имеют значимые отношения друг с другом.

Одна из вещей, с которыми я столкнулся, это внешние ключи, в частности - СОСТАВИТЬ внешние ключи с одним ограничением.Например, если у меня есть следующие таблицы:

Компания

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. 

Team

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 - это имя каждого столбца, который относится к идентификатору компании - будь то в таблице COMPANY или в таблице TEAM и т. Д.), Но нет правила, чтоговорит, что имя столбцов должно быть одинаковым, поэтому я не знаю, как заставить программу узнать, какой столбец какой.

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

Есть ли у компьютера способ узнать этот CompID?в таблице КОМАНДА ссылается на CompanyID, а не на DivisionID в таблице DIVISION?

Я не смог найти никакого способа сделать это из данных в представлениях INFORMATION_SCHEMA.

Да, человек может легко понять, что CompID = CompanyID и т. Д. ... но, как я упоминал ранее - я пытаюсь найти общее решение, которое бы не требовало, чтобы человек на это смотрел ипринимать решения и ошибки: =)

1 Ответ

2 голосов
/ 14 апреля 2011

Вы должны сопоставить их по порядку столбцов.

  • REFERENTIAL_CONSTRAINTS сообщает вам, что ограничение TEAM_HAS_DIVISION имеет PK_Division в качестве вашего первичного ключа
  • KEY_COLUMN_USAGE сообщает, что TEAM_HAS_DIVISION имеет DivID и CompID в этом порядке, заданном в столбце ORITINAL * ORION * * * *, в TEAM_HAS_DIVISION * 100 * * 100 * * * *KEY_COLUMN_USAGE также сообщает вам, что PK_Division имеет DivisionID и CompanyID в этом порядке, указанном в столбце ORDINAL_POSITION

Таким образом вы узнаете, какой из них относится к какому.

...