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

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

Классификаторы и их реализация. [D7, MSSQL]


31512 ©   (2004-10-04 09:04:00) 

Здравствуйте. У меня возникла необходимость ввести в классификаторы в базе данных. Делаю это следующим образом:

create table [OBJECT_CLASSES]//Здесь перечислены все возможные классы
(
ID_CLASS int not null primary key,
CLASS_NAME nvarchar (50) not null default 'Default class',
)

create table [OBJECTS] //Здесь объекты и их принадлежность определённым классам
(
ID_OBJECT int not null,
OBJECT_CLASS int not null references OBJECT_CLASSES (ID_CLASS),
AOBJECT_NAME nvarchar (500),
constraint UPKCL_OBJECTS primary key clustered (ID_OBJECT, OBJECT_CLASS)
)

//Здесь некая таблица, куда могут входить только объекты определённого класса, здесь первого.(Эдакая таблица свойств объекта)
create table [ORGANISATION](
ID_ORGANISATION int not null primary key,
AOBJECT int not null,
AOBJECT_CLASS int not null default 1,
ORGANISATION_ADRESS nvarchar (500),
.
.
//Тра-та-та
.
.
constraint FK_OBJECT_ foreign key (AOBJECT, AOBJECT_CLASS)
  references OBJECTS (ID_OBJECT, OBJECT_CLASS),
check (AOBJECT_CLASS = 1)
)

Несмотря на то, что это работает, вопросы такие возникли:
1. Существует ли встроенный механизм реализации классификаторов?
2. Как сделать так, чтобы поле AOBJECT_CLASS всегда принимало одно значение, ничем не изменяемое (константное поле)?
3. Можно ли вообще избежать применения классификаторов, решая задачу о разделении записей, которые можно вносить в отношения,и которые нельзя.

Спасибо.


31512   (2004-10-04 11:53:00) [1]


> ЮЮ ©   (04.10.04 09:30) [1]

Задача немного другая. Например, в качестве потребителя может быть и организация и частное лицо, которое никак не организация. Вот я и подствлю его из таблицы OBJECTS. А класс уже потом легко определить.


clickmaker   (2004-10-04 10:37:00) [2]

Кстати, в твоем случае можно обойтись и без чека, и без триггера, если написать специальную команду или хранилку для вставки организации. Поле OBJECT_ID д.б. идентити. Что-то типа:

insert into Objects (OBJECT_CLASS, AOBJECT_NAME) values (1, @Orgname)

select @Object_ID = @@identity

insert into Organization (AOBJECT, ORG_ORGANISATION_ADRESS )
values (@Object_ID, 'пр. Мира, 23')


clickmaker   (2004-10-04 10:32:00) [3]


> 31512 ©   (04.10.04 09:04)

constraint UPKCL_OBJECTS primary key clustered (ID_OBJECT, OBJECT_CLASS) - я бы сделал ключ только по ID_OBJECT, а на OBJECT_CLASS повесил бы индекс для ускорения поиска.
Тогда и в этом не было бы необходимости
AOBJECT int not null,
AOBJECT_CLASS int not null default 1,
остался быть только AOBJECT

> 1. Существует ли встроенный механизм реализации классификаторов?

В MSSQL нет

> 2. Как сделать так, чтобы поле AOBJECT_CLASS всегда принимало
> одно значение, ничем не изменяемое (константное поле)?

check или триггер


ЮЮ   (2004-10-04 09:30:00) [4]

>Как сделать так, чтобы поле AOBJECT_CLASS всегда принимало одно значение

Прописать присвоение в триггере

З.Ы. Если выкинуть [OBJECT_CLASSES] и [OBJECTS], и оставить  
create table [ORGANISATION](
ID_ORGANISATION int not null primary key,
ORGANISATION_ADRESS nvarchar (500),
.
//Тра-та-та
.

то в таблице [ORGANISATION] и будут лишь "организации" и ничего другого


Наверх

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