![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Классификаторы и их реализация. [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] и будут лишь "организации" и ничего другого