![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование естественных ключей допустимо? [D7]
by © (2004-10-12 11:39:00)Есть некий набор таблиц, который описывает реальные таблицы БД. Его можно реализовать в двух вариантах:
1)
таблица META_TABLE
ID TABLE_NAME DESCRIPTION
1 GOODS Товары
таблица META_FIELD
ID META_TABLE_ID FIELD_NAME DESCRIPTION
1 1 ID Ключ
2 1 NAME Наименование
т.е. все сслылки идут через числовое ID
2)
таблица META_TABLE
TABLE_NAME DESCRIPTION
GOODS Товары
таблица META_FIELD
TABLE_NAME FIELD_NAME DESCRIPTION
GOODS ID Ключ
GOODS NAME Наименование
т.е. все сслылки идут через реальное наименование.
Какой вариант предпочтительней? Какие могут быть подводные камни?
Сущности которые используются как естественные ключи заведомо уникальны (имя таблицы БД, связка имени таблицы и имени поля)
Mystic (2004-10-12 12:10:00) [21]1) GOODS так-то нехорошо. Настравивает на то, что поле хранит информацию о нескольких товарах.
2) Предполагается ли в будущем, что наименование товара может измениться? Если да, то по ID однозначно.
3) Если товаров не много (около десяти), и в запросах часто используется фильтрация по товару (обычно это в случае происходит в случае типов товаров), я считаю можно связываться на по ID, а по текстовому коду. Скажем, если предположить, что типов товаров около десяти, часто для каждого товара происходит особый расчет (CASE GOOD_TYPE WHEN ... ), то вполне даже симпатично смотрится структура:
CREATE TABLE GOOD_TYPE
(
ID INT NOT NULL,
CODE CHAR(10) NOT NULL,
NAME VARCHAR(100),
PRIMARY KEY(ID)
)
CREATE TABLE GOOD
(
ID INT NOT NULL,
TYPE CHAR(10),
PRIMARY KEY(ID),
FOREIGN KEY FK_DOOF_TYPE (TYPE) REFERENCES GOOD_TYPE
)
DiamondShark (2004-10-12 11:53:00) [22]Лучше сурогатные ключи.
Нет дублирования информации, проще связки и объединения, компактнее индексы (и селективность у них выше).
Вот кусочек системы метаданных из ASA
SYSTABLE
---------------
table_id
file_id Foreign key references SYS.SYSFILE
count
first_page
last_page
primary_root
creator Foreign key references SYS.SYSUSERPERM. user_id
table_name
table_type
view_def
remarks
replicate
existing_obj
remote_location
remote_objtype
srvid
SYSCOLUMN
---------------
table_id Primary key, foreign key references SYS.SYSTABLE.table_id
column_id Primary key, foreign key references SYS.SYSIXCOL
pkey
domain_id foreign key references SYS.SYSDOMAIN.domain_id
nulls
width
scale
estimate
column_name
remarks
default
check
user_type Foreign key references SYS.SYSUSERTYPE. type_id
format_str
column_type
remote_name
remote_type
Думкин (2004-10-12 11:41:00) [23]http://www.podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/Tenser/10/index.html&file_id=Tenser10