powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / EAV - выборка большого числа Entity раз
17 сообщений из 17, страница 1 из 1
EAV - выборка большого числа Entity раз
    #38869035
Фотография Yed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Тестирую 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
EAV - выборка большого числа Entity раз
    #38869041
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yed
Существуют ли пути решения это проблемы с сохранением гибкости атрибут-значение?

БД MySQL 5.5 MyISAM

Взять PostgreSQL 9.4 и использовать тип JSONB
<:o)
...
Рейтинг: 0 / 0
EAV - выборка большого числа Entity раз
    #38869045
Фотография Yed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulВзять PostgreSQL 9.4 и использовать тип JSONB
у JSONB много избыточной информации. Данных достаточно много (для entity это десятки миллионов), для значений сотни миллионов. Пытаюсь делать как можно компактнее.
...
Рейтинг: 0 / 0
EAV - выборка большого числа Entity раз
    #38869087
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
EAV - выборка большого числа Entity раз
    #38869114
Фотография Yed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulP.S. сейчас PostgreSQL очень интересная альтернатива, для различных key-value и NoSQL хранилищ.
Спасибо, я почитаю подробнее про эту технологию.
Но к сожалению нет под рукой специалиста со знанием нюансов PostgreSQL, чтобы разом все протестировать и если что перевести на эту СУБД рабочую систему. Но в принципе такой перевод возможен, архитектура позволяет вообще не трогать клиентов.
Поэтому пока ставка на используемую СУБД MySQL. Если никак, то буду смотреть шире.
...
Рейтинг: 0 / 0
EAV - выборка большого числа Entity раз
    #38869187
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
EAV - выборка большого числа Entity раз
    #38869199
Фотография Yed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинЗачем Вам делать кучу одиночных запросов, почему не вытащить все разом?
Работает, но просматривает всю таблицу "measure_tag", индексы использовать не хочет.
...
Рейтинг: 0 / 0
EAV - выборка большого числа Entity раз
    #38869221
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YedКот МатроскинЗачем Вам делать кучу одиночных запросов, почему не вытащить все разом?
Работает, но просматривает всю таблицу "measure_tag", индексы использовать не хочет.
Вполне возможно, что это разумная стратегия (зависит от статистического распределения Ваших данных) - укажите ему хинтами насильно использовать индексы (MySQL это умеет, надеюсь?) и сравните стоимости запросов.
...
Рейтинг: 0 / 0
EAV - выборка большого числа Entity раз
    #38869261
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YedРаботает, но просматривает всю таблицу "measure_tag", индексы использовать не
хочет.
А если использовать JOIN?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
EAV - выборка большого числа Entity раз
    #38869275
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovYedРаботает, но просматривает всю таблицу "measure_tag", индексы использовать не
хочет.
А если использовать JOIN?..

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

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

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


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