gpt4 book ai didi

SQL Server 数据库设计与外键混淆

转载 作者:行者123 更新时间:2023-12-04 20:17:17 25 4
gpt4 key购买 nike

我需要帮助来改进我的数据库设计。

数据库设计来自旧开发人员,现在我试图通过尝试放置外键来使设计更好,这样就不会有任何孤立表。

案例 1:

故事是这样的:

我有表 ProductGroup (PG), ProductType (PT), Brand (B), Design (D) 保留元素的所有具体细节。然后将所有四个表组装成一个表 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,成品)
  • ProdType(1、0001、PC-10 A、餐盘 10 英寸)
  • 品牌(1, 001, ZEN, ZEN)
  • 设计(1、0001,纯白色,无贴花纯白色)

如果我删除 (1, 0001, PLAIN WHITE, NO DECAL PLAIN WHITE)Design 行,ProductMaster 中的整行将被删除。

案例 2:

我有一个包含标题和详细信息的交易表。细节只保留表“ProductType”中的“ACd”,其中“GCd”始终为1。当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 上的记录没有改变。

请帮助我,对设计发表评论,

  1. 如何让它变得更好?
  2. 如何应用外键?
  3. 对数据库设计有什么建议吗?
  4. 在案例 2 中,我应该添加列“GCd”以便能够使用外键吗?
  5. 如果 ProductType 上的 ProdType 必须是唯一的,我应该将它用作主键(带 GCd 和 ACd)或者我只需要输入 UNIQUE 或不施加任何限制

注意:

  1. 旧设计没有任何外键,都是应用限制
  2. 我添加第二种情况

最佳答案

这里确实有两个问题。是否存在外键?如果存在外键,是否声明了它们?当我阅读您的架构时,其中有一些外键,例如 ProductMaster.GCd。他们只是没有被宣布。

声明外键的优点是它约束数据以防止丢失“引用完整性”,即外键实例引用不存在的主键的情况。这称为“孤立引用”。一般来说,强制参照完整性的优势远远大于让 DBMS 在插入时检查完整性的成本,以及处理拒绝数据所需的额外编程。

如果您想向现有数据库添加参照完整性约束,您可能必须在 DBMS 让您放入约束之前找到并处理“孤立的引用”。这通常会大量使用“WHERE NOT EXISTS”结构。

太糟糕了,以前的开发人员没有在一开始就声明外键。

关于SQL Server 数据库设计与外键混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13561622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com