2008-12-08 60 views
0

基於對this question about dynamically accessing tables的回答,我決定退回幾步,並在更大的圖片上獲得一些建議。SQL Server模板驅動的數據輸入問題

我正在重溫使用ASP.NET重寫Web的Windows窗體應用程序的數據庫設計。另外,我將數據庫移植到了Sql Server中,因此它可以處理更多流量,因爲Access數據庫已經負擔過重。因此,看到SQL Server可以做什麼,我一直在重新審視我的數據庫設計決策,以及它們對我的用戶界面設計的影響。

目前,Windows界面顯示近期代碼列表:

02691 AFF1 
32391 Lot# 23 

等。

對於每個代碼中有一個製作表中的記錄是始於:

ProductionCode varchar(80), 
Template  varchar(50), 
... 

模板表示一個數表中的一個,也是一個外鍵模板字段定義。所有這些信息都用於從代碼開始動態構建DataGrid。

有ScoreField表,它表示所有模板中的所有字段,除了ProductionCode(它們都是外鍵)。

ScoreField 

Template  varchar(50) 
Field   varchar(50) 
Formatting  varchar(50) // This is a .NET style formatting string, say 0.00 or ## 
... 

然後有模板表本身,它們包含一個ProductionCode,每個測試的時間以及測試收集的任何數據。

所以創建我的DataGrid,在飛行中,我通過

SELECT * FROM ProductionRun WHERE ProductionCode = @Code 

在現實中開始,我只是得到了一個結果,或者如果沒有獲得結果中止進程。

如果代碼是由用戶選擇的代碼串(使用下拉,不是vunerable注射)

然後我做的:

SELECT * FROM ScoreField WHERE Template = @Template 

哪裏@Template其實,模板ProductionRun的一條記錄的字段值返回。

然後我做的:

SELECT * FROM @Template WHERE ProductionCode = @Code 

但實際上,我剛拼接模板的名字,我在第一部分得到。

然後我使用ScoreField的結果爲每個匹配結果添加列並設置格式化et all。

但是,當然,由於在運行時全部這樣做,我不會使用數據綁定,而必須以編程方式填寫所有數據。

因此,隨着這個數據庫重新審視,我正在尋找另一種更好的方法。我在不同的表格中獲得了數據,並且我想將格式應用於數據,並且能夠在一個界面中完成所有操作,而不是強迫用戶猜測其數據所在的模板。我希望能夠添加模板而不會讓系統過於緊張。很顯然,這不是一個簡單的編程問題,而是更多的最佳實踐問題,但我一直在尋找一些靈感和/或示例,讓我開始走上不同的道路。

回答

1

用戶試圖實際看到的數據是什麼。你最好的選擇是,首先根據它所持有的數據來設計你的數據庫,而不是根據你最終將它顯示到某個前端的方式。

如果您以不同的格式獲取不同的數據,那麼嘗試將它全部強制爲單一類型的結果可能是一個壞主意,因此您可以使用數據綁定。

+0

它的所有質量控制測量,如Ph和Brix等。所以一種產品可能有Ph,Brix,CoolingTemp,Pits等,另一種產品會有不同的測量結果,儘管有些可能相同。 – 2008-12-08 19:39:19

1

鑑於上面的評論,我可能會模擬它像下面的東西。

CREATE TABLE dbo.Products (
    product_code VARCHAR(10) NOT NULL, 
    product_name VARCHAR(50) NOT NULL, 
    CONSTRAINT PK_Products PRIMARY KEY CLUSTERED (product_code) 
    ) 
GO 
CREATE TABLE dbo.Measurement_Types (
    measurement_type_code   VARCHAR(10)  NOT NULL, 
    measurement_type_description VARCHAR(255) NOT NULL, 
    format       VARCHAR(20)  NOT NULL, 
    CONSTRAINT PK_Measurement_Types PRIMARY KEY CLUSTERED (measurement_type_code) 
    ) 
GO 
CREATE TABLE dbo.Measurements (
    product_code   VARCHAR(10)  NOT NULL, 
    measurement_type_code VARCHAR(10)  NOT NULL, 
    measurement_value  DECIMAL(10, 4) NOT NULL, 
    CONSTRAINT PK_Measurements PRIMARY KEY CLUSTERED (product_code, measurement_type_code), 
    CONSTRAINT FK_Measurements_Products FOREIGN KEY (product_code) REFERENCES dbo.Products (product_code), 
    CONSTRAINT FK_Measurements_Measurement_Types FOREIGN KEY (measurement_type_code) REFERENCES dbo.Measurement_Types (measurement_type_code) 
    ) 
GO 

如果測量值是歷史數據,則添加一個DATETIME列。此外,不知道具體的數據類型顯然可能會改變。

由於每種產品類型都可以有不同數量的測量,因此您可能最終會根據需要最終生成數據網格,並根據需要添加列。我知道你說過你想避免這種情況,但是爲了製作一個通用應用程序需要支付一定的代價(我知道你的應用程序不是完全通用的,但是你嘗試製作應用程序時更開放或「自由」) ,優化越困難,越需要做出更多妥協)。

一種可能性也是創建一個數據網格,其中包含您希望支持的最大列數,然後使用存儲過程或視圖來返回該列數,而不管實際測量是否可用於一種產品類型。然後,您仍然可以綁定到該SP或視圖,並簡單地隱藏在運行時未使用的列。

+0

有趣的想法。我得看看那個。關於當前系統的一件事是一些模板表非常大。我們的一個更大的生產類型有一個超過20個字段的表格,這個字段有點大,所以這可能是一個改進。 – 2008-12-08 22:30:03