2012-02-08 72 views
4

我正在尋找在我的SQL Server中存儲幾個dropdownlist的內容。將它們存儲在每個下拉列表中的一個表中還是更好?如何在SQL中存儲DropDownList信息

我的大表將有模式,如:

CREATE TABLE [dbo].[OptionTable](
    [OptionID] [int] IDENTITY(1,1) NOT NULL, 
    [ListName] [varchar](100) NOT NULL, 
    [DisplayValue] [varchar](100) NOT NULL, 
    [Value] [varchar](100) NULL, 
    [OptionOrder] [tinyint] NULL, 
    [AssociatedDept] [int] NULL, 
    [Other2] [nchar](10) NULL, 
    [Other3] [nchar](10) NULL 
) ON [PRIMARY] 

而且我會做類似的東西拿到1名列表的內容:

Select [columns] 
From OptionTable 
WHERE ListName = 'nameOfList' 

所以,我該怎麼決定?我知道它會這樣工作,我只是不確定這是不是好的做法?單向性能會更好嗎?可讀性呢?意見讚賞。

+2

這種方法的最大缺點是它使得從其他表中有意義的外鍵很難到達你的'OptionTable'。 – 2012-02-08 21:36:34

+0

@EricPetroelje - 是的,我已經看到了這一點。在查詢中,我必須將表連接到自身以獲取實際值(而不是鍵)。 – MAW74656 2012-02-08 21:48:09

+0

http://stackoverflow.com/q/8839026/456532是一個回答較少的類似問題。 – MAW74656 2012-02-08 22:07:57

回答

4

我工作過的數據庫有一個包含多個下拉列表值的單一「超級選項表」......它可以用於下拉列表填充,但是當我需要將這些值用於其他報告的目的,它成爲一個痛苦,因爲「超級選項表」需要根據我需要的特定選項集進行過濾,最終會出現一些看起來很難看的查詢。

此外,在路上還有一些條件需要使用其中一個列表追蹤附加值......但是該列需要添加到整個表格中,然後將所有其他選項集合添加到列表中該表只會有一個NULL列,他們不關心...

因此,我建議如果你處理完全不同的數據列表,這些列表存儲在單獨的表格。

+0

- 我覺得我可以容納DisplayValue,Value和Order的大部分選項列表。當然,我正在開發這個應用程序,以及我製作的前三個列表,我已經需要一個新的列(associatedDepartment)。 – MAW74656 2012-02-08 21:45:07

+0

@ MAW74656正是......然後想象一下十年和數十個額外的列表需要添加。它起初可能看起來很乾淨,但稍後它會變得混亂。 – 2012-02-08 21:51:02

+0

-I在存儲過程中有我的查詢,所以我只是從客戶端代碼運行類似於'Exec getOptionList'listName''的東西來獲取適當的列表。這樣的代碼總是一樣的。我很喜歡那部分。 – MAW74656 2012-02-08 21:57:21

2

簡單快捷:

CREATE TABLE [dbo].[Lists](
    [ListId] [int] IDENTITY(1,1) NOT NULL, 
    [ListName] [varchar](100) NOT NULL, 
    --these could be associated with lists or options, wasn't specified 
    [AssociatedDept] [int] NULL, 
    [Other2] [nchar](10) NULL, 
    [Other3] [nchar](10) NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Options](
    [OptionId] [int] IDENTITY(1,1) NOT NULL, 
    [ListId] [int] NOT NULL, 
    [DisplayValue] [varchar](100) NOT NULL, 
    [Value] [varchar](100) NULL, 
    [OptionOrder] [tinyint] NULL, 
    --these could be associated with lists or options, wasn't specified 
    [AssociatedDept] [int] NULL, 
    [Other2] [nchar](10) NULL, 
    [Other3] [nchar](10) NULL 
) ON [PRIMARY] 

select Options.* --or a subset 
from Options as o 
join Lists as l 
    on l.ListId=o.ListId and l.ListName = 'nameOfList' 
order by o.OptionOrder 

獲取內容(可能:取決於數據)更優化(尤其是如果一個選項出現在多個列表)

CREATE TABLE [dbo].[Lists](
    [ListId] [int] IDENTITY(1,1) NOT NULL, 
    [ListName] [varchar](100) NOT NULL, 
    --these could be associated with lists or options, wasn't specified 
    [AssociatedDept] [int] NULL, 
    [Other2] [nchar](10) NULL, 
    [Other3] [nchar](10) NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Options](
    [OptionId] [int] IDENTITY(1,1) NOT NULL, 
    [DisplayValue] [varchar](100) NOT NULL, 
    [Value] [varchar](100) NULL, 
    --these could be associated with lists or options, wasn't specified 
    [AssociatedDept] [int] NULL, 
    [Other2] [nchar](10) NULL, 
    [Other3] [nchar](10) NULL 
) ON [PRIMARY] 
CREATE TABLE [dbo].[ListOptions](
    [OptionId] [int] NOT NULL, 
    [ListId] [int] NOT NULL, 
    [OptionOrder] [tinyint] NULL, 
    --these could be associated with lists or options, wasn't specified 
    [AssociatedDept] [int] NULL, 
    [Other2] [nchar](10) NULL, 
    [Other3] [nchar](10) NULL 
) 

獲取內容

select Options.* --or a subset 
from Options as o 
join ListOptions as lo 
    on lo.OptionId=o.OptionId 
join Lists as l 
    on l.ListId=lo.ListId and l.ListName = 'nameOfList' 
order by lo.OptionOrder 

無論如何,你都想索引外鍵列。

+0

- 我不確定你在這裏得到什麼......你想在這裏展示什麼? – MAW74656 2012-02-08 21:46:52

+0

-和associateDeDept,Other2,Other3,全部屬於單個選項,而不屬於列表。 – MAW74656 2012-02-08 21:48:58

+0

我暗示(當我可能應該建議)時,您將數據分解爲列表和選項表。第二個建議是對這些數據進行進一步標準化,如果您有各種列表中出現的選項可能會很有用。也就是說,邁克爾弗雷德裏克森的答案是更好的。 – devstruck 2012-02-08 21:58:08