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 ) ;
This primary key can have multiple columns, so the FK will also constains multiple columns.
FK are NOT related to UNIQUE INDEX only, they have to be related to a constraints (primary key).
BUT you could do it, it will work and the validation will work too, but your model will be weird.