データベース設計を改善するための支援が必要です。
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]
サンプルは次のとおりです。
ProductMaster
(100010010001, 1, 0001, 001, 0001, PC-10 A, ZEN, PLAIN WHITE
)ProductGroup
(1, Finished Goods
)ProdType
(1, 0001, PC-10 A, Dinner Plate 10 Inch
)Brand
(1, 001, ZEN, ZEN
)Design
(1, 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のレコードも削除されます。ただし、レコードProdType
(7, 0001, PC-12 A, Dinner Plate 12 Inch
)が削除された場合、PFdtlのレコードは変更されませんでした。
私を助けてください、デザインについてコメントしてください、
- それをより良くする方法は?
- 外部キーの適用方法は可能ですか?
- DB設計の提案はありますか?
- CASE 2で、外部キーを使用できるようにするには、列「GCd」を追加する必要がありますか?
- ProductTypeのProdTypeが一意である必要がある場合、それを主キーとして使用する必要があります(GCdおよびACdを使用)。または、UNIQUEを設定するか、制限を設定しない必要があります。
ノート:
- 古いデザインには外部キーがなく、すべてアプリケーションが制限されています
- 2番目のケースを追加します