web-dev-qa-db-ja.com

一意のキーに2番目のテーブルを使用していますか?

これはかなり初心者向けの質問です。私は80年代と90年代の奇妙な設計上の決定をした古い学校のPowerBuilderソフトウェア(PowerCampus)を使用しています。

システムでおそらく最も重要なテーブルは何ですかdbo.ACADEMICには、複数の列で構成されるクラスター化された主キーのみがあります。 SELECTおよびUPDATE行をdbo.ACADEMIC GUIDなどの不変のキーを使用しますが、テーブルを変更することもできません。

このテーブルの構造を変更できない理由はたくさんありますが、その主な理由は、ある学校がそれを試してデスクトップクライアントソフトウェアを壊したことです。

ACADEMICの主キーの簡単なサンプルを次に示します。

PEOPLE_CODE_ID ACADEMIC_YEAR ACADEMIC_TERM CURRICULUM
-------------- ------------- ------------- ----------
P000011111     1996          SPRING        URBAN
P000022222     2012          SPRING        HCSMGT
P000033333     2002          SUMMER        CHEMIS
P000044444     2015          FALL          SEDUCA
P000055555     1983          SUMMER        POLSCI

キーの一部である一部の列は、学生がカリキュラムを変更した場合など、大幅に変更されます。この不変のIDがないため、他のシステムとの統合は非常に困難です。

これは、一意の主キーとACADEMICからの識別列を含む別のテーブルを作成することで解決できますか?次に、ACADEMICからのすべてのデータとid列を表示するビューを作成できます。統合プロジェクトはこのビューを使用できます。

提案されたcustom.AcademicKey テーブル:

id                                   PEOPLE_CODE_ID ACADEMIC_YEAR ACADEMIC_TERM CURRICULUM
------------------------------------ -------------- ------------- ------------- ----------
956EB195-C7C3-4E47-9A1B-0000191B95A2 P000011111     1996          SPRING        URBAN
FE00D2F4-5F5E-45D2-AB63-00002CC92F40 P000022222     2012          SPRING        HCSMGT
C1AF44CD-DDD1-4D46-A19E-0000A841B70F P000033333     2002          SUMMER        CHEMIS
D4E8FC3F-CECC-4195-9924-0000B9BC33A7 P000044444     2015          FALL          SEDUCA
456B16ED-C504-456B-A2E5-00019F244A95 P000055555     1983          SUMMER        POLSCI

ACADEMICのクラスター化キーに関連付けられた外部キーはこれを実現しますか?

新しい行をACADEMICに入力するには、トリガーをAcademicKeyに追加する必要がありますか?

3
bendodge

これは、一意の主キーとACADEMICの識別列を含む別のテーブルを作成することで解決できますか?

はい。最低限、外部キーとAFTER INSERTトリガーが必要です。

例えば

use tempdb
go
--create schema custom
go

--drop table if exists custom.AcademicKey
--drop table if exists dbo.Academic
go
create table dbo.Academic
(
   PEOPLE_CODE_ID varchar(20), 
   ACADEMIC_YEAR int, 
   ACADEMIC_TERM varchar(10),
   CURRICULUM varchar(20),
   constraint pk_Academic
     primary key (PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
)
create table custom.AcademicKey
(
   Id uniqueidentifier default (newsequentialid()),
   PEOPLE_CODE_ID varchar(20), 
   ACADEMIC_YEAR int, 
   ACADEMIC_TERM varchar(10),
   CURRICULUM varchar(20),
   constraint pk_Academic
     primary key nonclustered (id),
   constraint ak_AcademicKey
     unique clustered (PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM),
   constraint fk_AcademicKey_Adademic
     foreign key (PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
     references Academic (PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
     on update cascade
     on delete cascade
)

go

create or alter trigger Academic_CreateAcademicKey 
  on dbo.Academic after insert
as
begin
    set nocount on;

    insert into custom.AcademicKey(PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
    select PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM
    from inserted;
end

go 

insert into Academic(PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
values ('P000011111',     1996,          'SPRING',      ' URBAN')

select * from custom.AcademicKey

update Academic set CURRICULUM = 'CHEMIS' where PEOPLE_CODE_ID = 'P000011111'

select * from custom.AcademicKey

delete from Academic where PEOPLE_CODE_ID = 'P000011111'

select * from custom.AcademicKey