Logo TIB AV-Portal Logo TIB AV-Portal

Schemaless SQL

Video in TIB AV-Portal: Schemaless SQL

Formal Metadata

Schemaless SQL
The Best of Both Worlds
Title of Series
Number of Parts
CC Attribution - NonCommercial - ShareAlike 3.0 Unported:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal and non-commercial purpose as long as the work is attributed to the author in the manner specified by the author or licensor and the work or content is shared also in adapted form only under the conditions of this license.
Release Date

Content Metadata

Subject Area
The Best of Both Worlds Schemaless database are a joy to use because they make it easy to iterate on your app, especially early on. And to be honest, the relational model isn't always the best fit for real-world evolving and messy data. On the other hand, relational databases are proven, robust, and powerful. Also, over time as your data model stabilizes, the lack of well-defined schemas becomes painful. How are we supposed to pick one or the other? Simple: pick both. Fortunately recent advances in Postgres allow for a hybrid approach that we've been using at Heroku. The hstore datatype gives you key/value in a single column, and PLV8 enables JavaScript and JSON in Postgres. These and others in turn make Postgres the best document database in the world. We will explore the power of hstore and PLV8, explain how to use them in your project today, and examine their role in the future of data.
point script man default services files time interactive Transactional rollback words Computer animation atomic Video
Actions Computer animation Development Development traction Databases sort applications perspective
Computer animation Sequel logic statements life applications
Migrations man relation Computer animation key code time Development expressive Authorization table
man relation time views traction Databases data replication web Indexable web applications Computer animation Query load-balanced share Multiple record
Migrations means processes Computer animation Development equal sort table total
CIs track server mapping code files tier Relational storage code Databases storage iked applications metadata versions mathematics Pointer Computer animation versions level sort series ensemble
Robots track Computer animation files key files diverge Chat stable
building Computer animation forces law materials Databases sort platforms
standards Computer animation Super traction rollback Right Transactional Databases perspective
man response Serialization time storage traction applications fields production Semantic Web Migrations Indexable words Computer animation Query topology operations sets table plugin
functionality standards control key indicators drop production Indexable Computer animation operations arrow sort series Cats extent errors Results extent
injectives key demo attitudes integrators real plot traction Databases instance applications Coloured production production versions mathematics Computer animation Query Blog statements sort extent record
track Actions services Sequel Open Source time routine sets sign in events programs second mathematics different structure platforms form area key formating fit counting Databases Transactional connections Migrations words Computer animation sort table libraries
Migrations Computer animation string time string storage sort structure
man Observation Computer animation code time effects integers transfer applications number connections
man processes Computer animation time views division sort part
server code JIT perfect time browser Mass argument part information crashes goodness Google box garbage collector model structure script man code part DoS Google processes Computer animation compilers sort services
man goodness Computer animation code storage division extent
area caches implementation Computer animation Sequel functions testing sort Recursive
functionality code Computer animation Sequel functions Managementinformationssystem normal sort variance connections information
man Types numerous Computer animation different Managementinformationssystem objects structure table number data types
functionality statistics building exiting time maximal indicators counting regular orders of magnitude image specific different area parsing standards key Blocks expressive sampling Types Indexable message-based numerous Computer animation Query functions orders table
mapping Super views traction ones indicators bits scans counting number Indexable processes Computer animation naturally testing Results exception
domain default functionality Computer animation law combination effects sort extent data types man domain
functionality table lines sources information templates second domain loops notation conditions stable domain man parsing key Databases applications words processes Computer animation logic functions sort table
web period functionality processes Computer animation life selection templates second information libraries
parsing functionality matchings files code code limitations number data management Computer animation functions sort objects data types
comparison functionality counting information number uniformity Computer animation naturally topology integers sort structure data types
Auswahlverfahren Computer animation string information
injectives script man Slides Actions Sequel exiting real Databases sequence splitting words processes Computer animation functions sort
key Development projects traction The list applications production area information production Computer animation integers integers classes record libraries
functionality Trigonometrie Serialization information sampling ones limitations dictionaries production number production information Computer animation closures Query topology arrow sort libraries
Computer animation Development classes Databases impedance data types classes information
point focus functionality parsing key code information systems Development time share storage The list Databases bits storage browser applications production information computational mathematics Computer animation organization systems
man functionality information systems views indicators clients applications processes Computer animation Query functions reading classes
on the talk about technique and calling scandalous equal and
atoms will line over
I have it before start I want to do a public service announcement the announcement but this in your PC course file that should be the default that's fantastic so this does is it out of points when you're in a transaction when screw something up like you type from and for the simple where transaction and then you can just keep going and only does it when you're interactive so if kissing scripts and epicercal that's fine but what do it but if you're interactively in account it just saves you a lot of time so this is fantastic and it's impossible to discover so it's called honor Alexis but also at her
review on the group proposed testing and that before
I really get into it I wanna give sort of my perspective were coming from an application developer
actually just started using the stress your half going to interrupt you before that I have heard about post press but never really used it myself my used other databases and these post-stressed indirectly because before coming to review as a customer for a few epochs of attrition application of run and put stress on the human umbilical that's fine you know whatever but then after joining the company really begin to get a grow much deeper appreciation for the database and what so before I
you know jury asserted without a PhD in article which I don't think it's that uncommon of start and this is sort of
what applications of life was just a big a big tango all you know logic separated by HTML provide more logic and and so you know my my sequel statement thrown and it is really huge mass on
planet discovered active which is the ruby or some kinds of rails and this this blew my mind this was phenomenal because I was
able to deal in my mind with relations instead of the actual tables I start describing how in a declarative way how might I could think about data had and authors and books and you know the relationship between each other and it's more than just a foreign key and I can this this was made everything really simple to deal with and consumption 1 at a lot from and but still
uh everything was perfect I still had to deal with migrations I still had to you write my code do migration deploy this like this time when my code is alive in the migration has run its expression like 301 development of the team or DVDs like handle this is all me and things just more of a perfect but they're just about something wrong so I kept looking for other solutions linking across cultures and unobtrusively 1 here plate of culture that it's just as as a
brief overview of my criticism attached beat up by 1 of the great so features Academy has is all over HTTP so I can stick that my load balancers inverse caching proxies that I have my web stack I can take the same acknowledges that I understand that but the from a database and have some of the same advantages as stressful issue as people get angry when I called RESTful that's not quite the rest of the there's multi-master replication built and which I thought was really cool turns out my start by didn't do it because we don't know about that but it was cool there was there are any query with these MapReduce views which are most likely to directly manipulating oppose press index Peachtree which into more later which at the time of our school now that I know more about how works yeah opposed to all
but the real also think about how much is this is the most database I describe documents J and which is perfect for me this web application of for because in dealing with g and jumps to perform in the same time so on that these documents they just stuff it's just like the relations diffractive record from these documents fit my worldview much better so
but it's it's really it's it's really easy understand that love that a lot of people have from Margaret couch which I think is easy dismissed as is in the process mean is a car is a mature technologies which they are but you know 1 you know sort of echoing some things that Peterson he is like the there is the moving fast and it's it's it's important anything understand why developers are clinging to these technologies
and this is because documents the fund to deal with ASR equal that that's kind hard I tables they sort they they can begin the cumbersome to change migrations the
painful so instead of doing them when you should earlier and it has become painful later when you forced to the the 3rd most forested pain and often might in the data that a deal with IBM application is a truly relational it they can be modeled in a relational manner but it but it's not inherently relational and and so that sort of mappings relevant hits mismatch because I want my storage to look like my code because I am 1 person is doing bowl you know all the layers when the 2 disjoint by changing my mind to go from 1 place to the other is this area and that slows me down and so I can keep my code in the application tier similar to that of the database as much as I can make sense so I'm allowed to go much faster and so as a as a
kind of example of some of this is what the schema looked like for the server by founded before coming to review and so we did was we had was sort of like music burgeoning like this code version but for music and so a song there there are many saw the song had a title that have a pointer out to an artist documents and other metadata at that level I had each song had an array of versions in individual versions had you know you're taking change perversion because data created metadata at that level of each version had a series of tracks and tracks you have their own information and and so on and so forth and I
realized that I could have done but it was hard because you're going back
that file it has to know about everything about his noble the track associated with divergences assuming the song associated in all those foreign keys if I had a files stable but is like a lot and it was it was hard to keep it all in my hand once and so storing it as a single document a single song and having all in 1 place that the new order-sensitive others so
is it its do PostScript but a was
so I I give this talk to materials have and I went to all these laws and things that the post was that is all that for people here but like that none of them knew that any of this stuff was in distress and the but so this is sort of building on this sort of platform was forces serving more as a platform for data rather than just a database another thing that makes
posters great is when metallic standards and talk tomorrow Wally that ships the right had log S 3 4 Super durability and 1 things that
I realize for coming back to perspective being you know where your is going to cause stress coming back to relational databases that in realize that this was transactions on being able to that peace economic database take again and you play around and then have the seeking of individual rollback if anything should go wrong is just phenomenal I didn't realize how much how powerful that was until I went away from it for a while but
but but still you know that I started to miss documents but I
and this that I don't miss many workers and brought them back and forth and Semantic Web 2 things
H star which I'm sure everyone here is familiar with but more prone to talk about how we use it regular and then that killed the 8 which is our out and coming soon as each story that ensure
that just is there anyone who has not use a sure that should get into the bucket of plug-in into the dozens of and so it's a key-value store the can fit into individual column and so you have your your other columns that the new candidates for column and what's what's really great is you can indexes and so 1 things ask a lot of people is have you ever just serialized data and 2nd columns anticipate column known that went on that here too much much much much less than a 1 as the rails how everyone reason because you know a lot of times they don't they don't want to do a migration 1 and another table if they can just get away with shoving that in a column and you know as long as and then make the the tree but they can't query on it that's good enough for a lot of people and so the fantastic H story does is that it lets you have a key-value serialize data but also Korea and so this is the the documentation on it was just do the word there's a lot of reading response is OK so so but and so which you can do this is that the basic the basic syntax if you want to get into the the details of it I recommend checking out the application of stress field work but this has a 0 operator for getting a single key out and you can know update step would be can can operator and but the fantastic thing is you can be treated like any other columns can be joined up you can also this this query would give you all of the companies that I any create
indexes on these operators and 1 of the unique have generalize index to give you sort of you know broad index or if you know you can access 1 particular column a lot it helps to have a functional index 1 of things that are really fascinating to prompt user the if you just you wanted that doesn't work and features and so 1 of the funny thing so this is so that's all that much of a cat concrete an example so I switch to the underlying operator which is gets key that matches this underlying function that that the error results to but you create an index on that and then use the arrow operator which just results of function doesn't pick up the index and so that's students and and
so it's only series if your posters 9 1 of there's just an extension becomes and the Americans standard control if you you can use it it's been POS presence like 2 8 3 for a while you know of course before you the backslash I unifying the after that with that the extensions for the 9 1 for extension 1 of the things that is
super excited for me is the next version of Active Record has built in support for each other and so the the excitement at least in in my community really community for a story phenomenon we a plot of blog post about announcing support for this because we launched on 1 hand extensions and that the traffic that people infer what 1 that's about the stage 2 and it was sort of see a real change of people and to get into later about actually adopted advanced database features and this is sort of is sort of a vanguard of this culture change instance between the on using the generic so that you can use this this is sort of what it looks like from repeat by cancer products where my attitudes column has the key value color rather than you know gets something there will be I and it prevents equal injection of the 1 of the other things that with an
at that Active Record accurate 3 which is interesting for you guys is that it actually does prepared statements automatically and so when you're application itself the 1st utterance query if you're using POS stress it will prepare the statement and then hold on to that and I you know there are some caveats prepared statements like the planned changes significantly 2nd of the that blood since it does it just when the application builds up in the applications typically we start somewhere around frequently they can usually get it's pretty good we've only seen a couple supporting that's what people needed needing to turn this off because of getting that it's difficult but it was see as a demo of how users and rails women colleagues wrote an open-source adapted to shut this off and check it out it's the integration center that
I use a different library of sequel which area which also support for so how we use a set group you are so weird that the database service and every 15 to 30 seconds to check in on each and every database that we're and we asked some questions are you there running our tables you have many connections from much table size and you have a lot of weeding wall segments that have been shipped off because if it gets above like anything in more than 1 time and it would be worried that if anything should happen would have the wall ship as we check and very frequently but the the checks that we do have changed a lot over time as we discover new things that we should be checking and realize that other things that we've checked previously we don't need any more than I do and it's we have you know gigs engaging eating into the applications and if I were to do migration that everything I wanted to check something new and experiment and see if this is going to be a useful check or not but I did take my Davistown like all the time and so instead we just have an age 4 columns that we put these observations and but it's mostly the same but the structure sort of changes over time and that's what another tool that
we've open-source here called Wikipedia is it stands for you a word count dash as a service so and it's a program written go that if you format logs as a key value things less it'll take that and then show in nature and so we use this you need to do and even of all lot of transactions and we use this form to keep track of our billing across a platform of the events that we just you collect a large strengthens Chapman and each 2 and this is and go is of great fit for this because it can exploit the routines to collect all these phylogenies right the stress and
so the the sort of approach this book approach of having a regular even regular columns that you would have been just adding in each store and storing data in there and over time if I see that you know this this particular key isn't going anywhere all promoted out of proper column and that way I have the flexibility of trying about without having to do a full migration and had a column like can edit and then it's it's not useful forget about it if is useful to take time to write it into a proper house or the honest that I don't actually the promoters much the probably should because they sure is perfectly fine
but that's all pretty good but 1 of the problems is you can nest in a short in each stock it's just 1 flat structure of the problem is that it's always usually strings and values on the strengths and so we get
around this by having as as a as a typical just some conventions and so we have these many connections where effect he ends with underscore at will considered at a time and my application code will pass it on to the date but if it starts with number and size will converge to an integer Williams and without question marks in which use transfer everything else and that you know we've I've done I think we do those observations of tide mark on the order of like between you know depending on how long the checks are taking a particular time between 1 and 3 million in and out and dissolves 7 and ages and it's been fantastic in the great thing is you can use
it to but the yeah the new and exciting
part is you just have to get this working on I actually don't know if you know so that that time but I'm I'm I'm using and so on and so on until is sort of the the interesting part
of its appeal BA is the view of jobs to engine of rests sorted by virtue of his giving a talk you're not seeing and then continued on with other people notably into constant so why
jobs I while in everywhere this structured in every single browser you know it's easy to get started with and I you even not . script arguably on the server thing with no just not particularly and it has good parts of it has anyone seen the just good parts book yeah it's like it's like this big and then next to it and then you put it next to the jobs for preference which is this and so the the argument of the good parts is that you can learn a language and massive languages and knowing everything languages knowing what to avoid and fortune just because a lot of things to avoid but if you stick to the good parts of it it's actually thinking language so and important for us brokers the trusted language you know Johnson was built to be sandboxed inside a browser and having that sense in boxing and you model and having post-crisis perfect for us to offer his kill language because you can go out and crashes is the big 1 then the jobs prevention is fantastic it's 7 by google it compiles a just-in-time compiler to native called native code which makes really fast as modern techniques of cogeneration garbage collector and so on and so forth and
so you can like the others there's been other people but just for a long time and kill Python killed people really know what why am I not interested in the and it's because of a job search is really suited to sort of manipulating these data structures in Jason but whereas the other language a more general purpose and so you can get
activated go code
that song it's pretty easy as far as things go a step to do that PG xn thing I'd have abundant store brochure about that you know like the equals 1 or 2 and then all works but you think of
it when I go through an example of Fibonacci which while using the greatest examples 1st benchmarking and such as i gives a good feel for introduction to how you
use it to use of purely area here is a Fibonacci done as that just a regular killed duty sequel functioned as the naive no caching and recursive that much
NCP run over you know going in increments of 5 1 0 3 5 it takes about 3 minutes just just on my Mac sort stick what that would look like if we did it in JavaScript is the same same implementations a recursive on naive for Fibonacci and the test you
granted Pielke sequels not really a numeric language however this shows off which is the advances in this with a connected component to native code with that idea that i don't wanna
stop there I wanted simplify occupation and so introduce normalization and it's it's cheating but it's really fast
and that's sort of just you know how you would go right using the draft functions
so let's let's go back to documents
since there is a simple Javascript document the jason document that has a name numeric types and then the rain nest in the array size you have smog documents of phone numbers idea just to show off with all the different features of objects
on but it's just made a table that just as the data comes as a bunch a bunch a bunch of 5 . random documents of the structure I think about a million and yet and so here
is a basic functional pull out a numeric types from adjacent act so that's walk through this year it but the function takes the key you wanna Pollock and it takes the document's text as and returns in America and where does just use the the built-in Jason passing and present the data and then just pulls of the key and returns that use only use it if if you're doing something you know like you did in the areas of all that it is what it has to parse every single document each time just to plot the 1 he at once if are the 2nd example here is I just put all those ages into our regular standard table and image samples for Stewart and it's much faster so you working you quite quite each policy currently for doing this past but as you start
getting to more more complicated queries the difference you know becomes much less and is accountable expression to get a bunch of different statistics and and you know it's still slower but it's no longer like several orders are orders of magnitude slower but you know know the way basic building block we can prove that and so no pulling at a specific at specific age you know again a slow but they can create an index on because post-processing characters index came from killed wanted once create exit nodes to treated just like any other index has and so the 2nd 1 using the index it uses a justified and then an exponent super interested for a post was 9 2 with Unix only stands to even on this even further said enough to do any of the you know any the fall back to Jason once an indexes built and for those of you
familiar with the this the same exact trade off the couch so catch you create a job strip MapReduce you in the 1st half created you it's really slow because it has to crawl through each and every document creating the view justice postprocessed you when it's created the index but then afterwards which you have index it's you know perfectly facts with 1 notable exception post couch cannot combine arbitrary numbers of users into 1 of you were supposed stress is perfectly happy with
combining arbitrary index look-ups together with them in the bit map checking and here in this example here just taking 2 different indexes and made it is combined together during the reach common the ones that has to return result and this is the test I'm super happy think you're going to work done in nature this index is from and and then of
course that the great is posters 9 with the native Jason data you know now what it wants to get data type is the default effect coming with PostgreSQL and you can solve PLGA via the combination is
fantastic but now I wrote this before there's the backward extension of adjacent detects if you want to use adjacent did the back 1 where things I've been doing is discovered domains and so you can create a a sort of a poor man's the domain and just check make a function that checks about scientific can't pass it return false if it can pass a return true and that investors 2 examples of the 1 on the left is belges sensory true law is not unfortunate allergies answer returns false and then you can create your
table using this this domain however uh is probably better off to just use that backward word just as what
can we do when we have arbitrary drastically data database and 1 of things that excite me the most was mustache they would use the mustache putting language now but what I
will go into it and so moustaches a really great template language because it has no logic at all you just have your keys 1 AppLogic template is surrounded by 2 curly braces and it can do some basic looping over things some really basic conditionals if something exists or not but you can't put any application in 1 of things that seem content again as you templating languages out is people challenge much logic interview when really you should just be entered the data and the template and and go and so on so so mustaches implemented in several languages there is a job scribble notation and so this sort of technique is you create a function definition you paste everything from the source code and then so little stability and to pass adjacent from the view but with the template you get it and then return it rendered as an HTML instantiation of just this is the function because it's definitely it's intended for what it and and so this is
but the catch and there is where they are a mustache template looks like so and the pounds decoration iterating over all my thanks the period will prove that thing and then this is the end of my life and so if things arranged in Jason of world from well I can select this seconds function and then template together is this useful having a templating language in Cyprus and that's pretty cool and I people it's exciting but more useful using
the same technique of taking a job strip library intended for the Web warfarin of just putting in post-stressed that's actually useful is Jason select and so this is
sort of like XPath or CSS selectors but for Jason documents and so using that same of same method I pretend that I'm going to be a new package manager file so make an expert object a small my code and then I give it something I and match but you know match my document for sort of sentence and then I return it back as Jason and so a function that takes a slaughter takes JASigning returns to its and
so as a reminder these are the documents into a dealing with this peak the people's named ages and the phone numbers but now have
Jason's luck I can say give me the name can be the 1st names of name and child 1 of data is name Gangemi all phone numbers as follows so this is going through all my documents that have sort of an expressive way to look at the structure of the structured nature of these trees and back and so instead of having to have individual function for my did America now I can just say give me the age of the stock I of course this is something that is Jason cast it to an integer to do the comparison is an integer and but this is again the same thereby before but now with this sort of matter in a language built on top of PLGA function now there are a
lot of rough edges notably you know
all that casting they have to do and just return Jason I'm actually trying string of her positive cast a string of synergic cancers ninja so and it's sort of weird to you run into problems with you know that serves new languages just society at the learned however there is a really exciting from and so
I just take it to the end you will know what's the worst thing you can do with JavaScript in my i
database and I think it's that's all so this is doing is I'm just passing an arbitrary job scripts it is compact avowing and then immediately exit and so instead of just have a look at this is a really exciting because and subject heading sequence action active sequel and gesture injection together in 1 hand and throw a serious
somewhere users which induces a 1st year just returning the date of when I made this slide so when you take the structural large number and try to string which happens to be the word transcriptome-based 36 and I take my data so actually something that sort of useful is taken my data point the name out splitting it on each character sorting and doing so this is actually a sort of showing off how you can if you just need something real quick to you do some manipulation of your data and you know jobs for a better than sequel which I do on you can just do that and so you put back
into our around coming from Ruby and then applying it to other languages all of that
work on that and should be transparent to me as an application developer
i it's important that we start working from both and so this is a list of the stuff and impose stress is great in exposing more powerful stress in a nice way that I can then build up libraries from Ruby or other languages Python Perl and you bring both of them up and from both ends and so it is an example of a project that I have is taking this Aculeate Jason documents and putting it back and active records is an active record I made a product class that has the right be a primary key is an integer it has a data column which is just and then sometimes it's so and so
the data in Ruby it just shows up as a hash dictionary and so of course consider the 3 I just put nested information there is my native language and then my library also the serializer that to Jason and deserialized back for me and so I can then say that and and you would and that's that's a very nice way that that's in a really easy to implement the summarisation distillation on but the real interesting thing is when you start wanting to query and so I just made up of 3 products here each with cost from 1 to 30 on and so on borrowing from the H store their annotation I decided that my adjacent select is going to be that the arrow for adjacent and sample at coarser than 10 the tricky thing here is sort of the rough edges is that because I want to do with telephone number I have to have my my library spot to realize that and then change the query to cast a generic are 1 of the interesting synergies on is that it doesn't have features it only has 1 numeric and so on so I can't really do away with casting it to an end because it made it baby for both or you know exponential patients or whatever so we have to fall back on the way to the American on number tree but so certain approach concept of works I can deal with that
and once once a sort of you usable and move on and start building languages for other languages in Python closure some of these other ones so that everyone can use this you put together function package of useful PLGA function so that you don't have to know about them and go seek them out in 1 of the things that are sort of being inside a lot about function costs because the adjacent side of this monstrous function that posters was rechecking more frequent than it had to until I bumped up the function cost a lot of so it
turns closing what we have now this from the documents that developers really love but having an in world class database it's been around this fast is fantastic which is just off on and there's a lot of interesting possibilities and promises were having the data type and allowing an appeal language that is really suited together like that they're design together they work together and the impedance there between using that this just so low that it makes it just of joint work with but and
more importantly there for the posters expanding out into you know the mind share of application of this is this is another reason to get people into using advanced database features are so we all these organs are 1 of the the selling points is that the database agnostic which isn't really a selling point for you when you are making your application it's a selling point for them to get as many customers as they need as they can have on the users and its but once you build the application you're not really going to change of its super expensive super painful change so you're going to want to pick a database would be getting the product of change and so the database and NASA system of an oral and doesn't matter for you and so that people so I go I don't want I want to keep the portable and when he's advanced features but that's starting to change our especially with the things like that exposing the full-text search to people exposing geolocation and now each store and Cuvier QVH ruby Ruby developers and some focus from other languages from what I can tell are starting to to take advantage of these features which is this fantastic
and another thing that is interesting is not you can't have 1 language all way from the browser to their application to to the database you can start playing a little bit looser with where your computations are done and it's easier to move your code from 1 to the other is it makes sense which is exciting but you can always be better yet and so I just wish list of things that you can take a millionaire but if people start using this so I'm super and superheavy which is detected if people use it then we can work on the door and in making the storage better like the keys are you not repeating them in such making it more efficient look up but if if no 1 using it then it's good that the time was spent a-priori and luminary parsing if we can use some of storage the J is the 1st Jason in a different format so that the functions and after reparse adjacent each time so I hope that of the 2 detectors that can be done but that would speed things up considerably
and the general Jason next year from that and just or a function class that was like I I did not know about that functions can of course you can change that until I make my colleague Dan just pop the function function like I I assume the post escaped notice that this function is very expensive and bump up and maybe the initially process would be phenomena like if you were speaking Jason if I could put some of my queries to unmarried slaves read only read slaves and it's because I I've crafted and I know that it's going to be what my client wants you can skip all my whole application here like this was something that was able to catch and it was really great just because I made my view and a consensus but
that's that's all I have thank you