Search Postgresql Archives

Re: uniquely indexing Celko's nested set model

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Oct 19, 2007, at 16:42 , Richard Broersma Jr wrote:

Is it possible to constraint both the LEFT and RIGHT fields of a record to use the same index? I am looking for a way to ensure for all LEFTs and RIGHTs in a table, that is it is impossible for any LEFT or RIGHT to have to same value.

You can define a check constraint to handle this:

CREATE OR REPLACE FUNCTION strict_nested_set_node_check(INTEGER, INTEGER)
RETURNS BOOLEAN
STRICT IMMUTABLE SECURITY DEFINER
LANGUAGE SQL AS $_$
SELECT ((abs($1) < abs($2))
       AND ($2 - $1 - 1) % 2 = 0)
$_$;
COMMENT ON FUNCTION strict_nested_set_node_check(INTEGER, INTEGER) IS
'Convenience function to encapsulate the check conditions for the lower and ' ' upper bounds (often called ''left'' and ''right'') for strict nested set '
'implementations.';

CREATE TABLE nodes
(
    node_id SERIAL PRIMARY KEY
    , node_lower INTEGER NOT NULL
    , node_upper INTEGER NOT NULL
    , UNIQUE (query_plan_id, node_lower)
    , UNIQUE (query_plan_id, node_upper)
    , CHECK (strict_nested_set_node_check(node_lower, node_upper))
);

To actually guarantee that each lower and upper value is only used once, I think you'd need to write a trigger that checks that each value is only used once. I haven't used such trigger when I've used nested sets, however. If you handle your table modifications through functions and test your functions thoroughly, you can be pretty sure that your table updates aren't going to cause any duplication of this time. Then again, maybe I should add the trigger to be on the safe side :)

Michael Glaesemann
grzm seespotcode net



---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux