Получить данные из мнезии в порядке вставки - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в Elixir и работаю над распределенной системой.Эта система использует несколько глобальных таблиц.Записи в эти таблицы часты, поэтому они должны выполняться довольно быстро.Теперь мне иногда приходится обрабатывать одну целую таблицу и генерировать из нее некоторый JSON, но мне нужно обработать записи в этой таблице в том порядке, в котором они были вставлены в базу данных .(Я не нуждаюсь в каких-либо жестких гарантиях. Редкие ошибки, такие как две замененные записи или даже одна удаленная запись, допустимы.)

К сожалению, у mnesia afaik нет ничего похожего на SQL auto_increment и теперь я изо всех сил пытаюсь реализовать эту функцию самостоятельно.

Решение, о котором я могу подумать:

  • Сохранение метки времени Unix (или другой метки времени) в видеключ для записей.Но мне кажется неправильным, что правильность программы зависит от времени.Ситуация, когда время на двух машинах не синхронизировано, было бы ужасно отлаживать.И поиск времени идет очень медленно (где-то читайте, пожалуйста, исправьте меня, если я ошибаюсь) Единица метки времени Unix - это секунда, которая слишком велика.
  • Храните глобальный счетчик, когда они вводят ключдля записей.Может быть даже медленнее, чем отметка времени, и я не уверен, что возиться со счетчиками мнезии - хорошая идея, поскольку они не подходят для распределенных систем (опять же, пожалуйста, исправьте меня, если я ошибаюсь)
  • Найтимагический способ, как поддерживать порядок, в котором были вставлены записи. Это мой любимый;)

1 Ответ

0 голосов
/ 26 октября 2018

Если вы хотите реализовать это самостоятельно, то, как упомянул @Aleksei, dirty_update_counter/3 - это путь.

Но если вы хорошо используете внешнюю библиотеку, обаMemento и Amnesia поддерживают пользовательскую реализацию автоинкремента.Вот как это будет выглядеть в Memento:

defmodule MyTable do
  use Memento.Table,
    attributes: [:id, :title, :content, :status, :author],
    type: :ordered_set,
    autoincrement: true

end

Кроме того, у Mnesia есть модель возможной согласованности, , поэтому, хотя она очень быстрая, она не дает мгновенных результатов.гарантии согласованности.Какую бы реализацию вы ни выбрали для автоинкремента, она определенно повлияет на производительность.

Полное раскрытие: я автор Memento

...