2016-05-09 11 views
0

私はSQL Serverからデータを引き出し、Excelフォームに情報を表示できるマクロを含むExcelフォームを作成しました。ユーザーはフォームを更新でき、マクロはSQL Serverに書き戻されます。データベース設計:テーブル構造

これはExcel形式です。ユーザーは黄色で強調表示された値を入力する必要があります。例Johnは、 'LOHAM'、年 '2016'、月 '3'の順に 'JOHN'というユーザーフィールドを入力します。一度それが完了したら、Johnは、[検索]ボタンをクリックして、Region = LATAM、Year = 2016、およびMonth = 3のSQL Serverからすべてのデータをプルします。関連するすべての情報は、Area、Region、Mgmt、CompanyCode、AcctUnit、アカウントと値(レコードの複数の行を持ち、ユーザーはこれらのレコードを編集できません)。今、Johnはフィールドコメントに値を入力する必要があります。彼は、ジョンが「保存」ボタンをクリックして、マクロをエクセルでしょう。ここSQL Serverに enter image description here

をコメント値を記述します完了したら、マクロをエクセルの表の構造は、上記の表構造に基づいて

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)。ジョンのコメントではなく、このケースは空白にする必要があります。

上記の表の設計に基づいて、コメントの値はさまざまなユーザーによって変更され続けます。どのように表の構造を再設計してコメントを各ユーザに固有にすることができますか?

+2

コメント列はこの表にはいけません。それはSalesCommentsテーブルにある必要があります。また、毎月の列を持つべきではありません。 SaleDate列とAmount列が必要です。この全体のテーブルは、深刻な必要性または正規化にあります。たとえば、このテーブルには地域を指定しないでください。あなたは顧客を持っていて、顧客には地域が割り当てられます。他の多くの列と同じこと。また、フロートを使用して販売情報を保持するように注意してください。これは、すべての値を正確に保持できないおおよそのデータ型です。 –

+0

一意であるSalesIDにID列を追加する必要があります(SalesIDかもしれないし、SalesIDに戻って外部キーを使用して独自のテーブルにコメントを分解する)。残りのすべてのデータを複製することなく、「データベースの正規化」と呼ばれるこの削除プロセスを実行します(http://stackoverflow.com/questions/723998/what-are-1nf-2nf-and-3nf-inの回答とコメントを参照)。 – nscheaffer

+1

リレーショナルデータベースは、[データベースの正規化](https://en.wikipedia.org/wiki/Database_normalization)というプロセスで作成されます。 –

答えて

0

Commentsテーブルを作成し、それを外部キーを介してSalesテーブルに関連付けます。

この目的のために、Salesテーブルに代理キーを追加して、すべてのPKカラムをCommentsテーブルに追加する必要はありません。