One True Lookup Table (OTLT)
A description of a common design anti-pattern, where lookup tables are combined into a single table.
oracle miscconfigurationintermediate
by OracleDba
10 views
A description of a common design anti-pattern, where lookup tables are combined into a single table.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
-- DROP TABLE order_types PURGE;
CREATE TABLE order_types (
order_type_id NUMBER NOT NULL,
order_type_code VARCHAR2(10) NOT NULL,
order_type_desc VARCHAR2(100) NOT NULL,
CONSTRAINT order_types_pk PRIMARY KEY (id),
CONSTRAINT order_types_uk UNIQUE (code)
);
-- DROP TABLE order_statuses PURGE;
CREATE TABLE order_statuses (
order_status_id NUMBER NOT NULL,
order_status_code VARCHAR2(10) NOT NULL,
order_status_desc VARCHAR2(100) NOT NULL,
CONSTRAINT order_statuses_pk PRIMARY KEY (id),
CONSTRAINT order_statuses_uk UNIQUE (code)
);
-- DROP TABLE lookups PURGE;
CREATE TABLE lookups (
lookup_id NUMBER NOT NULL,
lookup_key VARCHAR2(100) NOT NULL,
lookup_value VARCHAR2(500) NOT NULL,
CONSTRAINT lookups_pk PRIMARY KEY (lookup_id),
CONSTRAINT lookups_uk UNIQUE (lookup_key)
);
-- DROP TABLE lookups PURGE;
CREATE TABLE lookups (
lookup_id NUMBER NOT NULL,
lookup_type VARCHAR2(20) NOT NULL,
lookup_key VARCHAR2(100) NOT NULL,
lookup_value VARCHAR2(500) NOT NULL,
CONSTRAINT lookups_pk PRIMARY KEY (lookup_id),
CONSTRAINT lookups_uk UNIQUE (lookup_type, lookup_key)
);
-- DROP TABLE lookups PURGE;
-- DROP TABLE lookup_types PURGE;
CREATE TABLE lookup_types (
lookup_type_id NUMBER NOT NULL,
lookup_type_code VARCHAR2(20) NOT NULL,
lookup_description VARCHAR2(100) NOT NULL,
CONSTRAINT lookup_types_pk PRIMARY KEY (lookup_type_id),
CONSTRAINT lookup_types_uk UNIQUE (lookup_type_code)
);
CREATE TABLE lookups (
lookup_id NUMBER NOT NULL,
lookup_type_code VARCHAR2(20) NOT NULL,
lookup_key VARCHAR2(100) NOT NULL,
lookup_value VARCHAR2(500) NOT NULL,
CONSTRAINT lookups_pk PRIMARY KEY (lookup_id),
CONSTRAINT lookups_uk UNIQUE (lookup_type_code, lookup_key),
CONSTRAINT lookup_lookup_type_fk FOREIGN KEY (lookup_type_code) REFERENCES lookup_types (lookup_type_code)
);
CREATE TABLE lookups (
lookup_id NUMBER NOT NULL,
lookup_type_code VARCHAR2(20) NOT NULL,
lookup_key VARCHAR2(100) NOT NULL,
lookup_string_value VARCHAR2(500),
lookup_short_string_value VARCHAR2(100),
lookup_long_string_value VARCHAR2(4000),
lookup_number_value NUMBER,
lookup_date_value DATE,
lookup_ts_value TIMESTAMP,
CONSTRAINT lookups_pk PRIMARY KEY (lookup_id),
CONSTRAINT lookups_uk UNIQUE (lookup_type_code, lookup_key),
CONSTRAINT lookup_lookup_type_fk FOREIGN KEY (lookup_type_code) REFERENCES lookup_types (lookup_type_code)
);
CREATE TABLE lookups (
lookup_id NUMBER NOT NULL,
lookup_type_code VARCHAR2(20) NOT NULL,
lookup_key VARCHAR2(100) NOT NULL,
lookup_string_value VARCHAR2(500),
lookup_short_string_value VARCHAR2(100),
lookup_long_string_value VARCHAR2(4000),
lookup_number_value NUMBER,
lookup_date_value DATE,
lookup_ts_value TIMESTAMP,
flex_field_1 VARCHAR2(4000),
flex_field_2 VARCHAR2(4000),
flex_field_3 VARCHAR2(4000),
flex_field_4 VARCHAR2(4000),
flex_field_5 VARCHAR2(4000),
CONSTRAINT lookups_pk PRIMARY KEY (lookup_id),
CONSTRAINT lookups_uk UNIQUE (lookup_type_code, lookup_key),
CONSTRAINT lookup_lookup_type_fk FOREIGN KEY (lookup_type_code) REFERENCES lookup_types (lookup_type_code)
);12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
-- ANSI Join
SELECT o.order_id,
o.order_type_code,
ot.lookup_value AS order_type_description,
o.order_status_code,
os.lookup_value AS order_status_description
FROM orders o
JOIN lookups ot
ON o.order_type_code = ot.lookup_key
AND ot.lookup_type_code = 'ORDTYP'
JOIN lookups os
ON o.order_status_code = os.lookup_key
AND os.lookup_type_code = 'ORDSTAT'
-- Non-ANSI Join
SELECT o.order_id,
o.order_type_code,
ot.lookup_value AS order_type_description,
o.order_status_code,
os.lookup_value AS order_status_description
FROM orders o,
lookups ot,
lookups os
WHERE o.order_type_code = ot.lookup_key
AND ot.lookup_type_code = 'ORDTYP'
AND o.order_status_code = os.lookup_key
AND os.lookup_type_code = 'ORDSTAT'
-- ANSI Join
SELECT o.order_id,
ot.order_type_code,
ot.order_type_desc,
os.order_status_code,
os.order_status_desc
FROM orders o
JOIN order_types ot ON o.order_type_id = ot.order_type_id
JOIN order_statuses os ON o.order_status_id = order_status_id
-- Non-ANSI Join
SELECT o.order_id,
ot.order_type_code,
ot.order_type_desc,
os.order_status_code,
os.order_status_desc
FROM orders o,
order_types ot,
order_statuses os
WHERE o.order_type_id = ot.order_type_id
AND o.order_status_id = os.order_status_idPlease to add comments
No comments yet. Be the first to comment!