【问题标题】:Database Design: Table structure数据库设计:表结构
【发布时间】:2016-05-09 22:52:44
【问题描述】:

我有一个 excel 表单,其中包含可以从 SQL Server 提取数据并在 excel 表单上显示信息的宏。用户可以更新窗体和宏,将更改后的内容写回 SQL Server。

这是excel表格。用户需要输入以黄色突出显示的值。示例 John 输入用户字段为“JOHN”,然后输入地区“LATAM”、年份“2016”和月份“3”。完成后,John 将单击“检索”按钮从 SQL Server 中提取所有数据,其中 Region = LATAM、Year=2016 和 Month = 3。所有相关信息将显示在字段 Area、Region、Mgmt、CompanyCode、AcctUnit、帐户和价值(它可能有多行记录,并且不允许用户编辑这些记录)。现在 John 需要为字段 Comments 输入值。完成后,John 将单击“保存”按钮,excel 宏会将 cmets 值写入 SQL Server

这里是excel宏会读写的表结构

CREATE TABLE [dbo].[Sales](
[Region] [varchar](10) NOT NULL,
[Area] [varchar](10) NOT NULL,
[Mgmt] [varchar](10) NOT NULL,
[CompanyCode] [int] NOT NULL,
[AcctUnit] [varchar](7) NOT NULL,
[Account] [varchar](10) NOT NULL,
[Comment] [varchar](100) NULL,
[Year] [int] NULL,
[Jan] [float] NULL,
[Feb] [float] NULL,
[Mar] [float] NULL,
[Apr] [float] NULL,
[May] [float] NULL,
[Jun] [float] NULL,
[Jul] [float] NULL,
[Aug] [float] NULL,
[Sep] [float] NULL,
[Oct] [float] NULL,
[Nov] [float] NULL,
[Dec] [float] NULL,
[SYS_CreatedBy] [varchar](15) DEFAULT SYSTEM_USER,
[SYS_CreatedDate] [datetime] DEFAULT GETDATE(),
[SYS_ModifiedBy] [varchar](15) DEFAULT SYSTEM_USER,
[SYS_ModifiedDate] [datetime] DEFAULT GETDATE(),
CONSTRAINT [PK_Sales] PRIMARY KEY NONCLUSTERED
    (
    Region ASC, 
    Area ASC, 
    Mgmt ASC,
    CompanyCode ASC,
    AcctUnit ASC,
    Account ASC,
    )
)

基于上面的表结构,其他用户如何在不影响 John 已经更新到 SQL Server 的那些 cmets 的情况下放置他/她的 cmets?例如,John 已经输入了他的 cmets 并已更新到 SQL Server,现在 Alice 从 SQL Server 中提取相同的数据,其中 region = LATAM,Year = 2016 和 Month = 3。她应该得到与 John 相同的数据,除了 cmets 字段,其中这个案例应该是空白的,而不是约翰的评论。

根据上表的设计,评论的价值会随着不同的用户而不断变化。如何重新设计表格结构,使每个用户的评论都是独一无二的?

【问题讨论】:

  • 评论栏不应出现在此表中。它应该在 SalesComments 表中。此外,您真的不应该每个月都有列。您应该有一个 SaleDate 列和一个 Amount 列。整张表急需或正常化。例如,区域不应在此表中。您应该拥有客户,并且将为客户分配一个区域。与许多其他列相同。另外,小心使用浮点数来保存销售信息。它是一种近似数据类型,不能准确地保存每个值。
  • 您应该在 Sales 中添加一个唯一的 ID 列(可能是 SalesID。然后将 Comments 分解到自己的表中,并将外键返回到 SalesID。这样您就可以拥有多个 cmets 并保持在不复制所有其余数据的情况下跟踪谁制作了它们以及何时制作它们。这个删除过程称为“数据库规范化”。有关更多信息,请参阅stackoverflow.com/questions/723998/… 上的答案和 cmets。
  • 一个关系数据库是由一个称为database normalization的进程创建的。
  • 感谢所有建议

标签: sql-server database database-design


【解决方案1】:

我会创建一个Comments 表,并通过外键将它与Sales 表关联起来。

为此,我将在Sales 表中添加一个代理键,这样您就不需要将所有这些PK 列添加到您的Comments 表中。

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2021-08-10
    • 2012-10-20
    • 2015-06-17
    • 1970-01-01
    • 2016-09-10
    • 2021-04-05
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多