Плохо ли повторять одни и те же значения?

Я работаю над приложением, которое должно отслеживать видео на YouTube. Я хочу периодически извлекать информацию о соответствующих видео в Datomic, а затем использовать их в качестве встроенных заголовков, описаний и т. д. Наивный способ сделать это — периодически извлекать всю информацию, которую я хочу, и вставлять ее в мою базу данных.

Но в большинстве случаев информация не изменится. Заголовки и описания могут измениться (и я хочу заметить, когда они это сделают), но обычно этого не происходит. Используя наивный подход, я бы обновлял сущности с одним и тем же значением снова и снова.

Это плохо? Я просто заполню свое хранилище историей? Приведет ли это к многочисленным переиндексациям? Или мне не стоит об этом беспокоиться и позволить Datomic позаботиться о себе?

Менее наивный подход будет смотреть на текущие значения и смотреть, нуждаются ли они в обновлении. Если это лучшая идея, есть ли простой способ сделать это, или мне следует ожидать написания большого количества пользовательского кода для этого?


person Peeja    schedule 28.08.2014    source источник
comment
как часто периодически?   -  person J-Dizzle    schedule 28.08.2014
comment
@BenKamphaus Похоже, что :db/cas позволяет вам утверждать, только если текущее значение является некоторым заданным значением, но не позволяет вам делать утверждение, только если текущее значение не является некоторым заданным значением. Тем не менее, если нет подходящей встроенной функции транзакций, написание моей собственной функции транзакций, вероятно, является хорошим способом сделать это.   -  person Peeja    schedule 04.09.2014
comment
Я изменил свой комментарий, чтобы указать вам здесь: blog.datomic.com/2012 /08/atomic-chocolate.html   -  person Ben Kamphaus    schedule 05.09.2014
comment
Ах, спасибо! В этом случае я не буду использовать функцию транзакции. :) Похоже, правильно было бы извлечь то, что нового, из состояния мира, которое YouTube дает мне, как можно ближе к YouTube-стороне моего приложения.   -  person Peeja    schedule 05.09.2014


Ответы (1)


Слишком частое обновление определенно является проблемой для производительности базы данных. Да, это вызовет проблемы с индексацией, но и с точки зрения скорости это не идеальное решение.

Если производительность вашего приложения имеет значение времени как важного фактора, я бы написал собственный код для проверки, а затем при необходимости обновил его.

person Vindy    schedule 28.08.2014
comment
Является ли проблема производительности только в том, что upsert будет медленнее, чем пропуск upsert там, где он не нужен, или выполнение большого количества ненужных upsert приведет к замедлению других запросов и транзакций из-за ненужных данных в системе? - person Peeja; 04.09.2014
comment
Другими словами, могу ли я пока что наивно выполнять апсет каждый раз, а потом добавить проверку, чтобы сделать его более производительным, или данные из моих старых наивных апсетов будут продолжать тормозить Datomic даже после того, как я добавлю проверку? - person Peeja; 04.09.2014
comment
Вы не делаете это в масштабе, достаточно большом, чтобы иметь значение. Например, дополнительный поток данных не задерживает индексатор. И вы явно не сильно вкладываетесь в запрос истории для этих сущностей. Таким образом, все, что действительно потеряно, это то, что некоторые из ваших транзакций для ваших объектов YouTube на самом деле не представляют собой изменений - не имеет большого значения. Это незначительное проскальзывание модели данных. Мне еще предстоит написать свою собственную абстракцию только для транзакций с ключами, которые изменились, или ничего не делать, но мне нужно это сделать в ближайшее время и рассмотреть возможность использования этого: clojuredocs.org/clojure.data/diff - person danneu; 09.10.2014
comment
Единственное снижение производительности базы данных, которое я вижу, заключается в том, что каждая транзакция создает транзакционный datom, даже если транзакция пуста. Если вы вставляете только одну сущность на транзакцию, вы создадите много пустых транзакций с ненужными данными транзакций. Но если вы расстроите, скажем, 1000 сущностей на транзакцию и маловероятно, что каждая из них останется неизменной, вы ничего не потеряете. - person Alexander Kiel; 25.05.2015