-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Explaining new version naming schema. (#906)
* Explaining new Serialization Versioning schema used in Badger.
- Loading branch information
Showing
3 changed files
with
170 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# Serialization Versioning: Semantic Versioning for databases | ||
|
||
Semantic Versioning, commonly known as SemVer, is a great idea that has been very widely adopted as | ||
a way to decide how to name software versions. The whole concept is very well summarized on | ||
semver.org with the following lines: | ||
|
||
> Given a version number MAJOR.MINOR.PATCH, increment the: | ||
> | ||
> 1. MAJOR version when you make incompatible API changes, | ||
> 2. MINOR version when you add functionality in a backwards-compatible manner, and | ||
> 3. PATCH version when you make backwards-compatible bug fixes. | ||
> | ||
> Additional labels for pre-release and build metadata are available as extensions to the | ||
> MAJOR.MINOR.PATCH format. | ||
Unfortunately, API changes are not the most important changes for libraries that serialize data for | ||
later consumption. For these libraries, such as BadgerDB, changes to the API are much easier to | ||
handle than change to the data format used to store data on disk. | ||
|
||
## Serialization Version specification | ||
|
||
Serialization Versioning, like Semantic Versioning, uses 3 numbers and also calls them | ||
MAJOR.MINOR.PATCH, but the semantics of the numbers are slightly modified: | ||
|
||
Given a version number MAJOR.MINOR.PATCH, increment the: | ||
|
||
- MAJOR version when you make changes that require a transformation of the dataset before it can be | ||
used again. | ||
- MINOR version when old datasets are still readable but the API might have changed in | ||
backwards-compatible or incompatible ways. | ||
- PATCH version when you make backwards-compatible bug fixes. | ||
|
||
Additional labels for pre-release and build metadata are available as extensions to the | ||
MAJOR.MINOR.PATCH format. | ||
|
||
Following this naming strategy, migration from v1.x to v2.x requires a migration strategy for your | ||
existing dataset, and as such has to be carefully planned. Migrations in between different minor | ||
versions (e.g. v1.5.x and v1.6.x) might break your build, as the API *might* have changed, but once | ||
your code compiles there's no need for any data migration. Lastly, changes in between two different | ||
patch versions should never break your build or dataset. | ||
|
||
For more background on our decision to adopt Serialization Versioning, read the blog post | ||
[Semantic Versioning, Go Modules, and Databases][blog] and the original proposal on | ||
[this comment on Dgraph's Discuss forum][discuss]. | ||
|
||
[blog]: https://blog.dgraph.io/post/serialization-versioning/ | ||
[discuss]: https://discuss.dgraph.io/t/go-modules-on-badger-and-dgraph/4662/7 |