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

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

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

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

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

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

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

1002,10 / 12/2008, [DateTime]

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

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

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

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

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

 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: Похоже, я печатаю слишком медленно, и Тони победил меня. 🙂

Давайте будем гением компьютера.