тип данных, предоставленный пользователем для поля SQL - PullRequest
1 голос
/ 26 ноября 2008

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

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

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

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

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

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

1002,10 / 12/2008, [DateTime]

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

Ответы [ 2 ]

3 голосов
/ 26 ноября 2008

Страшилки! Это страшная модель Entity-Attribute-Value (EAV) ! Беги!

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

ID       Type      StringValue       DateValue      NumberValue
1001     String    Foo
1002     Date                        10/12/2008
1003     Number                                     123.46
2 голосов
/ 26 ноября 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 равны. Однако я не закончил тестирование по всем сценариям, поэтому вам стоит поиграть с ним, чтобы увидеть, что работает, а что нет.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...