Как использовать таблицы LookUp в Oracle? - PullRequest
5 голосов
/ 01 июня 2011

В моей базе данных во многих таблицах есть поле «Состояние», представляющее состояние, в которое входит данный конкретный объект. Мне сказали, что мы должны использовать таблицы поиска для такого рода вещей, но я не уверен в точноммеханизм.Кто-то может прояснить эти моменты?

  1. Как поддерживается целостность?(т.е. как мне убедиться, что в другие таблицы попадают только значения из таблицы состояний?)

  2. Идет ли имя состояния в другие таблицы или идентификатор состояния изтаблица состояний входит в другие таблицы?

Ответы [ 2 ]

7 голосов
/ 01 июня 2011

1 - Целостность поддерживается с помощью так называемого ограничения FOREIGN KEY. Разумный сценарий может заставить вас сделать эти две таблицы:

Table Name: STATE_CODE
ID    DESCRIPTION
=================
1   Alabama
2   Arkansas
...
50  Wyoming

Table Name: CUSTOMER
=====================
CUST_ID   CUST_NAME   CUST_STATE
100       AAA Company          1  --they are in Alabama!
200       ZZZ Company          50 --they are in Wyoming!

Это отвечает на ваш вопрос # 2: коды состояний, а не полные имена, идут в таблице CUSTOMER в этом примере.

Типичный сценарий для наложения такой структуры на существующий макет будет выглядеть так:

--first, create the lookup table
CREATE TABLE STATE_CODE(
  ID INTEGER NOT NULL
 ,DESCRIPTION VARCHAR(100) NOT NULL
 ,PRIMARY KEY(ID)
);

--now add a reference to the lookup table inside your existing table
--the REFERENCES part will **force** entries
--to have a matching entry in STATE_CODE
ALTER TABLE CUSTOMER ADD STATE_CODE_ID REFERENCES STATE_CODE(ID);

И это отвечает на ваш вопрос # 1: эта команда «REFERENCES» создаст ограничение внешнего ключа, которое заставит все записи в CUSTOMER.STATE_CODE иметь соответствующую запись в таблице STATE_CODE. После настройки, если кто-то попробует это:

INSERT INTO CUSTOMER(CUST_ID,CUST_NAME,CUST_STATE)
VALUES(9000,'Martians',74837483748);

Тогда они получат сообщение об ошибке, и эти ошибочные данные никогда не будут введены (если, конечно, у вас действительно не было состояния с кодом 74837483748).

2 голосов
/ 01 июня 2011

Ответы:

  1. Целостность поддерживается ограничениями внешнего ключа.

    Ограничение внешнего ключа гарантирует, что единственные значения, которые дочерняя таблица допустит в указанном столбце, поступят из указанного столбца родительской таблицы.

  2. Для объединения / различных операций с базой данных рекомендуется использовать наименьший возможный тип данных, поскольку производительность будет выше.

    Например, INT занимает 4 байта, а VARCHAR2 (4+) - больше. С точки зрения производительности, это будет быстрее, если вы используете INT, чем VARCHAR2 (4+). Но вы хотите, чтобы два столбца - один служил первичным ключом, а другой - понятным для человека описанием. Этот подход позволяет изменять описание, не затрагивая существующие записи.

    Это приводит к дискуссии об искусственных / суррогатных и естественных ключах, о том, что лучше всего использовать в качестве первичного ключа (и, в конечном счете, внешнего ключа).

...