Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 данные в поле разных типов.  [new]
monstrU
Member

Откуда: Москва
Сообщений: 1216
Добрый вечер.
встала вот такая задача - имеется таблица сообщений, каждое сообщение имеет набор атрибутов, обладающих каим то значением. значение разных типов - целое, дробное, дата, строка.
пока решили сделать таблицы
Сообщения(ид_сообщения, заголовок, тело)
Атрибуты_сообщения(ид_атрибута, ид_сообщения, значение_атрибута, типа_атрибута)
число сообщений может достичь большого числа 1млн и более.
значение атрибута пока поставили как строкове.
благодаря этому при поиске по диапазону значения атрибута целого типа из Атрибуты_сообщения понадобиться преобразовывать к целому - на большом объеме провал в производительности.
в Оракле есть функциональный индекс - есть ли он в MS SQL? был бы он - нам это наверно помогло бы. версия базы- 2008R2.
или как по-другому можно спроектировтаь такую задачу - хранить атрибуты разных типов?
20 ноя 13, 20:51    [15164582]     Ответить | Цитировать Сообщить модератору
 Re: данные в поле разных типов.  [new]
SERG1257
Member

Откуда:
Сообщений: 2748
Если производительность на самом деле важна, то выкидывайте свой EAV и проектируйте нормальную систему - каждому атрибуту свое поле.
20 ноя 13, 21:03    [15164635]     Ответить | Цитировать Сообщить модератору
 Re: данные в поле разных типов.  [new]
monstrU
Member

Откуда: Москва
Сообщений: 1216
SERG1257
Если производительность на самом деле важна, то выкидывайте свой EAV и проектируйте нормальную систему - каждому атрибуту свое поле.

то есть в таблицу Атрибуты завести 4 поля - для каждого типа атрибутов?
20 ноя 13, 21:05    [15164647]     Ответить | Цитировать Сообщить модератору
 Re: данные в поле разных типов.  [new]
SERG1257
Member

Откуда:
Сообщений: 2748
monstrU
то есть в таблицу Атрибуты завести 4 поля - для каждого типа атрибутов?
Это конечно добавит доменную целостность атрибутов (число или строка в дату не залезет) но только пол дела. Я бы смотрел в сторону отказа от еав - (атрибуты в столбик) вообще в замен на атрибуты как поля у таблицы сообщений (пусть не все, но те по которым идет поиск). Такая структура обеспечит максимальную производительность хотя и имеет свои подводные камни.
20 ноя 13, 21:31    [15164735]     Ответить | Цитировать Сообщить модератору
 Re: данные в поле разных типов.  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
use tempdb;
go

create table dbo.EAV
(
 id int identity primary key,
 entity_id int not null,
 attr_id int not null,
 Value sql_variant not null
);

create index IX_EAV__Value on dbo.EAV (Value);
go

insert into dbo.EAV
 (entity_id, attr_id, Value)
 select top (1000)
  1, number, number
 from
  master.dbo.spt_values
 where
  type = 'P' and number < 1000;
go

insert into dbo.EAV
 (entity_id, attr_id, Value)
 select top (1000)
  2, number, cast(number as varchar(10))
 from
  master.dbo.spt_values
 where
  type = 'P' and number < 1000;
go

insert into dbo.EAV
 (entity_id, attr_id, Value)
 select top (1000)
  3, number, dateadd(day, number, '20130101')
 from
  master.dbo.spt_values
 where
  type = 'P' and number < 1000;
go

set statistics xml on;

select
 *
from
 dbo.EAV with (forceseek)
where
 Value between cast(1 as int) and cast(100 as int);

select
 *
from
 dbo.EAV
where
 Value = '1';

select
 *
from
 dbo.EAV
where
 Value = cast('20131001' as datetime);

set statistics xml off;
go

drop table dbo.EAV;
go
20 ноя 13, 22:52    [15165064]     Ответить | Цитировать Сообщить модератору
 Re: данные в поле разных типов.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
monstrU
в Оракле есть функциональный индекс - есть ли он в MS SQL?

Есть аналог — индекс по вычисляемому полю.
21 ноя 13, 09:55    [15166327]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить