2017-05-10 34 views
0

我們通過API將頭像狀態更新發送到外部服務。在SQL Server和C中代表查找表#

阿凡達:

ID 
Name 
Age 
Nationality 
Status 

有4種狀態,我們可以派:

(A) Alive 
(D) Dead 
(C) Injured 
(U) Unknown 

括號中的人物的狀態如何存儲在外部系統 - 我們必須給他們ID &該格式的狀態。

我們需要將它們存儲在SQL Server中,因此我們需要在頭像表中具有狀態表的主鍵。

我們還需要在C#代碼中表示狀態。狀態不太可能會改變 - 所以一個枚舉或字典會(我認爲)是一種合適的方式來表示狀態,以便在C#代碼中清除它們。

我們可以在狀態表中添加一個int主鍵,然後使用單個字母表示(發送到外部系統)和全名。

或者我們可以將主鍵設置爲char(1)作爲字母 - 並將其存儲在「阿凡達」表的「狀態」列中。

前者可能是枚舉 - 後者是C#中的字典。

這兩種方法是否有任何標準化問題。在面向對象的術語中,兩種方法都存在問題。

這兩種情況下的最佳做法是什麼?

回答

0

你的問題主要是基於意見的;關於什麼是最好的,沒有普遍的答案。

我的建議是基於分離關注點的原則。我在數據庫層以及應用層中儘可能緊湊地將「數據」分成幾部分。 「表示層」是我使用人類可讀格式的地方。這與DateTime值一起工作。 Sql Server將它存儲爲一個8字節的數字,而.Net作爲一個數字使用。只有當我們想看到我們應該使用To...String()系列才能進入演示文稿格式。

現在爲您的特定場景。

ID我通常會推薦一種基於整數的格式,我很可能會使用SQL Server的IDENTITY()來填充該格式。

名稱這裏沒有真正的辯論; .Net中的字符串和Sql Server中的nvarchar。我可能會把這個限制爲少於100個字符。

年齡這裏關於年齡的問題是如果角色會老化。如果角色將實時老化,這不會是一個整數,並且將是DOB的基於DateTime的值,並且應用程序層將根據此計算年齡。

國籍最有可能在應用程序和數據庫圖層中,這最有可能被用作數值。演示文稿可以使用字典或類似的查找來顯示。

狀態正如你所建議的,保持它的數字,直到它顯示;枚舉,字典等可以很好的查找。

我也試着讓db模式匹配類屬性,最上面的類型是(bool,int),最後是最長的字符串。

+0

謝謝所以 - 我的問題的肉 - 將狀態表的主鍵作爲int或char(1)存儲?如果它是一個int,則需要一些額外的查找來將其更改爲發送到外部系統所需的char(1) - 雖然int PK通常更好。 – niico

+0

@niico - 我的建議是TinyInt,與CHAR(1)在SQL中的存儲大小相同,但在PK和索引(羣集與否)上更容易。 –

+0

因此,perf比可讀性更重要?在執行化身和狀態表之間的連接時,這個性能是否相關? – niico