Comments (5)
The reason it is integrated in the library is performance: BinMaps require memory allocation and garbage collection. We are heavily optimizing memory usage of both marshaling and unmarshaling operations.
Put/GetObject()
methods save and retrieve a struct to/from the database with its attributes as bin names and values as bin values. Nested structs are automatically converted to maps. This is a very common use-case in application development.
JSON and Protobuf are unrelated to this purpose.
There are no compatibility issues with other languages, and there is no schema other than the struct.
from aerospike-client-go.
I see the point of GC optimization. If the BinPool is the only reason that couples Marshaller/Unmarshaller, We could let Client to expose a method to get bins from the pool. This is not a good design. But I think it's less harmful than Client integrates marshal/unmarshal logic, which may grow/change/deprecate and make Client bigger and possibly buggy. Baseline is that the higher level interface Put/GetObject() should sit on top of underlining database driver. It allows people to plug-in/replace other marshaller if they want.
I am also wondering the benefit to put top level struct's individual attributes into separate bins. Is there any plan to let users to update some attributes but not others? It seems not easy to provide that feature through plain Go struct. (Maybe use pointers for every attribute like proto 2 does, which is ugly and deprecated in proto 3). If not allowing user to change individual attribute/bin, what's the advantage over storing the entire struct in one bin?
from aerospike-client-go.
I just realized that putting attributes into separate bins allows user to create secondary index on attributes, which is indeed an advantage over putting the entire object in one bin :)
from aerospike-client-go.
It makes sense to provide a marshal/unmarshal interface. I'm waiting for someone to ask for it and validate the use-case.
As to your second question: You can announce which attributes to update using tags:
type User struct {
Email string // saves attribute as a bin with name `Email` in the database
Password string `as:"-"` // Transient attribute. Attribute won't be saved in the database.
PasswordHash []byte `as:"hash"` // This attribute will be saved as a bin with the name `hash`
}
You can have a look at client_object_test.go for all supported cases.
from aerospike-client-go.
Thanks for the explanation.
When I say "change individual attribute", I mean to update PasswordHash but not Email.
This is more or less like a ORM layer, which is useful to many users.
But I'd still highly recommend to put it into a separate package. I think it's better to only put core aerospike db features in the Client object. (Core features are explained in general aerospike doc and can be found in other language's client library).
from aerospike-client-go.
Related Issues (20)
- Difference size of allocated memory between client v4.5 and v6.9.1 HOT 3
- PARAMETER_ERROR using expressions and batch write HOT 21
- Client v6 occasionally crushes with concurrent map read and map write HOT 6
- Partition map empty error from Aerospike on vm HOT 7
- panic: unaligned 64-bit atomic operation in Cluster.tend (on 32bit) HOT 4
- Is there a way to get items in list for a PK? HOT 2
- BatchGet with secondary index HOT 3
- command execution timed out in go-client when Docker container is restarted HOT 2
- Is there any way to mock client for UT? HOT 3
- Why is ClientPolicy.Timeout used to create new connections during reads instead of basePolicy.connectTimeout HOT 11
- Type consts are hidden in `internal/particle_type` HOT 7
- How to get show distribution time_to_live HOT 1
- invalid go.mod on master HOT 2
- Could you clarify timeouts for the Query? HOT 10
- [6.14.0] Proto registration conflict caused by `kv.proto` HOT 10
- Support more integer sizes in the Expressions API. HOT 1
- Getting record keys when using QueryObjects
- Is it possible to index and filter keys in map?
- 6.4 upgrade from 5.7 HOT 3
- Massive amount of memory occupied by `newPartitionStatus` and `newNodePartitions` HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from aerospike-client-go.