Как хранить информацию DropDownList в SQL - PullRequest
4 голосов
/ 09 февраля 2012

Я хочу сохранить содержимое нескольких выпадающих списков на моем SQL Server. Лучше хранить их в 1 таблице за раскрывающийся список или в большей таблице?

Моя таблица будет иметь следующую схему:

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 ]

5 голосов
/ 09 февраля 2012

Я работал в базах данных, в которых была одна «таблица суперопций», в которой содержались значения для нескольких раскрывающихся списков ... это работало нормально для заполнения раскрывающегося списка, но когда мне нужно было использовать эти значения для других отчетов В связи с этим это стало болью, потому что «таблицу суперпопций» нужно было отфильтровать на основе определенного набора необходимых мне опций, и в результате возникли уродливые запросы.

Кроме того, в дальнейшем возникли условия, которые требовали отслеживания дополнительного значения в одном из списков ... но этот столбец необходимо будет добавить ко всей таблице, а затем ко всем другим наборам параметров в этом таблица будет просто иметь NULL для столбца, который им не нужен ...

В связи с этим, я бы предложил, если вы имеете дело с совершенно разными списками данных, эти списки должны храниться в отдельных таблицах.

2 голосов
/ 09 февраля 2012

Быстро и просто:

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

(потенциально: зависит от ваших данных) более оптимизировано (особенно, если одна опция появляется в более чем однойlist)

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

В любом случае вы захотите проиндексировать столбцы внешнего ключа.

...