Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование естественных ключей допустимо? [D7]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо