How can Couchbase deal with dynamic data models?

I have a database app right now using SQLite and FMDB on iOS and Mac which 
lets the user define their own forms to capture whatever kind of data they 
need. I have over 20 different types of data they can capture including 
Text, Notes, Numbers, Audio Recordings, Photos, and relationships to other 
forms.

The way my database is organized is I have a Form object which has an array 
of Field objects. A separate object holds the records. Each record can 
contain one or more value indexed by the field_id. So that way a user can 
decide at any moment to add or remove any field from their form or add as 
many forms that they'd like. It's very flexible.

I'm currently trying to convert over from FMDB / SQLite to CouchbaseLite in 
order to take advantage of your awesome built-in sync mechanism.

My question is, what is the best way to structure my Couch Document given 
the fact that I don't really have a fixed schema from a user's perspective. 
So right now if I want to get a value, I first need to know the form, the 
record, and the field. All those 3 things will give me the value. I 
currently store the values in a separate table indexed by form, record, and 
field. But I find that's very inefficient space and query wise. I was 
hoping that perhaps using CouchbaseLite (and server) would help me to speed 
that up and also have sync support.

Any pointers would be greatly appreciated.

Oh, and I have done some initial work on writing a conversion routine, so 
this is what the JSON looks like for an individual record:

{
"01347DCD-9BE7-41AB-8B46-6588F6421FC8": "Brendan Duddridge",
"12BE6A9B-C5F3-4281-A659-DFA787357FD8": "[email protected]",
"14AF6617-A724-4C77-A84B-F33496D68519": "H0H 0H0",
"22F6AE40-08A8-43E2-BE0E-E9AD86252C3D": "Duddridge",
"2879D926-CE7A-44EC-BD8D-610E6AB505E0": "Brendan",
"5FF7E2CB-700D-49D5-8723-04DDA79B8AD4": "Calgary",
"6C15F333-DCFA-43DC-B0A8-61EC02085C17": "Canada",
"6D82B007-62AB-46A0-B5DE-ACCBBA154CCF": "",
"6DAD7D2D-EFF8-44F5-9322-A95DE3C8E3D2": "Tap Zapp Software Inc.",
"85316537-6802-437D-A6E4-37E311400D09": "(403) 555-1212",
"91EEC079-3DA3-4F45-B8D2-42F9D3591B43": "10",
"BBEA5EF1-1AB9-4CE0-8F11-9C23D0BE7ADE": "123 Tap Zapp Place",
"C4E83E9F-4B4C-4268-9372-A2114E8CB833": "http://www.tapforms.com";,
"DB647E15-9006-4DA5-8E29-F076657FA72C": "AB",
"dateCreated": "2014-09-28 09:04:30 +0000",
"dateModified": "2015-04-11 05:24:33 +0000",
"formId": "715BAC6E-6D39-4B65-9E4E-ECDCD45F591D",
"hasAlarm": "0",
"isFavourite": "0",
"primaryKey": "45A98F59-82CF-45E9-BAF9-ED7B496F960F",
"sortOrder": "0",
"type": "FormEntry"
}

Those UUIDs to the left of the values are the Field UUIDs which are 
actually the Document IDs for the Field type entries in the CouchbaseLite 
database.

What I'm not sure about is how to build views on this kind of data in order 
to efficiently query it. Right now in my current model I have each value in 
its own row in the database. I have an FTS database I use to search 
quickly. It's pretty quick, but the problem is the size of the database is 
enormous for the amount of data stored because for each value I store a 
bunch of other meta data and essentially each value is stored in the main 
table as well as the FTS index table so it can get pretty huge. 

I also need to be able to query by any of the fields in the database in a 
variety of ways. For example, date ranges, numeric ranges, full text 
queries, empty values, not empty values, possibly all combined. An example 
might be, give me a list of movies with a rating > 3 that have the word 
"Terminator" OR "Hunger" in the movie title. Or another might be a search 
for all the records that do or don't have an "I saw this movie" checkbox 
selected.

Any help would be greatly appreciated.

Thanks,

Brendan


-- 
You received this message because you are subscribed to the Google Groups 
"Couchbase Mobile" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/mobile-couchbase/697f71d6-d529-4c43-916d-b12b470c20c4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to