Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / EAV - выборка большого числа Entity раз / 17 сообщений из 17, страница 1 из 1
02.02.2015, 08:46
    #38869035
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Здравствуйте.
Тестирую EAV модель для своей задачи. Перечитал много чего про EAV, но в основном тема обсуждается при запросе одной или нескольких сущностей за раз и выборке по ним значений (например, инфо по товару в магазине).
А что делать, если за раз запрашивается множество сущностей?
Вот структура БД:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
-- entity
-- таблица связи датчика со временем измерения и фиксированными параметрами (t1-t4), которые есть у любого устройства поставляющего данные.
CREATE TABLE `measure` (
  `measure_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `sensor_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `date_time` datetime NOT NULL DEFAULT '2001-01-01 00:00:00',
  `t1` int(11) NOT NULL DEFAULT '0',
  `t2` int(11) NOT NULL DEFAULT '0',
  `t3` smallint(5) unsigned NOT NULL DEFAULT '0',
  `t4` smallint(5) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`measure_id`),
  KEY `sensor_time` (`sensor_id`,`date_time`)
) ENGINE=MyISAM;

-- attribute
CREATE TABLE `tag` (
  `tag_id` tinyint(3) unsigned NOT NULL,
  `desciption` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `name` varchar(255) NOT NULL DEFAULT '',
  `precision` tinyint(3) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`tag_id`)
) ENGINE=MyISAM;

-- value 
CREATE TABLE `measure_tag` (
  `measure_id` int(11) unsigned NOT NULL DEFAULT '0',
  `tag_id` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `value` double DEFAULT NULL,
  PRIMARY KEY (`measure_id`,`tag_id`)
) ENGINE=MyISAM;



Стандартный запрос данных имеет такой:
Код: sql
1.
select measure_id, date_time, t1, t2, t3, t4 from measure WHERE(sensor_id='73' && date_time>='20150128140000' && date_time<='20150202135959') ORDER BY date_time ASC


Благодаря составному ключу "sensor_time" запрос работает очень быстро. Получается что за 1 запрос пользователь запрашивает множество сущностей, и потом приходится для каждой из них лезть в таблицу measure_tag и, примерно таким запросом, получать данные по нужным тегам:
Код: sql
1.
SELECT tag_id, value FROM measure_tag WHERE measure_id = '305835' AND tag_id IN (1,9)


Волнует что первый запрос может возвращать десятки тысяч строк, и потом приходится делать столько же одиночных запросов к таблице значений "measure_tag" для формирования ответа одному пользователю системы по одному датчику! Даже на тестовых данных страшно заглянуть в лог sql запросов.
Существуют ли пути решения это проблемы с сохранением гибкости атрибут-значение?

БД MySQL 5.5 MyISAM
...
Рейтинг: 0 / 0
02.02.2015, 09:01
    #38869041
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Yed
Существуют ли пути решения это проблемы с сохранением гибкости атрибут-значение?

БД MySQL 5.5 MyISAM

Взять PostgreSQL 9.4 и использовать тип JSONB
<:o)
...
Рейтинг: 0 / 0
02.02.2015, 09:06
    #38869045
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
mad_nazgulВзять PostgreSQL 9.4 и использовать тип JSONB
у JSONB много избыточной информации. Данных достаточно много (для entity это десятки миллионов), для значений сотни миллионов. Пытаюсь делать как можно компактнее.
...
Рейтинг: 0 / 0
02.02.2015, 09:51
    #38869087
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Yedmad_nazgulВзять PostgreSQL 9.4 и использовать тип JSONB
у JSONB много избыточной информации. Данных достаточно много (для entity это десятки миллионов), для значений сотни миллионов. Пытаюсь делать как можно компактнее.

Какая избыточная информация в JSONB?
Структура вашего JSON-а будет:
{"key" : value}
Причем используя PostgreSQL вы сможете на "key" навесить индексы.
А формат JSONB "сожмет" данные (представив их в бинарном виде)

Хотя по идее вообще можно избавиться от key-value, а хранить сущность "как есть".

P.S. сейчас PostgreSQL очень интересная альтернатива, для различных key-value и NoSQL хранилищ.
...
Рейтинг: 0 / 0
02.02.2015, 10:09
    #38869114
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
mad_nazgulP.S. сейчас PostgreSQL очень интересная альтернатива, для различных key-value и NoSQL хранилищ.
Спасибо, я почитаю подробнее про эту технологию.
Но к сожалению нет под рукой специалиста со знанием нюансов PostgreSQL, чтобы разом все протестировать и если что перевести на эту СУБД рабочую систему. Но в принципе такой перевод возможен, архитектура позволяет вообще не трогать клиентов.
Поэтому пока ставка на используемую СУБД MySQL. Если никак, то буду смотреть шире.
...
Рейтинг: 0 / 0
02.02.2015, 11:16
    #38869187
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
YedВолнует что первый запрос может возвращать десятки тысяч строк, и потом приходится делать столько же одиночных запросов к таблице значений "measure_tag" для формирования ответа одному пользователю системы по одному датчику!

