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