2017-05-04 27 views
1

我想知道如果它是更好的(主觀我知道)存儲整數值或字符串的值,當字段只有一組可能值。例如。SQL Store varchar或int當我只有一組值時

Person Table 
1. 
Name Age Category 
Joe 25 0 
Jane 28 2 
John 22 1 

2. 
Name Age Category 
Joe 25 Student 
Jane 28 Teacher 
John 22 Staff 

哪種方法是可取的?方法1可能更快且更好地進行查詢,但是,顯示數據時,編程成本更高。方法2可能更慢,更富表現力,編程成本更低。

任何意見將是有益的。

在此先感謝

+0

而且一個研究生不能教? – jarlh

回答

5

此使用對照表,與類別,以及用於鏈接表的整數你會一般都這樣。

的參照表具有多個優點:

  • 可能值的列表可在一個地方。例如,這對於在應用程序中生成列表很方便。
  • 沒有拼寫錯誤。
  • 您可以存儲其他信息,例如短名稱,長描述,敬語等。
  • 如果您需要多語言支持,則可以將所有值存儲在一個地方。
  • 可以在多個表中共享相同的值。

有時候,參考表並不合適。例如,您可能只有兩個值,ONOFF。您可以在大多數數據庫中使用CHECK CONSTRAINT驗證值。這是一個合理的選擇。但我懷疑這個類別的信息不僅僅是一小部分的價值。

+0

感謝您的意見和建議。選項1是首選 – Dudedolf

0

也許你正在尋找一個簡單的響應,但是,我想分享我的方法, 我有一個名爲CustomCaptions的表。 你可以在這裏找到表格的結構。

CREATE TABLE [dbo].[CustomCaptions](
[Capt_ID] [int] IDENTITY(1,1) NOT NULL, 
[Capt_Code] [varchar](50) NULL, 
[Capt_Family] [varchar](50) NULL, 
[Capt_FR] [nvarchar](100) NULL, 
[Capt_EN] [nvarchar](100) NULL, 
[Capt_ES] [nvarchar](100) NULL, 
[Capt_IT] [nvarchar](100) NULL, 
[Capt_TR] [nvarchar](100) NULL, 
[Capt_CS] [nvarchar](100) NULL, 
[Capt_DE] [nvarchar](100) NULL, 
[Capt_Deleted] [bit] NULL, 
[Capt_Order] [smallint] NULL, 
CONSTRAINT [PK_CustomCaptions] PRIMARY KEY CLUSTERED 
(
[Capt_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

Capt_Family列是您的外部列的名稱。

就你的情況而言,在CustomCaptions表中,我保留了代碼和家庭。 對於爲例,

 Capt_Family  Capt_Code  Capt_EN ... Capt_Order 
     Category  0    Student  0 
     Category  1    Teacher  1 
     Category  2    Staff  2 

這樣的,像類別,狀態,類型等所有的小桌......我只用一個表,這降低了我的數據庫表中的總數。 此外,我只有一種方法通過只給出姓氏來填充組合框或列表框。並且也只有一個屏幕來編輯任何列表的內容。

而且正如您在表格結構中看到的那樣,您可以在應用程序中輕鬆管理多種語言。 根據您的需要,您可以使用Capt_EN或另一列作爲其他語言。

最後,如果您願意,您可以創建視圖來降低編程成本。

我希望這會有所幫助。

+0

對於多個實體使用單個查找表通常被認爲是不好的做法。如果你的項目足夠小,你可能會擺脫它,但它最終有可能導致問題。 – Jerrad

+0

嗨jerrad,感謝您的評論。該系統用於擁有超過5百萬用戶的產品中。可能這不是最好的做法,但是這個系統有很多優點。特別是,如果你想降低像Dudedolf這樣的開發成本。 –

+0

您可能會認爲您開始時會降低開發成本,但考慮未來。如果您想爲字幕系列添加額外的字段,該怎麼辦?例如,可能有一個用於生成身份證號碼的前綴(學生身份證號碼以11開頭,22歲的教師和33歲的職員)。您需要添加某種只適用於「Category」Capt_Family類型的Prefix列,並且所有其他列都不會使用。另外,你如何對你的代碼有一個外鍵約束? – Jerrad