Одна проблема, которую я обычно решаю, - это сохранение неизменяемых версий документа, а не редактирование документа.При запросе документа получите самую последнюю версию.
Один из способов сделать это - использовать временные метки:
doc 0:
{
id: "e69e0bea-77ea-4d97-bedf-d3cca27ae4b6",
correlationId: "d00be916-10e3-415c-aaf6-9acb7c70cf4f",
created: "11/17/2018 2:20:25 AM",
value: "foo"
}
doc 1:
{
id: "37ef6f99-bc87-45bb-87ae-a1b81070cc91",
correlationId: "d00be916-10e3-415c-aaf6-9acb7c70cf4f",
created: "11/17/2018 2:20:44 AM",
value: "bar"
}
doc 2:
{
id: "93fc913e-5ecc-4c59-a130-0e577ed4f2fb",
correlationId: "d00be916-10e3-415c-aaf6-9acb7c70cf4f",
created: "11/17/2018 2:21:51 AM",
value: "baz"
}
Недостатком использования меток времени является необходимость заказа по метке времени (O(n*log(n))
), чтобы получить N-ю самую последнюю версию.
Я хочу сделать это O(n)
, сохранив указатели на предыдущую версию, например
{
id: "e69e0bea-77ea-4d97-bedf-d3cca27ae4b6",
previousId: null,
correlationId: "d00be916-10e3-415c-aaf6-9acb7c70cf4f",
created: "11/17/2018 2:20:25 AM",
value: "foo"
}
doc 1:
{
id: "37ef6f99-bc87-45bb-87ae-a1b81070cc91",
previousId: "e69e0bea-77ea-4d97-bedf-d3cca27ae4b6",
correlationId: "d00be916-10e3-415c-aaf6-9acb7c70cf4f",
created: "11/17/2018 2:20:44 AM",
value: "bar"
}
doc 2:
{
id: "93fc913e-5ecc-4c59-a130-0e577ed4f2fb",
previousId: "37ef6f99-bc87-45bb-87ae-a1b81070cc91",
correlationId: "d00be916-10e3-415c-aaf6-9acb7c70cf4f",
created: "11/17/2018 2:21:51 AM",
value: "baz"
}
, так что это связанный список, подобный
NULL <- doc0 <- doc1 <- doc2
Единственное, что мешает мне сделать это, - это то, что для создания новой версии мне понадобится некоторый механизм блокировки, например (в псевдокоде)
lock correlationId
get latest
new.previousId = latest.id
insert new
но я не уверен, возможно ли это на уровне базы данных.