你應該問自己的第一件事是「'設備'的屬性是什麼?」沒有EquipID,描述或類別的設備是否可以存在?如果不是,那麼這些列不應該被允許爲空。
其次是「什麼唯一定義了一件'設備'?」它是EquipID嗎?那麼這應該是你的主鍵。它是EquipID和Category的組合嗎?然後你有一個由兩個列組成的複合主鍵。然而,有時候,數據本身並不適用於一個可以在完全關係模型中輕鬆加入的主鍵。因此,您可以考慮顯示的Identity ID列 - 這被稱爲代理鍵。要知道,默認情況下創建主鍵會在這些鍵列上創建聚簇索引。如果你使用代理鍵方法,恕我直言,那麼在你的對象的唯一性(即EquipID)上創建另一個唯一索引是個好主意。
就其他指標而言,你應該進一步問自己:「我會經常查詢哪些專欄?」也許你會有很多問題,比如「SELECT EquipID FROM Equipment WHERE Category = 3」。這表明類別是索引的一個很好的候選列。
最後,另一個很好的經驗法則是索引任何外鍵列 - 它看起來類別可能是。這會優化您可能執行的任何連接查詢。
一個好方法,這將是類似下面(快扔在一起,未測試):
CREATE TABLE [dbo].[Equipment](
[EquipID] [nchar](20) NOT NULL
,[EquipDescription] [nchar](100) NOT NULL
,[CategoryID] [bigint] NOT NULL
,CONSTRAINT [PK_Equipment] PRIMARY KEY CLUSTERED (
[EquipID] ASC
)
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Categories](
[CategoryID] [bigint] IDENTITY(1,1) NOT NULL
,[CategoryName] [nchar](100) NOT NULL
,CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED (
[CategoryID] ASC
)
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IDX_Equipment_Category] ON [dbo].[Equipment] (
[CategoryID] ASC
) ON [PRIMARY]
CREATE UNIQUE NONCLUSTERED INDEX [IDX_Categories_CategoryName] ON [dbo].[Categories] (
[CategoryName] ASC
) ON [PRIMARY]
ALTER TABLE [dbo].[Equipment] WITH CHECK ADD CONSTRAINT [FK_Equipment_Categories]
FOREIGN KEY([CategoryID]) REFERENCES [dbo].[Categories] ([CategoryID])
GO