2012-02-08 3 views
4

SQL Server에 여러 개의 드롭 다운 목록의 내용을 저장하려고합니다. 드롭 다운마다 하나의 테이블에 저장하거나 더 큰 테이블에 저장하는 것이 더 좋습니까?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'에 넣기가 어렵다는 것입니다. –

+0

@EricPetroelje - 예, 이미 실제로 본적이 있습니다. 쿼리에서는 키 대신 실제 값을 얻기 위해 테이블 ​​자체를 조인해야합니다. – MAW74656

+0

http://stackoverflow.com/q/8839026/456532는 답변이 적은 비슷한 질문입니다. – MAW74656

답변

4

여러 개의 드롭 다운 목록에 대한 값을 포함하는 단일 "슈퍼 옵션 테이블"이있는 데이터베이스에서 작업했습니다 ... 드롭 다운 목록 채우기에는 문제가 없었지만 다른 값으로 사용해야 할 때 "슈퍼 옵션 테이블"은 필자가 필요로하는 특정 옵션 집합을 기준으로 필터링해야하기 때문에보고가 어려워졌습니다.

또한 도로 아래에는 목록 중 하나를 사용하여 추가 값을 추적해야하는 조건이 있지만 그 열을 전체 테이블에 추가해야하고 그 다음에 다른 모든 옵션 집합 그 테이블은 단순히 신경 쓰지 않는 컬럼에 대해 NULL을 가질 것입니다 ...

그 때문에, 완전히 다른 데이터 목록을 다루고 있다면 그 목록을 저장해야합니다. 별도의 테이블.

+0

- 대부분의 옵션 목록을 DisplayValue, Value 및 Order로 수용 할 수있는 것 같습니다. 물론,이 응용 프로그램을 개발하고 있으며 처음 세 개의 목록 중에서 이미 새 열 (associatedDepartment)이 필요했습니다. – MAW74656

+0

@ MAW74656 정확히 ... 그 다음 10 년과 수십 개의 추가 목록을 추가해야한다고 상상해보십시오. 처음에는 깨끗한 것처럼 보일 수 있지만 나중에는 더러워집니다. –

+0

-I 저장 프로 시저에서 내 쿼리를 사용하므로 클라이언트 코드에서'Exec getOptionList 'listName''과 같은 것을 실행하여 적절한 목록을 얻습니다. 그렇게하면 코드는 항상 동일합니다. 나는 그 부분을 오히려 좋아한다. – MAW74656

2

빠르고 쉬운 :

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, 
    [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] 

얻기 내용은 : 더 (특히 경우 하나의 옵션이 하나 개 이상의 목록에 나타납니다)

최적화 (잠재적으로 데이터에 따라 다름)
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

+0

- 연관 associateDept, 기타 2, 기타 3은 모두 목록이 아닌 개별 옵션에 속합니다. – MAW74656

+0

나는 목록 테이블과 옵션 테이블로 데이터를 분할한다는 것을 암시하고 있었다. 두 번째 제안은 다양한 데이터 목록에서 반복되는 옵션이있는 경우 유용 할 수있는 데이터의 추가 정규화입니다. 그건 그렇고, Michael Fredrickson의 대답이 더 좋았습니다. – devstruck

관련 문제