On Jan 11, 2009, at 4:30 PM, Sunny Hirai wrote:
First of all, I'd like to say that CouchDB is an amazing project.
I've been
following it for a year and have recently made it a first class
citizen of
my framework.
Anyways, looked for this answer but I couldn't find it.
Let's say I want to create a database that contains the pages in a
wiki.
Each document looks something like this:
{
name: 'about_us',
body: 'This is the about us page'
}
There would be a view on the database where the key is 'name'.
The problem is this:
User A goes to create the 'aboutus' page. We want it to be unique so
we
check if it is in the view. Since it is the first 'about_us' page,
we can't
find it. So we are about to do the insert but haven't started yet.
In the meantime, User B goes to create the 'aboutus' page. We check
the view
and it also isn't there yet because User A has not completed its
insert. We
start to do the insert for User B.
In this case, both User A and User B have begun the insert process.
At the end of the inserts, we will have two documents with the same
name
'aboutus'. Can this be prevented?
I know I can put the 'name' in the '_id' field but I'd like to avoid
it
because I'm abstracting CouchDB and the abstraction does not allow
for it.
Anybody have any solutions other than making 'name' the '_id' field?
-Sunny
this is what i'm doing:
assume your system will be distributed at some point and that global
uniqueness is hard whether in a rdbms or docms. even auto-increment
will fail here. now take the middle path - only writes need to be
unique because, if all of them are, objects can distribute between
nodes freely (since we already know they are unique inside the system).
so just make a rule - you will require a single couchdb instance to be
available to check uniqueness, but any couchdb instance up to perform
reads or writes which do not need to be unique (like comments with a
timestamp or something).
so host a couchdb at something like
http://domain.org/unique
use this to check the uniqueness of fields. for instance, so see if a
name is in the system try to put
{ '_id' : 'name::yourname' }
or something you app will use to decide the uniqueness of a name in
the system. think of it as a global hash you can check for a given key.
to me this seems quite reasonable, it's a nod to the fact that
distributed uniqueness is very hard, while at the same time accepting
that most applications are difficult to build without it. the
constraint on your system will simply be that the uniqueness server
must be up for some operations to succeed, but if you design for it
many will be able to perform many other operations in the face of a
uniqueness server failure.
my 2cts.
a @ http://codeforpeople.com/
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama