Для использования наименьшего количества суммы пространства, необходимо использовать поле CHAR, ограниченное для 'Y' или 'N'. Oracle не поддерживает БУЛЕВСКУЮ ПЕРЕМЕННУЮ, BIT или Типы данных tinyint, таким образом, один байт CHAR является столь маленьким, как можно добраться.
Это может быть спорным: я считаю, что не используйте перечисления в T-SQL. T-SQL на самом деле не разработан таким образом, чтобы делать перечисления полезными, как в других языках. На мой взгляд, в T_SQL они просто добавляют усилий и усложняют работу без преимуществ, наблюдаемых где-либо еще.
Я могу предложить два разных подхода:
1) Определите таблицу перечисления со столбцом идентификаторов tinyint
в качестве первичного ключа и значением перечисления как уникальным индексом; например
CREATE TABLE [dbo].[Market](
[MarketId] [smallint] IDENTITY(1,1) NOT NULL,
[MarketName] [varchar](32) COLLATE Latin1_General_CS_AS NOT NULL,
CONSTRAINT [PK_Market] PRIMARY KEY CLUSTERED
(
[MarketId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
Затем либо:
2) Согласно (1), но определите каждое значение первичного ключа как степень 2. Это позволяет другой таблице напрямую ссылаться на несколько значений перечисления без необходимости в дополнительной таблице ассоциаций. Например, предположим, что вы определяете таблицу перечисления Color со значениями: {1, 'Красный'}, {2, 'Синий'}, {4, 'Зеленый'}. Другая таблица может ссылаться на значения красного и зеленого, включая внешний ключ 5 (т.е. побитовое ИЛИ 1 и 4).
Скалярная функция, определяемая пользователем? Не идеально, но функционально ...
CREATE FUNCTION dbo.ufnRGB (
@Colour varchar(20)
)
RETURNS int
AS
BEGIN
DECLARE @key int
IF @Colour = 'BLue'
SET @key = 1
ELSE IF @Colour = 'Red'
SET @key = 2
ELSE IF @Colour = 'Green'
SET @key = 3
RETURN @KEy
END
Мне не нравится идея определять, какие фактически константы для хранимых процедур в нескольких местах - это похоже на кошмар обслуживания и легко подвержен ошибкам (опечаткам и т. д.). На самом деле, я не вижу многих обстоятельств, когда вам нужно было бы сделать такую вещь?
Я бы определенно сохранил все определения перечисления в одном месте - в ваших классах C #. Если для этого придется каждый раз передавать их своим процедурам, пусть будет так. По крайней мере, таким образом они всегда определяются только в одном месте.
Чтобы упростить это, вы можете написать несколько вспомогательных методов для вызова ваших процедур, которые автоматически передают параметры перечисления для вас. Таким образом, вы вызываете вспомогательный метод только с именем процедуры и параметрами «переменной», а затем вспомогательный метод добавляет за вас остальные параметры перечисления.
Как насчет использования скалярной функции в качестве константы. Соглашение об именах приближает их использование к перечислениям:
CREATE FUNCTION COLOR_RED()
RETURNS INT
AS
BEGIN
RETURN 1
END
CREATE FUNCTION COLOR_GREEN()
RETURNS INT
AS
BEGIN
RETURN 2
END
...