2008-11-26 1 views
1

У меня есть таблица SQL, которая имеет число полейdatatype, предоставляемый пользователем для SQL-поля

ID | Значение | Тип

Типичная запись может быть: - 1000,10, [INT]

второй ряд может быть: -

1001, Foo, [строка]

третий ряд может быть: -

1002,10/12/2008, [DateTime]

меня попросили, чтобы посмотреть на это как на данный момент, каждый раз, когда мы хотим, чтобы выбрать из этой таблицы мы ВГА e, чтобы передать значение указанному типу. Я могу сделать редизайн базы данных на этом, и я задаюсь вопросом, как лучше всего идти на оптимизацию. (SQL 2000).

ответ

3

Ужасы! Это страшная модель Entity-Attribute-Value (EAV)! Убегай!

Но если серьезно, если у вас есть какая-то причина для такого типа модели, возможно, создайте правильно типизированный столбец для каждого типа данных?

ID  Type  StringValue  DateValue  NumberValue 
1001  String Foo 
1002  Date      10/12/2008 
1003  Number          123.46 
2

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

CREATE TABLE dbo.My_Table (
    id   INT NOT NULL, 
    data_type VARCHAR(10) NOT NULL, 
    string_value VARCHAR(100) NULL, 
    int_value INT NULL, 
    date_value DATETIME NULL, 
    CONSTRAINT CK_My_Table_data_type CHECK data_type IN ('int', 'string', 'datetime'), 
    CONSTRAINT PK_My_Table PRIMARY KEY CLUSTERED (id) 
) 
GO 

Вы можете использовать тип данных, чтобы решить, какой столбец вы хотите выбрать или вставить/обновить. Имейте в виду, что, хотя вы, возможно, есть проблемы с использованием:

SELECT 
    id, 
    CASE data_type 
      WHEN 'string' THEN string_value 
      WHEN 'int' THEN int_value 
      WHEN 'datetime' THEN date_value 
      ELSE NULL 
    END 

SQL Server требует, чтобы типы данных все совпадения для столбца возвращается. Если вы только когда-либо выбираете один за раз, он может работать нормально, но если вы когда-либо захотите выбрать наборы данных, вам, вероятно, понадобится выполнить какое-либо кастинг или выбрать только строки, где значения data_type равны. Однако я не тестировал все сценарии, поэтому вам следует поиграть с ним, чтобы увидеть, что работает и что не работает.

Повторю еще раз, вы должны снова взглянуть на дизайн своего приложения. Конечно, возможно, что у вас есть требование для такого рода функциональности, но часто, когда я вижу этот шаблон дизайна, что передняя часть REALLY хочет, это строка, которая будет отображаться в приложении. Эта строка просто иногда выглядит как число или дата. Если вы собираетесь фактически выполнять определенные функции типа данных в данных, то, скорее всего, требуется менее гибкий дизайн, но, не зная всех ваших требований, я не могу сказать. Это только из моего опыта в прошлом.

EDIT: Похоже, я печатаю слишком медленно, и Тони победил меня. :)

+0

Ну, я просто все-таки проголосовал за вас! – 2008-11-26 14:08:48

Смежные вопросы