gpt4 book ai didi

sql - 了解标题和详细信息表

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

我已经在各种数据库中看到了这一点,但我将使用最新的示例。在AdventurWorks2012 DB中,有

  • PurchaseOrderHeader
  • PurchaseOrderDetail

  • SalesOrderHeader
  • SalesOrderDetail

我试图理解当您可以将所有信息放在一个表中而不是两个表中时,为什么会有此设置的概念。对不起,我对这种类型的设置缺乏了解。我想确保当我创建新表时,我想知道这种类型的设计,这将如何工作类似于我可能合并以使用 Header 和 Detail 将数据输入捕获到表中以及原因。

例如

  1. 当前日期
  2. 当前月份
  3. 当前财政年度
  4. 公司 ID
  5. 修订号
  6. 服务产品 1 金额
  7. 服务产品 2 金额
  8. 服务产品 3 金额
  9. 服务产品4金额
  10. 服务产品5金额
  11. 总金额(以上 6-10 项的总和)
  12. 认证日期
  13. 认证官
  14. 提交日期

希望我的问题很清楚。

=======================

通过我对@Szymon 的回复编辑了使用 Header/Detail 设置的详细示例

在我上面的示例中,将其布局为 Header/Detail 设置。提交记录时,它会生成一个 ID 所以我的 Header Table 如下所示:

标题表

1, '11/13/13',11,2013,'000001',0,10.00,'11/12/13','总统','查克','11/12/13'

然后在我的详细信息表中,它也会生成一个 ID,但使用以前的记录作为 FK,它看起来像这样...... 1(新 ID),1(以前的 Header Table 的 FK),2(作为服务产品 1)、2(作为服务产品 2)、2(作为服务产品 3)、2(作为服务产品 4)、2(作为服务产品 5)

明细表

1,1,2.00,2.00,2.00,2.00,2.00

================================================ ===

再次修订:提供更好的后续示例。

WKS_Header 表:(PK 为 WKS_Header_ID)

WKS_Header_ID [int] IDENTITY(1,1) NOT NULL,
Company_ID [varchar](6) NOT NULL,
Current_Date [DateTime] NOT NULL,
Current_Month [int] NOT NULL,
Current_Fiscal_Year [int] NOT NULL,
Revision_Number [int] NOT NULL,
Worksheet_ID [varchar] (13) NOT NULL,
Total_Amt [money] NOT NULL,
Certification_Date [DateTime] NOT NULL,
Certification_Officer [varchar] (50) NOT NULL,
Submission_Date [DateTime] NOT NULL

WKS_Header 表的样本记录:

1,'000001','11/5/13',11,2013,0,'0000001111300',20.00,'11/1/13','Chuck','11/2/13'
2,'000001','11/7/13',11,2013,1,'0000001111301',10.00,'11/4/13','Chuck','11/5/13'
3,'000500','11/10/13',11,2013,0,'0005001111300',50.00,'11/5/13','Bob','11/7/13'

WKS_LineItems 表:(PK 为 WKS_LineItems_ID)

WKS_LineItems_ID [int] IDENTITY(1,1) NOT NULL,
LineItem_Description [varchar] (50) NOT NULL,
Create_User_ID [varchar] (50) NOT NULL,
Create_Date [datetime] NOT NULL,
Modify_User_ID [varchar] (50) NOT NULL,
Modify_Date [datetime] NOT NULL

WKS_LineItems 表示例

1,'Service Product Widget A Amount','Admin','10/1/13',Null,Null
2,'Service Product Widget B Amount','Admin','10/1/13',Null,Null
3,'Service Product Widget C Amount','Admin','10/1/13',Null,Null
4,'Service Product Widget D Amount','Admin','10/1/13',Null,Null
5,'Service Product Widget E Amount','Admin','10/1/13',Null,Null
6,'Final Total Widgets Amount','Admin','10/1/13',Null,Null

WKS_Details 表:(PK 是 WKS_Details_ID,FK 是 WKS_Header 表中的 WKS_Header_ID)

WKS_Details_ID IDENTITY(1,1) NOT NULL,
WKS_Header_ID [int] NOT NULL,
WKS_LineItems_ID [int] NOT NULL,
WKS_Amount [decimal] (18,2) NOT NULL,
Create_User_ID [varchar] (50) NOT NULL,
Create_Date [datetime] NOT NULL

WKS_Details 表示例

1,1,1,4.00,'Chuck','11/5/13'
2,1,2,0.00,'Chuck','11/5/13'
3,1,3,0.00,'Chuck','11/5/13'
4,1,4,5.00,'Chuck','11/5/13'
5,1,5,11.00,'Chuck','11/5/13'
6,1,6,20.00,'Chuck','11/5/13'
7,2,1,0.00,'Chuck','11/7/13'
8,2,2,0.00,'Chuck','11/7/13'
9,2,3,0.00,'Chuck','11/7/13'
10,2,4,0.00,'Chuck','11/7/13'
11,2,5,0.00,'Chuck','11/7/13'
12,2,6,10.00,'Chuck','11/7/13'
13,3,1,10.00,'Bob','11/10/13'
14,3,2,10.00,'Bob','11/10/13'
15,3,3,10.00,'Bob','11/10/13'
16,3,4,10.00,'Bob','11/10/13'
17,3,5,10.00,'Bob','11/10/13'
18,3,6,50.00,'Bob','11/10/13'

场景:从表单输入信息。它在 WKS_Header 表中创建 3 条记录,并将相关的详细记录记录到 WKS_Details 表中。

记录 ID 1 是原始提交,然后该用户需要修改数字。该用户输入另一条记录。那就是记录 ID 2,一个修改后的提交以取代记录 ID 1。记录 ID 3 是原始提交。

我是否正确标准化了这个?

最佳答案

这种类型的关系称为一对多关系。当有一个父记录和多个子记录时使用它。你使用这种关系到 normalise data .

如果是采购订单,您有一个描述订单的标题,例如订单号和日期。一个订单只有一组此类信息。

然后是多个订单项,每个订单项都有自己的项目名称、数量和价格。每张 table 都有很多项目。

如果您只创建一个表,则必须为每个项目重复发票抬头中的信息。您将在与商品一样多的行中重复相同的订单日期和编号。

这很糟糕有几个原因,其中包括:

  • 您的冗余数据占用了不必要的空间并且难以维护(例如,如果您想更新标题中的一个信息,则必须更新多条记录)。
  • 查询表更复杂,例如当您想要显示订单标题列表时,您必须使用 DISTINCT
  • 该结构不标准(未标准化),对于期望采用标准数据库设计方法的其他人来说难以阅读。

关于sql - 了解标题和详细信息表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19963735/

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