2009-09-09 3 views
3

Я принял приложение ASP.NET, которое необходимо переписать. Основные функции этого приложения, которые мне нужны для репликации, изменяет базу данных SQL Server, доступ к которой осуществляется через ODBC из стороннего программного обеспечения.Добавление столбца в базу данных SQL Server

Приложение сторонних разработчиков создает файлы, которые представляют собой метки принтеров, созданные пользователем. Эти файлы меток напрямую ссылаются на поля источника ODBC. Каждая строка таблицы представляет собой продукт, который заполняет поля метки. (Таким образом, в этих файлах указаны прямые ссылки на имена столбцов таблицы.)

Приложение ASP.NET позволяет пользователю создавать/обновлять данные для этих полей, на которые ссылаются метки, путем добавления или редактирования определенную строку, представляющую продукт.

Он также позволяет случайным образом добавлять новые поля ... где он фактически создает новый столбец в основной таблице, на который ссылаются метки.

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

ответ

1

Это очень зависит от запросов, которые вы хотите выполнить против этих таблиц. Основным недостатком KVP является то, что более сложные запросы могут стать очень неэффективными.

«Гибридный» подход обоих может быть интересным.

Сохраните значения, которые вы хотите запросить в выделенных столбцах, и оставьте остальные в блоке XML (MS SQL имеет приятные функции для четного запроса внутри XML) или, альтернативно, в сумке KVP. Лично мне действительно не нравятся KVP в БД, потому что вы больше не можете создавать специальные индексы приложений.

Другим подходом было бы не моделирование конкретных столбцов вообще. Вы создаете общие таблицы «настраиваемого атрибута», такие как: Attribute1, Attribute2, Attribute3, Attribute4 (для требуемого типа данных и т. Д.). Затем вы добавляете метаданные в свою базу данных, которые описывают, что означает AttrX для определенного типа метки принтера.

Опять же, это действительно зависит от того, как вы хотите использовать эти данные в конце.

3

Это может стать проблемой, когда слишком много столбцов добавляются в таблицы, и вы должны быть осторожны, если производительность является соображением (прикрывающие индексы неприменимы, поэтому можно было бы искать дорогие закладки).

Другой альтернативой является структура пары «ключ-значение»: Key Value Pairs in Database design, но у этого тоже есть подводные камни, и вам лучше создавать новые столбцы, как вы предлагаете. (KVP хороши для настроек)

+0

Yeap-here - это сообщение SO на парах KV - http://stackoverflow.com/questions/126271/key-value-pairs-in-relational-database – RichardOD

1

Один риск - слишком широкий стол. Я использовал для поддержания ужасного приложения, которое добавило 3 столбца «автоматически», когда новые значения были добавлены в некоторый XML (по какой-то причине он считал, что все будет строкой даты или числа, следовательно, создание 3 столбцов).

Существуют и другие методы, такие как сериализация BLOB или проектирование таблиц по-разному, что может помочь.

2

Один вариант, я думаю, использовать таблицу KVP для хранения динамических «столбцов» (как впервые упоминалось Митчем), соединить таблицу продуктов с таблицей KVP на основе идентификатора продукта, а затем развернуть результаты, чтобы иметь все динамические столбцы в наборе результатов.


EDIT: что-то вдоль этих линий:

Приготовьте:

create table Product(ProductID nvarchar(50)) 

insert Product values('Product1') 
insert Product values('Product2') 
insert Product values('Product3') 

create table ProductKVP(ProductID nvarchar(50), [Key] nvarchar(50), [Value] nvarchar(255)) 

insert ProductKVP values('Product1', 'Key2', 'Value12') 
insert ProductKVP values('Product2', 'Key1', 'Value21') 
insert ProductKVP values('Product2', 'Key2', 'Value22') 
insert ProductKVP values('Product2', 'Key3', 'Value23') 
insert ProductKVP values('Product3', 'Key4', 'Value34') 

Получить:

declare @forClause nvarchar(max), 
     @sql nvarchar(max) 

select @forClause = isnull(@forClause + ',', '') + '[' + [Key] + ']' from (
    select distinct [Key] from ProductKVP /* WHERE CLAUSE */ 
) t 

set @forClause = 'for [Key] in (' + @forClause + ')' 

set @sql = ' 
select * from (
select 
    ProductID, [Key], [Value] 
from (
     select k.* from 
     Product p 
     inner join ProductKVP k on (p.ProductID = k.ProductID) 
     /* WHERE CLAUSE */ 
    ) sq 
) t pivot (
    max([Value])' + 
    @forClause + ' 
) pvt' 

exec(@sql) 

Результаты:

ProductID Key1  Key2  Key3  Key4 
----------- --------- --------- --------- ------- 
Product1 NULL  Value12 NULL  NULL 
Product2 Value21 Value22 Value23 NULL 
Product3 NULL  NULL  NULL  Value34 
Смежные вопросы