troubleshooting Question

FOREIGN KEY RELATIONSHIPS

Avatar of dplinnane
dplinnaneFlag for United States of America asked on
Oracle Database
7 Comments3 Solutions3012 ViewsLast Modified:
I have 5 tables of which I have applied pk, fk relationships to. I'm not sure what the rules are. Does a FK have to be related to a PK or can it be related to a UNIQUE index or does the FK have to be related to a composite PK.
I created the following relationships in Erwin and I'm not sure whether it did its own thing or not.
Any advice appreciated.
TABLE NAME
DB_USER
USER_GROUP
PROFILE_PROPERTY
PROFILE_TYPE
PROPERTY

RELATIONSHIPS
DB_USER -> USER_GROUP
USER_GROUP -> PROFILE_PROPERTY
PROFILE_PROPERTY <- PROFILE_TYPE
PROFILE_PROPERTY <- PROPERTY


CREATE TABLESPACE RDIDX01
       
         ;

DROP TABLE PROFILE_PROPERTY CASCADE CONSTRAINTS;

CREATE TABLE PROFILE_PROPERTY (
       PROFILE_PROPERTY_ID  NUMBER(15) NOT NULL,
       USER_GROUP_ID        NUMBER(15) NOT NULL,
       PROFILE_TYPE         VARCHAR2(30) NOT NULL,
       PROPERTY_NM          VARCHAR2(30) NOT NULL,
       PROPERTY_VAL         VARCHAR2(30) NULL,
       ACTIVE_FLG           NUMBER(1) DEFAULT 1 NOT NULL,
       CREATE_DTS           TIMESTAMP(6) NULL
);


CREATE UNIQUE INDEX PROFILE_PROPERTY_PK ON PROFILE_PROPERTY
(
       PROFILE_PROPERTY_ID            ASC,
       PROPERTY_NM                    ASC,
       PROFILE_TYPE                   ASC
)
       PCTFREE 10
       INITRANS 2
       MAXTRANS 255
       TABLESPACE RDIDX01
       STORAGE (
              INITIAL 8M
              NEXT 8M
              MINEXTENTS 1
              MAXEXTENTS 2147483645
              PCTINCREASE 0
       )
;


ALTER TABLE PROFILE_PROPERTY
       ADD  ( PRIMARY KEY (PROFILE_PROPERTY_ID, PROPERTY_NM,
              PROFILE_TYPE)
       USING INDEX
              PCTFREE 10
              INITRANS 2
              MAXTRANS 255
              TABLESPACE RDIDX01
              STORAGE (
                     INITIAL 8M
                     NEXT 8M
                     MINEXTENTS 1
                     MAXEXTENTS 2147483645
                     PCTINCREASE 0
              ) ) ;

CREATE TABLE DB_USER (
       USER_ID              NUMBER(15) NOT NULL,
       USER_FIRST_NM        VARCHAR2(30) NOT NULL,
       USER_LAST_NM         VARCHAR2(30) NOT NULL,
       USER_GROUP_ID        NUMBER(15) NOT NULL,
       ACTIVE_FLG           NUMBER(1) DEFAULT 1 NOT NULL,
       CREATE_DTS           TIMESTAMP(6) NULL,
       UPDATE_DTS           TIMESTAMP(6) NULL
);

CREATE UNIQUE INDEX DB_USER_PK ON DB_USER
(
       USER_ID                        ASC,
       USER_GROUP_ID                  ASC
);


ALTER TABLE DB_USER
       ADD  ( PRIMARY KEY (USER_ID, USER_GROUP_ID) ) ;

CREATE TABLE USER_GROUP (
       USER_GROUP_ID        NUMBER(15) NOT NULL,
       USER_GROUP_NM        VARCHAR2(30) NOT NULL,
       USER_GROUP_DESC      VARCHAR2(250) NULL,
       ACTIVE_FLG           NUMBER(1) DEFAULT 1 NOT NULL,
       CREATE_DTS           TIMESTAMP(6) NULL,
       UPDATE_DTS           TIMESTAMP(6) NULL
);

