Универсальная справочная таблица

Модераторы: kdv, CyberMax

Ответить
Spa_2002
Сообщения: 28
Зарегистрирован: 13 май 2005, 15:47

Универсальная справочная таблица

Сообщение Spa_2002 » 30 авг 2007, 11:59

День добрый.
В приложении используется много выпадающих списков с набором стандартных значений разных параметров. Должна быть возможность расширять набор параметров из программы.Городить для каждого такого списка отдельную таблицу мне кажется слишком расточительно. Делаю такую таблицу

Код: Выделить всё

CREATE TABLE UNISPRAV (
    PAR_ID     INTEGER NOT NULL,
    PAR_VID   VARCHAR(30) NOT NULL,
    PAR_VAL  VARCHAR(500) NOT NULL,
    );
поле PAR_ID - PK автоинкрементное через генератор
PAR_VID - категория (вид) справочных данных
PAR_VAL - собственно справочное значение

и храню в ней данные для всех этих списков. Категории для выборки жестко зашиты в текстах запросов, но набор данных по каждой категории можно расширять. Знаю , что при этом нет однозначной ссылочной целостности в базе, т.к. если связывать через FK другие таблицы с UNISPRAV то эта связь не будет учитывать категорию.
Насколько приемлем такой способ для решения этой задачи?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 30 авг 2007, 12:20

А сделать Unique (PAR_ID, PAR_VID), и референситься из таблиц на него папа не разрешает?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 30 авг 2007, 12:50

Я бы ещё категории в отдельный справочник вынес. Можно прямо в эту же таблицу.
PAR_VID превратится в INT.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 30 авг 2007, 14:05

А зачем ссылочной целостности учитывать категорию?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 30 авг 2007, 14:22

Dimitry Sibiryakov писал(а):А зачем ссылочной целостности учитывать категорию?
Для стройности, системности и понятности :lol: Ну и снижает вероятность ошибок типа сослать код валюты на субсправочник стран :)

Spa_2002
Сообщения: 28
Зарегистрирован: 13 май 2005, 15:47

Сообщение Spa_2002 » 31 авг 2007, 06:52

Спасибо корифеям за внимание к моей теме!

to Merlin:
чтобы референситься на Unique (PAR_ID, PAR_VID) из других таблиц, получается что надо тащить в эти таблицы по дополнительному полю (для хранения PAR_VID) на каждое справочно-зависимое поле. Тогда согласен, будет все жестко.

to WildSery
в вашем предложении вижу выгоду в возможности уменьшения размеров таблицы из-за использования поля INTEGER вместо varchar(...), т.е. название категории может быть достаточно длинным

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 31 авг 2007, 09:54

Ссылаться на категорию по INT, а не по строке, ведь тоже удобнее? ;)

Spa_2002
Сообщения: 28
Зарегистрирован: 13 май 2005, 15:47

Сообщение Spa_2002 » 31 авг 2007, 11:59

Тоже неплохо, но с именем категории запросы читабельнее ИМХО. )

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 31 авг 2007, 12:21

Spa_2002 писал(а):Тоже неплохо, но с именем категории запросы читабельнее ИМХО. )
А приджойнить опять папа не разрешает? Недобрый он у тебя какой-то.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 31 авг 2007, 13:10

чтобы референситься на Unique
запомни - стольбцы, идентифицирующие запись, это не unique а ПЕРВИЧНЫЙ КЛЮЧ, primary key! Unique constraint - это АЛЬТЕРНАТИВНЫЙ, т.е. "второстепенный уникальный ключ". Используется например для столбцов типа "номер паспорта", которые сами по себе должны быть уникальны, но не являются ИДЕНТИФИКАТОРОМ записи.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 31 авг 2007, 13:36

kdv писал(а):
чтобы референситься на Unique
запомни - стольбцы, идентифицирующие запись, это не unique а ПЕРВИЧНЫЙ КЛЮЧ, primary key! Unique constraint - это АЛЬТЕРНАТИВНЫЙ, т.е. "второстепенный уникальный ключ". Используется например для столбцов типа "номер паспорта", которые сами по себе должны быть уникальны, но не являются ИДЕНТИФИКАТОРОМ записи.
И ты запомни - референситься на него можно и иногда нужно :lol: :lol: :lol:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 02 сен 2007, 20:51

И ты запомни - референситься на него можно и иногда нужно
я-то в курсе. просто unique обычно лепят вместо ПК. Есть или тулзы такие, или люди.

Spa_2002
Сообщения: 28
Зарегистрирован: 13 май 2005, 15:47

Сообщение Spa_2002 » 03 сен 2007, 05:52

Ну, от PK мы тоже не отказываемся, это же святое...
поле PAR_ID - PK автоинкрементное через генератор

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 сен 2007, 09:14

не все автоинкрементные столбцы являются первичными ключами :-)

Ответить