you can also stripe, eg:

c_1 starts at 1, skip=100
c_2 starts at 2, skip=100
c_$i starts at $i, skip=100 for 3..99

now you have 100x speed/parallelism.  If single regionserver
assignment becomes a problem, use multiple tables.

On Sun, Feb 13, 2011 at 10:12 PM, Lars George <[email protected]> wrote:
> Hi SS,
>
> Some people that do not need strict contiguous IDs also use block
> increments of say 100. Each app server then gets 100 IDs to hand out
> and in case it dies it gets its next assigned 100 IDs and leaves a
> small gap behind. That way you can take the pressure of the counter if
> that is going to be an issue for you. Depends on your insert frequency
> obviously.
>
> Lars
>
> On Sun, Feb 13, 2011 at 7:10 PM, Something Something
> <[email protected]> wrote:
>> Hello,
>>
>> Can you please tell me if this is the proper way of designing a table that's
>> got an auto increment key?  If there's a better way please let me know that
>> as well.
>>
>> After reading the mail archives, I learned that the best way is to use the
>> 'incrementColumnValue' method of HTable.
>>
>> So hypothetically speaking let's say I have to create a "User -> Orders"
>> relationship.  Every time user creates an order we will assign a system
>> generated (auto increment) id as primary key for the order.
>>
>> I am thinking I could do this:
>>
>> 1)  Create a table of Ids for various objects such as "Order".  It will have
>> just a single row with key "1" and column families for various objects.
>>  When it's time to add a new order for a user I can do something like this:
>>
>> HTable tableIds = new HTable("IDs");
>> Get get = new Get(Bytes.toBytes("1"));
>> Result result = tableIds.get(get);
>> long newOrderId = tableIds.incrementColumnValue(result.getRow(), "orders",
>> "orderId", 1);
>>
>> // In future I could use the same table for other objects as follows
>> // long newInvoiceId = tableIds.incrementColumnValue(result.getRow(),
>> "invoices", "invoiceId", 1);
>>
>> 2)  Once the newOrderId is retrieved I can add the info about order to
>> UserOrder table with a key of format:  userId + "*" + newOrderId.  The
>> "info" family of this table will have columns such as "orderAmount" ,
>> "orderDate" etc.
>>
>>
>> As per the documentation, the 'incrementColumnValue' is done in exclusive
>> and serial fashion for each row with a rowlock.  In other words, even in
>> multi-threading environment we are guaranteed to get a unique key per
>> thread, correct?
>>
>> Is this a correct/good design for a table that needs auto increment key?
>>  Please let me know.  Thanks.
>>
>

Reply via email to