Izolenta
This is a set of migration helpers delivering delegated uniqueness in Postgres ( A fine approach to solve 'optimistic' singleton record creation problem over data-set with a noticeable not-HOT UPDATEs amount present in corresponding object lifecycle. Read more: https://leshchuk.medium.com/delegated-uniqueness-in-postgres-d0fa103f749c )
The idea of the gem and article originated from two things:
- first I wanted to replace uniq index for optimistic objects creation with something less burdensome for DB.
- second I realised that trigger based solution for dialogs uniqueness I was using will fail to serve its purpose on a default PG isolaiton level.
The first thought was to use redis mutex approach, but it lacks the simplicity and is NOT hard solid as index solution. Its better than done without, but still a lot could happened to fail it eventually.
So I ended up delegating UNIQUE constraint to a helper table whenever I really can win something from skipping uniq index over data set.
What's up with the naming? In russian 'izolenta' means electrical tape (or insulating tape) serving purpose of isolation ( electrical ) on some monkey patching fixing.
As the idea of the gem: patching the data circuit with a 100% isolation.
Installation
Add this line to your application's Gemfile:
gem 'izolenta'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install izolenta
Usage
class YourMigration < ActiveRecord::Migration[5.0]
def change
delegate_uniqueness( :your_table_name, :column_name )
end
end
class WithWrapperFunctionMigration < ActiveRecord::Migration[5.0]
# define some where before 'type_conversion_function' to use it later
def change
delegate_uniqueness( :your_table_name, :column_name, wrapper_function: 'type_conversion_function' )
end
end
class WithWrapperFunctionMigration < ActiveRecord::Migration[5.0]
# apply trigger condition for partial uniqueness
def change
delegate_uniqueness( :your_table_name, :column_name, trigger_condition: 'NEW.type IS NOT NULL' )
end
end
Development
docker-compose build
docker-compose run test /bin/bash
> service postgresql start && rake test
docker-compose run test3 /bin/bash
> service postgresql start && rake test
Future Features
- Sequel migration helpers
- Existing data sync
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/alekseyl/izolenta. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
License
The gem is available as open source under the terms of the MIT License.
Code of Conduct
Everyone interacting in the Izolenta project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.