Зачем Вам делать кучу одиночных запросов, почему не вытащить все разом?
Код: sql
1.
SELECT tag_id, value FROM measure_tag WHERE measure_id  in (select measure_id from measure WHERE(sensor_id='73' && date_time>='20150128140000' && date_time<='20150202135959') ) AND tag_id IN (1,9)
...
Рейтинг: 0 / 0
02.02.2015, 11:27
    #38869199
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Кот МатроскинЗачем Вам делать кучу одиночных запросов, почему не вытащить все разом?
Работает, но просматривает всю таблицу "measure_tag", индексы использовать не хочет.
...
Рейтинг: 0 / 0
02.02.2015, 11:42
    #38869221
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
YedКот МатроскинЗачем Вам делать кучу одиночных запросов, почему не вытащить все разом?
Работает, но просматривает всю таблицу "measure_tag", индексы использовать не хочет.
Вполне возможно, что это разумная стратегия (зависит от статистического распределения Ваших данных) - укажите ему хинтами насильно использовать индексы (MySQL это умеет, надеюсь?) и сравните стоимости запросов.
...
Рейтинг: 0 / 0
02.02.2015, 12:00
    #38869261
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
YedРаботает, но просматривает всю таблицу "measure_tag", индексы использовать не
хочет.
А если использовать JOIN?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.02.2015, 12:07
    #38869275
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Dimitry SibiryakovYedРаботает, но просматривает всю таблицу "measure_tag", индексы использовать не
хочет.
А если использовать JOIN?..

а что in не преобразуется в join хоть в одной из существующих в нашей обитаемой части вселенной рсубд?
...
Рейтинг: 0 / 0
02.02.2015, 12:15
    #38869288
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Ivan Durakа что in не преобразуется в join хоть в одной из существующих в нашей
обитаемой части вселенной рсубд?
Нет, потому что это принципиально разные конструкции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.02.2015, 12:22
    #38869306
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Dimitry SibiryakovIvan Durakа что in не преобразуется в join хоть в одной из существующих в нашей
обитаемой части вселенной рсубд?
Нет, потому что это принципиально разные конструкции.

покажи план с оператором "in"
...
Рейтинг: 0 / 0
02.02.2015, 13:29
    #38869446
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Кот МатроскинВполне возможно, что это разумная стратегия (зависит от статистического распределения Ваших данных) - укажите ему хинтами насильно использовать индексы (MySQL это умеет, надеюсь?) и сравните стоимости запросов.
MySQL игнорирует подобные запросы на использование индексов в данном случае.

Dimitry SibiryakovА если использовать JOIN?..
Был такой вариант, но получается для каждого найденного тега ( tag_id IN (1,9) ) дублируется строка из основной таблицы с одинаковым measure_id.
...
Рейтинг: 0 / 0
02.02.2015, 13:39
    #38869463
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Yedполучается для каждого найденного тега ( tag_id IN (1,9) ) дублируется строка из
основной таблицы с одинаковым measure_id.
И?.. В чём проблема-то?.. На скорость запроса это дублирование не влияет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.02.2015, 14:20
    #38869511
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
Dimitry SibiryakovИ?.. В чём проблема-то?.. На скорость запроса это дублирование не влияет.
Я вижу такую - если тегов не 2, а 10 и основная выборка строк тысяч 20, то клиенту (в моем случае php) еще придется все это переварить и отдать вопрошающему в нормальном виде - на одну уникальную строку набор ее тегов и значений.
Но я признаю, что не пробовал сам вариант, может и раздуваю проблему. Просто прикинул постобработку и решил пока поискать другие идеи.
...
Рейтинг: 0 / 0
02.02.2015, 15:06
    #38869571
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
YedЯ вижу такую - если тегов не 2, а 10 и основная выборка строк тысяч 20, то
клиенту (в моем случае php) еще придется все это переварить и отдать вопрошающему в
нормальном виде
Если выборка 20 тысяч строк, то вопрошающий сдохнет раньше, чем сумеет её прочитать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.02.2015, 16:08
    #38869623
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EAV - выборка большого числа Entity раз
To Dimitry Sibiryakov: не мешайте человеку писать очередную "универсальную конфигурируемую" систему, где всё вытягивается в оперативку и долго мутно лопатится без индексов и прочего добра.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / EAV - выборка большого числа Entity раз / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]