2012-02-08 74 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