3

データベース設計を改善するための支援が必要です。

dbの設計は古い開発者によるものですが、現在は外部キーを配置して孤立したテーブルがないようにすることで、設計を改善しようとしています。

ケース1:

ストーリーは次のとおりです。

アイテムのすべての特定の詳細を保持するために、テーブルProductGroup(PG)、ProductType(PT)、Brand(B)、 (D)があります。Design次に、4つのテーブルすべてが1つのテーブルProductMaster(PM)にアセンブルされ、そこで結合されてが作成されProdCdます。

のいずれかの行PG,PT,B,Gが削除されると、PM内の関連するすべての行も削除されます。

表のサンプルがあります(コードは簡略化されます):

CREATE TABLE [dbo].[ProductMaster](
    [ProdCd] [varchar](25) NOT NULL,
    [GCd] [varchar](15) NULL,
    [ACd] [varchar](15) NULL,
    [BCd] [varchar](15) NULL,
    [CCd] [varchar](15) NULL,
    [ProdType] [varchar](50) NULL,
    [BrandCd] [varchar](25) NULL,
    [Design] [varchar](150) NULL,
 CONSTRAINT [PK_ProductMaster] PRIMARY KEY CLUSTERED 
(
    [ProdCd] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[ProductGroup](
    [GCd] [varchar](15) NOT NULL,
    [GroupDesc] [varchar](150) NULL,
 CONSTRAINT [PK_ProductGroup] PRIMARY KEY CLUSTERED 
(
    [GCd] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[ProductType](
    [GCd] [varchar](1) NOT NULL,
    [ACd] [varchar](15) NOT NULL,
    [ProdType] [varchar](50) NOT NULL,
    [TypeDesc] [varchar](150) NULL,
 CONSTRAINT [PK_ProductType] PRIMARY KEY CLUSTERED 
(
    [GCd] ASC,
    [ACd] ASC,
    [ProdType] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Brand](
    [GCd] [char](1) NOT NULL,
    [BCd] [varchar](15) NOT NULL,
    [BrandCd] [varchar](25) NOT NULL,
    [BrandName] [varchar](75) NULL,
 CONSTRAINT [PK_Brand] PRIMARY KEY CLUSTERED 
(
    [GCd] ASC,
    [BCd] ASC,
    [BrandCd] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Design](
    [GCd] [char](1) NOT NULL,
    [CCd] [varchar](15) NOT NULL,
    [DesignCd] [varchar](25) NOT NULL,
    [DesignDesc] [varchar](150) NULL,
 CONSTRAINT [PK_Design] PRIMARY KEY CLUSTERED 
(
    [GCd] ASC,
    [CCd] ASC,
    [DesignCd] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

サンプルは次のとおりです。

  • ProductMaster100010010001, 1, 0001, 001, 0001, PC-10 A, ZEN, PLAIN WHITE
  • ProductGroup1, Finished Goods
  • ProdType1, 0001, PC-10 A, Dinner Plate 10 Inch
  • Brand1, 001, ZEN, ZEN
  • Design1, 0001, PLAIN WHITE, NO DECAL PLAIN WHITE

Designの行を削除すると、の行(1, 0001, PLAIN WHITE, NO DECAL PLAIN WHITE)全体ProductMasterが削除されます。

ケース2:

ヘッダーと詳細を持つトランザクションのテーブルがあります。詳細は、「GCd」が常に1であるテーブル「ProductType」から「ACd」のみを保持します。PG、PT、B、Gが変更されると、トランザクションのレコードも「GCd」=1で変更されます。

テーブルは次のようになります。

CREATE TABLE [dbo].[PFHdr](
    [FNO] [varchar](25) NOT NULL,
    [FMO] [varchar](6) NULL,
    [FDate] [datetime] NULL,
    [GCd] [int] NULL, *This is group related to the transcation not with the PM
    [IQtyc] [float] NULL,
    [RQtyc] [float] NULL,
    [TQtyc] [float] NULL,
 CONSTRAINT [PK_PFrmHdr] PRIMARY KEY CLUSTERED 
(
    [FNO] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[PFDtl](
    [FNO] [varchar](25) NOT NULL,
    [ACd] [varchar](15) NOT NULL,
    [Input] [float] NULL,
    [Reject] [float] NULL,
    [Transfer] [float] NULL,
 CONSTRAINT [PK_PFrmDtl] PRIMARY KEY CLUSTERED 
(
    [FNO] ASC,
    [ACd] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

サンプルは次のとおりです。

  • PFHdr(201211-00001,00001,2012-11-26,1,10,0,10)
  • PFDtl(201211-00001,0001,5,0,5)
  • PFDtl(201211-00001,0002,5,0,5)

ProdType( )のProductTypeレコード1, 0001, PC-10 A, Dinner Plate 10 Inchが削除されると、PFDtlのレコードも削除されます。ただし、レコードProdType7, 0001, PC-12 A, Dinner Plate 12 Inch)が削除された場合、PFdtlのレコードは変更されませんでした。

私を助けてください、デザインについてコメントしてください、

  1. それをより良くする方法は?
  2. 外部キーの適用方法は可能ですか?
  3. DB設計の提案はありますか?
  4. CASE 2で、外部キーを使用できるようにするには、列「GCd」を追加する必要がありますか?
  5. ProductTypeのProdTypeが一意である必要がある場合、それを主キーとして使用する必要があります(GCdおよびACdを使用)。または、UNIQUEを設定するか、制限を設定しない必要があります。

ノート:

  1. 古いデザインには外部キーがなく、すべてアプリケーションが制限されています
  2. 2番目のケースを追加します
4

1 に答える 1

1

ここには本当に2つの質問があります。外部キーは存在しますか?外部キーが存在する場合、それらは宣言されていますか?スキーマを読んでいると、ProductMaster.GCdなどの外部キーがいくつかあります。それらは宣言されていません。

外部キーを宣言する利点は、外部キーのインスタンスが存在しない主キーを参照する状況である「参照整合性」の喪失を防ぐためにデータを制約することです。これは「孤立した参照」と呼ばれます。一般に、参照整合性を適用することの利点は、挿入時にDBMSに整合性をチェックさせるコストや、拒否されたデータを処理するために必要な追加のプログラミングよりも圧倒的に大きくなります。

既存のデータベースに参照整合性制約を追加する場合は、DBMSで制約を設定する前に、「孤立した参照」を見つけて処理する必要があります。これには通常、「WHERENOTEXISTS」構造の多くの使用が含まれます。

残念ながら、前の開発者は最初に外部キーを宣言していませんでした。

于 2012-11-26T11:55:36.327 に答える