VSDB is a 'Git' in the form of a KV database.
Based on the powerful version control function of VSDB, you can easily give your data structure the ability to version management.
Make everything versioned !!
Vecx
just like Vec
Mapx
just like HashMap
MapxOrd
just like BTreeMap
Suppose you have a great algorithm like this:
rust
struct GreatAlgo {
a: Vec<...>,
b: BTreeMap<...>,
c: u128,
d: HashMap<...>,
e: ...
}
Simply replace the original structure with the corresponding VSDB data structure, and your algorithm get the powerful version control ability at once!
```rust
struct GreatAlgo {
a: VecxVs<...>,
b: MapxOrdVs<...>,
c: OrphanVs
let algo = GreatAlgo.default();
algo.branchcreate(...); algo.branchcreatebybasebranch(...); algo.branchcreatebybasebranchversion(...); algo.branchremove(...); algo.branchremove(...); algo.version_pop(...); algo.prune(); ```
NOTE !!
the
#[derive(Vs)]
macro can only be applied to structures whose internal fields all are types defined in VSDB, but can not be applied to nesting wrapper among VSDB types, you should implement theVsMgmt
trait manually if you are in this style.This data structure can be handled correctly by
#[derive(Vs)]
:```
[derive(Vs)]
struct GoodCase { a: VecxVs
, b: SubItem-0, c: SubItem-1 } struct SubItem-0(MapxVs
, VecxVs ); struct SubItem-1 { a: OrphanVs
, b: MapxOrdVs } ``` But this one can NOT be handled correctly by
#[derive(Vs)]
:``` // It can be compiled, but the result of its work is wrong ! // The version-management methods of the 'MapxVs
' will not be generated ! // You should imple the 'VsMgmt' trait manually for this kind of data structure ! [derive(Vs)]
struct BadCase { a: VecxVs
>, } ``` This one is also bad!
``` // The compiling will fail because the 'b' field is not a VSDB type. // You should implement the 'VsMgmt' trait manually for this kind of data structure !
[derive(Vs)]
struct BadCase { a: VecxVs
>, b: u8 } ```
Some complete examples:
sled_engine
, use sled as the backend database
rocks_engine
, use rocksdb as the backedn database
cbor_ende
, use cbor as the en/de
coder
bcs_ende
, use bcs as the en/de
coder
Based on the underlying one-dimensional linear storage structure (native kv-database, such as sled/rocksdb, etc.), multiple different namespaces are divided, and then abstract each dimension in the multi-dimensional logical structure based on these divided namespaces.
In the category of kv-database, namespaces can be expressed as different key ranges, or different key prefix.
This is the same as expressing complex data structures in computer memory(the memory itself is just a one-dimensional linear structure).
User data will be divided into two dimensions: 'branch' and 'version', the functions of the 'basic' category are stateless, and the functions of the 'versioned' category are stateful. In the internal implementation, each stateful function is implemented based on its corresponding stateless function, all stateful data has two additional identification dimensions ('branch' and 'version'), somewhat like the logic in Git. Stateless functions do not have the feature of 'version' management, but they have higher performance.