CREATE UNIQUE INDEX USER_GROUP_ID_PK ON USER_GROUP
(
       USER_GROUP_ID                  ASC
)
       PCTFREE 10
       INITRANS 2
       MAXTRANS 255
       TABLESPACE RDIDX01
       STORAGE (
              INITIAL 8M
              NEXT 8M
              MINEXTENTS 1
              MAXEXTENTS 2147483645
              PCTINCREASE 0
       )
;

ALTER TABLE USER_GROUP
       ADD  ( PRIMARY KEY (USER_GROUP_ID)
       USING INDEX
              PCTFREE 10
              INITRANS 2
              MAXTRANS 255
              TABLESPACE RDIDX01
              STORAGE (
                     INITIAL 8M
                     NEXT 8M
                     MINEXTENTS 1
                     MAXEXTENTS 2147483645
                     PCTINCREASE 0
              ) ) ;

CREATE TABLE PROPERTY (
       PROPERTY_NM          VARCHAR2(50) NOT NULL,
       PROPERTY_DESC        VARCHAR2(250) NULL,
       CREATE_DTS           TIMESTAMP(6) NULL
);

CREATE UNIQUE INDEX PROPERTY_PK ON PROPERTY
(
       PROPERTY_NM                    ASC
)
       PCTFREE 10
       INITRANS 2
       MAXTRANS 255
       TABLESPACE RDIDX01
       STORAGE (
              INITIAL 8M
              NEXT 8M
              MINEXTENTS 1
              MAXEXTENTS 2147483645
              PCTINCREASE 0
       )
;


ALTER TABLE PROPERTY
       ADD  ( PRIMARY KEY (PROPERTY_NM)
       USING INDEX
              PCTFREE 10
              INITRANS 2
              MAXTRANS 255
              TABLESPACE RDIDX01
              STORAGE (
                     INITIAL 8M
                     NEXT 8M
                     MINEXTENTS 1
                     MAXEXTENTS 2147483645
                     PCTINCREASE 0
              ) ) ;

CREATE TABLE PROFILE_TYPE (
       PROFILE_TYPE         VARCHAR2(50) NOT NULL,
       PROFILE_DESC         VARCHAR2(250) NULL,
       CREATE_DTS           TIMESTAMP(6) NULL
);

CREATE UNIQUE INDEX PROFILE_TYPE_PK ON PROFILE_TYPE
(
       PROFILE_TYPE                   ASC
)
       PCTFREE 10
       INITRANS 2
       MAXTRANS 255
       TABLESPACE RDIDX01
       STORAGE (
              INITIAL 8M
              NEXT 8M
              MINEXTENTS 1
              MAXEXTENTS 2147483645
              PCTINCREASE 0
       )
;

ALTER TABLE PROFILE_TYPE
       ADD  ( PRIMARY KEY (PROFILE_TYPE)
       USING INDEX
              PCTFREE 10
              INITRANS 2
              MAXTRANS 255
              TABLESPACE RDIDX01
              STORAGE (
                     INITIAL 8M
                     NEXT 8M
                     MINEXTENTS 1
                     MAXEXTENTS 2147483645
                     PCTINCREASE 0
              ) ) ;

ALTER TABLE PROFILE_PROPERTY
       ADD  ( FOREIGN KEY (PROPERTY_NM)
                             REFERENCES PROPERTY ) ;

ALTER TABLE PROFILE_PROPERTY
       ADD  ( FOREIGN KEY (PROFILE_TYPE)
                             REFERENCES PROFILE_TYPE ) ;

ALTER TABLE PROFILE_PROPERTY
       ADD  ( FOREIGN KEY (USER_GROUP_ID)
                             REFERENCES USER_GROUP ) ;

ALTER TABLE DB_USER
       ADD  ( FOREIGN KEY (USER_GROUP_ID)
                             REFERENCES USER_GROUP ) ;
ASKER CERTIFIED SOLUTION
Mark Geerlings
Database Administrator, retired

Our community of experts have been thoroughly vetted for their expertise and industry experience.

Join our community to see this answer!
Unlock 3 Answers and 7 Comments.
Start Free Trial
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 3 Answers and 7 Comments.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros