You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-user@jakarta.apache.org by Jean-Philippe Courson <co...@noos.fr> on 2002/08/01 10:13:58 UTC

Re: Modified Proposal for a more efficient Slide Database Design

Hi Ashok,

I've successfully tested your new database scheme with PostgreSQL.

I just had one problem : you forgot to enclose a string with '. Here is 
a patch :

--- J2EEDescriptorsStore2.java.origin    Thu Aug  1 09:56:34 2002
+++ J2EEDescriptorsStore2.java    Thu Aug  1 09:55:59 2002
@@ -1159,7 +1159,7 @@
            
                 theSQL = new StringBuffer("insert into VERSION_HISTORY 
(URI_ID,BRANCH_ID,REVISION_NO) values(");
                 theSQL.append(l_uri).append(", ").append(l_brid);
-                theSQL.append(", 
").append(revisionDescriptor.getRevisionNumber().toString()).append(")");
+                theSQL.append(", 
'").append(revisionDescriptor.getRevisionNumber().toString()).append("')");
                 statement.execute(theSQL.toString());
             }
             long Version_ID = 
this.getVersionID(l_uri,revisionDescriptor.getBranchName(),revisionDescriptor.getRevisionNumber().toString());

I think that this new schema is a good starting point, but tables joins 
are the worst performance killer.
So, when performances are the problem, my opinion is that they should be 
avoid even if it leads to data duplication.

What is your opinion on this ?

You will find next database creation script for PostgreSQL if it could 
help someone.
Indexes on primary keys are automaticly created by PostgreSQL.

Regards

Jp

DROP TABLE URI;
DROP SEQUENCE NEXT_URI_ID;
DROP TABLE OBJECT;
DROP TABLE CHILDREN;
DROP TABLE LINKS;
DROP TABLE LOCKS;
DROP TABLE BRANCH;
DROP SEQUENCE NEXT_BRANCH_ID;
DROP TABLE LABEL;
DROP SEQUENCE NEXT_LABEL_ID;
DROP TABLE VERSION;
DROP TABLE VERSION_HISTORY;
DROP SEQUENCE NEXT_VERSION_HISTORY_ID;
DROP TABLE VERSION_PREDS;
DROP TABLE VERSION_LABELS;
DROP TABLE VERSION_CONTENT;
DROP TABLE PROPERTIES;
DROP TABLE PERMISSIONS;

CREATE SEQUENCE NEXT_URI_ID;
CREATE TABLE URI (
    URI_ID          BIGINT               DEFAULT NEXTVAL('NEXT_URI_ID') 
PRIMARY KEY,
    URI_STRING      VARCHAR(800)         NOT NULL
);

CREATE TABLE OBJECT (
    URI_ID          BIGINT               PRIMARY KEY,
    CLASS_NAME      VARCHAR(255)         NOT NULL,
    FOREIGN KEY (URI_ID) REFERENCES URI
);

CREATE TABLE CHILDREN (
    URI_ID          BIGINT               NOT NULL REFERENCES URI,
    CHILD_URI_ID    BIGINT               NOT NULL REFERENCES URI (URI_ID),
    PRIMARY KEY (URI_ID, CHILD_URI_ID)
);

CREATE TABLE LINKS (
    URI_ID          BIGINT               NOT NULL REFERENCES URI,
    LINK_TO_ID      BIGINT               NOT NULL REFERENCES URI (URI_ID),
    PRIMARY KEY (URI_ID, LINK_TO_ID)
);

CREATE TABLE LOCKS (
    LOCK_ID         BIGINT               PRIMARY KEY,
    OBJECT_ID       BIGINT               NOT NULL REFERENCES URI (URI_ID),
    SUBJECT_ID      BIGINT               NOT NULL REFERENCES URI (URI_ID),
    TYPE_ID         BIGINT               NOT NULL REFERENCES URI (URI_ID),
    EXPIRATION_DATE TIMESTAMP            NOT NULL,
    IS_INHERITABLE  SMALLINT             NOT NULL,
    IS_EXCLUSIVE    SMALLINT             NOT NULL,
    FOREIGN KEY (LOCK_ID) REFERENCES URI (URI_ID)
);

CREATE SEQUENCE NEXT_BRANCH_ID;
CREATE TABLE BRANCH (
    BRANCH_ID       BIGINT               DEFAULT 
NEXTVAL('NEXT_BRANCH_ID') PRIMARY KEY,
    BRANCH_STRING   VARCHAR(255)         NOT NULL
);

CREATE SEQUENCE NEXT_LABEL_ID;
CREATE TABLE LABEL (
    LABEL_ID        BIGINT               DEFAULT 
NEXTVAL('NEXT_LABEL_ID') PRIMARY KEY,
    LABEL_STRING    VARCHAR(255)         NOT NULL
);

CREATE TABLE VERSION (
    URI_ID          BIGINT               PRIMARY KEY,
    IS_VERSIONED    SMALLINT             NOT NULL,
    FOREIGN KEY (URI_ID) REFERENCES URI
);

CREATE SEQUENCE NEXT_VERSION_HISTORY_ID;
CREATE TABLE VERSION_HISTORY (
    VERSION_ID      BIGINT               DEFAULT 
NEXTVAL('NEXT_VERSION_HISTORY_ID') PRIMARY KEY,
    URI_ID          BIGINT               NOT NULL REFERENCES VERSION,
    BRANCH_ID       BIGINT               NOT NULL REFERENCES BRANCH,
    REVISION_NO     VARCHAR(20)                NOT NULL
);
CREATE INDEX VERSION_HISTORY_INDEX ON VERSION_HISTORY (URI_ID, 
BRANCH_ID, REVISION_NO);

CREATE TABLE VERSION_PREDS (
    VERSION_ID      BIGINT        NOT NULL REFERENCES  VERSION_HISTORY,
    PREDECESSOR_ID  BIGINT        NOT NULL REFERENCES  VERSION_HISTORY 
(VERSION_ID),
    PRIMARY KEY (VERSION_ID, PREDECESSOR_ID)
);

CREATE TABLE VERSION_LABELS (
    VERSION_ID        BIGINT        NOT NULL REFERENCES  VERSION_HISTORY,
    LABEL_ID        BIGINT        NOT NULL REFERENCES  LABEL,
    PRIMARY KEY (VERSION_ID, LABEL_ID)
);

CREATE TABLE VERSION_CONTENT (
    VERSION_ID        BIGINT        PRIMARY KEY,
    CONTENT         OID            NOT NULL,
    FOREIGN KEY (VERSION_ID) REFERENCES VERSION_HISTORY
);

CREATE TABLE PROPERTIES (
    VERSION_ID         BIGINT        NOT NULL REFERENCES  
VERSION_HISTORY,   
    PROPERTY_NAMESPACE VARCHAR(50)      NOT NULL,
    PROPERTY_NAME      VARCHAR(50)      NOT NULL,       
    PROPERTY_VALUE     VARCHAR(255)     NOT NULL,
    PROPERTY_TYPE      VARCHAR(50)      NOT NULL,
    IS_PROTECTED       SMALLINT         NOT NULL,
    PRIMARY KEY    (VERSION_ID, PROPERTY_NAMESPACE, PROPERTY_NAME)
);

CREATE TABLE PERMISSIONS (
    OBJECT_ID       BIGINT              NOT NULL REFERENCES URI (URI_ID),
    SUBJECT_ID      BIGINT              NOT NULL REFERENCES URI (URI_ID),
    ACTION_ID       BIGINT              NOT NULL REFERENCES URI (URI_ID),
    VERSION_NO      VARCHAR(20),
    IS_INHERITABLE  SMALLINT            NOT NULL,
    IS_NEGATIVE     SMALLINT            NOT NULL,
    PRIMARY KEY    (OBJECT_ID, SUBJECT_ID, ACTION_ID)
);



--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>