тип данных, предоставленный пользователем для поля SQL

У меня есть таблица SQL, в которой есть несколько полей

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

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

вторая строка может быть: -

1001,фу,[строка]

третья строка может быть: -

1002, 12.10.2008, [ДатаВремя]

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


person anonym0use    schedule 26.11.2008    source источник


Ответы (2)


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

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

ID       Type      StringValue       DateValue      NumberValue
1001     String    Foo
1002     Date                        10/12/2008
1003     Number                                     123.46
person Tony Andrews    schedule 26.11.2008

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

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 равны. Однако я не тестировал все сценарии, поэтому вам следует поиграть с ним, чтобы увидеть, что работает, а что нет.

Я просто повторю еще раз, вам следует еще раз взглянуть на дизайн вашего приложения. Вполне возможно, что у вас есть потребность в такой функциональности, но часто, когда я вижу этот шаблон проектирования, интерфейс ДЕЙСТВИТЕЛЬНО хочет строку, которая будет отображаться в приложении. Иногда эта строка выглядит как число или дата. Если вы собираетесь фактически выполнять функции, специфичные для типа данных, то, вероятно, потребуется менее «гибкий» дизайн, но, не зная всех ваших требований, я не могу сказать. Это только из моего прошлого опыта.

РЕДАКТИРОВАТЬ: Похоже, я печатаю слишком медленно, и Тони меня опередил. :)

person Tom H    schedule 26.11.2008