我的excel表單包含了可以從SQL Server中提取數據並在excel表單上顯示信息的宏。用戶可以更新表單並將宏寫入更改回SQL Server。數據庫設計:表結構
這是excel表格。用戶需要輸入黃色突出顯示的值。示例John將用戶字段輸入爲'JOHN',然後按地區'LATAM',年份'2016'和月份'3'輸入。一旦完成,John會點擊一個'Retrieve'按鈕,從Region = LATAM,Year = 2016和Month = 3的SQL Server中提取所有數據。所有相關信息都將顯示在Area,Region,Mgmt,CompanyCode,AcctUnit,帳戶和值(可能有多行記錄,用戶不允許編輯這些記錄)。現在約翰需要爲字段評論輸入值。一旦他完成,約翰會點擊「保存」按鈕,Excel宏將註釋值寫入到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的評論的同時發表他/她的評論?例如,John已經輸入了他的註釋,並且已經更新到SQL Server,現在Alice從SQL Server中提取相同的數據,其中region = LATAM,Year = 2016和Month = 3。她應該獲得與John相同的數據,除了註釋字段這個案例應該是空白的,而不是John的評論。
根據上表設計,評論的價值會隨着不同的用戶而不斷變化。如何重新設計表格結構,以便每位用戶評論可以獨一無二?
評論欄不應該在此表中。它應該位於SalesComments表中。此外,你真的不應該有每個月的專欄。您應該有一個SaleDate列和一個金額列。這整個桌子是嚴重需要或正常化。例如,地區不應該在此表中。你應該讓顧客和顧客分配一個區域。與其他許多列相同的東西。另外,請小心使用float來保存銷售信息。這是一個近似的數據類型,不能準確地保存每個值。 –
您應該爲唯一的Sales(可能是SalesID)添加一個ID列,然後用外鍵將註釋分解到其自己的表中,並將外鍵返回到SalesID。這樣,您可以有多個註釋並記錄誰製造它們以及何時而不會複製所有其他數據。這個過程稱爲「數據庫規範化」。請參閱http://stackoverflow.com/questions/723998/what-are-1nf-2nf-and-3nf-in上的答案和評論-database-design有關更多信息 – nscheaffer
關係數據庫通過稱爲[數據庫規範化](https://en.wikipedia.org/wiki/Database_normalization)的過程創建。 –