powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Я тут попробую...
22 сообщений из 22, страница 1 из 1
Я тут попробую...
    #36891620
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут попробую создать в Студии копию учебной БД utlsampl из комплекта Oracle.

Вот ddl исходной БД:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE DEPT
       (DEPTNO NUMBER( 2 ) CONSTRAINT PK_DEPT PRIMARY KEY,
	DNAME VARCHAR2( 14 ) ,
	LOC VARCHAR2( 13 ) ) ;

CREATE TABLE EMP
       (EMPNO NUMBER( 4 ) CONSTRAINT PK_EMP PRIMARY KEY,
	ENAME VARCHAR2( 10 ),
	JOB VARCHAR2( 9 ),
	MGR NUMBER( 4 ),
	HIREDATE DATE,
	SAL NUMBER( 7 , 2 ),
	COMM NUMBER( 7 , 2 ),
	DEPTNO NUMBER( 2 ) CONSTRAINT FK_DEPTNO REFERENCES DEPT);

.... дальше идут inserts.

Вот что я сделал на 'Студии':
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Class User.dept Extends %Persistent
{

  Property deptno As %Numeric [ Required ];

  Index deptnoIndex On deptno [ Unique ];

  Property dname As %String;

  Property loc As %String;

}



Class User.emp Extends %Persistent
{

  Property empno As %Numeric [ Required ];

  Index empnoIndex On empno [ Unique ];

  Property ename As %String;

  Property job As %String;

  Property mgr As %Numeric;

  Property hiredate As %Date;

  Property sal As %Currency;

  Property deptno As %Numeric;


}

Поправьте где сделал не так. Особенно ссылочный ключик deptno.
И подскажите где сделать лучше или изящнее.

Спасибо.
...
Рейтинг: 0 / 0
Я тут попробую...
    #36891786
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Думаю, примерно так должно было быть:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Class User.dept Extends %Persistent
{

  // В каше айдикей есть по умолчанию - свойство ID. Не стоит его дублировать, думаю.

  Property dname As %String;

  Property loc As %String;

}



Class User.emp Extends %Persistent
{

  Property ename As %String;

  Property job As %String;

  Property mgr As %Numeric;

  Property hiredate As %Date;

  Property sal As %Currency;

  Property dept As User.dept // Объектные свойства лучше именовать "объектно", а не "реляционно"

  Index deptIndex On dept

}

В дальнейшем, запросы могут строиться в т.ч. так:

Код: plaintext
SELECT ID, ename, dept->dname FROM User.emp WHERE dept->loc = 'BlaBla'
...
Рейтинг: 0 / 0
Я тут попробую...
    #36891859
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Поправьте где сделал не так.
Думается словесное описание задачи или проблемы более предпочтительно нежели некий код не содержащий ни одного коментария...
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892022
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Utlsampl шёл без комментариев. Это учебная базёнка из комплекта дистрибутива Oracle. Есть сотрудники Employees(emp) и подразделения Depts(dept). Каждый сотрудник включается в одно подразделение. Кроме того сотрудники выстроены в иерархию по ссылочному ключу на родителя MGR.
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892029
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesov,

Спасибо. Еще вопрос.

Property dept As User.dept

Является-ли эта запись по смыслу ссылкой на объект Dept?

Не было-ли еще более лучшим вариантом создать агрегацию? Что-то вроде "подразделение содержит внутри себя список сотрудников".

dept(1)emp(*)

Если можно, то как? Какой из вариантов правильнее идеологически? Какой оптимальнее с точки зрения производительности?
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892097
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonProperty dept As User.dept

Является-ли эта запись по смыслу ссылкой на объект Dept?
Не совсем так...
Восновном такая конструкция применяется при создании "сложных" свойств типа "адрес" или например "документ"...

maytonНе было-ли еще более лучшим вариантом создать агрегацию? Что-то вроде "подразделение содержит внутри себя список сотрудников".
Для этого применяются связи один ко многим...
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892111
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто на первых страницах "Кирстена...." я видел картинку вроде UML диаграммы, где видно как один класс содержит в себе другой. Вот и вопрошаю. Это просто связность двух таблиц или действительно контейнерность одного объекта в другом?
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892118
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Вы можете использовать отношение (one-many или parent-children), например, так:
пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Class User.dept Extends %Persistent
{

Property dname As %String(MAXLEN =  14 );

Property loc As %String(MAXLEN =  13 );

Relationship emps As User.emp [ Cardinality = many, Inverse = dept ];

}

Class User.emp Extends %Persistent
{

Index deptIndex On dept;

ForeignKey FKdept(dept) References User.dept();

Property ename As %String(MAXLEN =  10 );

Property job As %String(MAXLEN =  9 );

Property mgr As %Numeric;

Property hiredate As %Date;

Property sal As %Currency;

Property comm As %Numeric;

Relationship dept As User.dept [ Cardinality = one, Inverse = emps ];

}

PS: если важно сохранить ограничения для числовых типов, то посмотрите Map SQL datatypes to their Caché equivalents
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892227
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКроме того сотрудники выстроены в иерархию по ссылочному ключу на родителя MGRТогда, наверное, вместо
Код: plaintext
Property mgr As %Numeric;
лучше написать
Код: plaintext
Property mgr As User.Emp;
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892345
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov
Действительно. Я не заметил. Прошу прощения.

maytonПросто на первых страницах "Кирстена...." я видел картинку
вроде UML диаграммы, где видно как один класс содержит в себе другой. Вот
и вопрошаю. Это просто связность двух таблиц или действительно
контейнерность одного объекта в другом?
Важно учитывать некоторые вещи:
1) как данные в том или ином случае хранятся в БД на уровне глобалов;
2) как будет производиться в дальнейшем работа с этими данными.

Объектная Модель Caché

Использование Многомерного Хранения SQL и Объектами
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892371
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну всё. Грузанули меня терминологией. Я как и всякий RDBMS-совец свято верю, что и Cache и любая другая СУБД используют одни и те-же фундаменальные структуры данных типа B+дерева, хеш-таблицы и LRU-списков. Но Cache хвалят за перформанс на некоторых типах задач где есть небольшая денормализация и причём она не нарушает правила проектирования баз Cache а вроде-бы даже органично вписывается. На данном туповатом примере я для себя хотел разобраться в чём-же собака зарыта. И действительно-ли контейнерность связана с денормализацией или это просто синтаксический сахарок.

Вы меня толкнули в чтение глобалов. Ну.. если им нет аналога в класических SQL-парадигмах то мне остаётся пойти читать.
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892461
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам скорее всего и не придётся работать с данными напрямую через глобалы.
Но знание того, как(где) данные таблиц/объектов хранятся в базе, поможет Вам (точнее администратору СУБД) лучше управлять ими.
Например, повысить масштабируемость системы, используя отображение части данных на другие базы.

Прикладному разработчику эти знания помогут, например, при доступе через SQL к свойствам из списка встроенных объектов.
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892642
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Если не сложно, поясните плиз, что в этом случае даст внешний ключ?
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892677
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsamaytonProperty dept As User.dept

Является-ли эта запись по смыслу ссылкой на объект Dept?
Не совсем так...

Нет уж... давайте врать одинаково! ;) По смыслу это означает как раз то, что свойство dept по типу - объект и хранит в себе ссылку на экземпляр оного ;)

Агрегацию - можно. Есть тип отношения "родитель-потомок". Использовать его бессмысленно - потомок норовит со временем отделиться от родителя, обрастая новым поведением и свойствами (прямо как в жизни), а ограничения начального выбора типа отношения этого не разрешают. В нашем случае невозможно будет перевести сотрудника из отдела в отдел.
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892700
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте упростим постановку. Забудем об иерархии сотрудников. Есть просто плоский список emps. Которые входят в depts. Этот листинг будет однозначным?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Class User.dept Extends %Persistent
{

Property dname As %String(MAXLEN =  14 );

Property loc As %String(MAXLEN =  13 );

Relationship emps As User.emp [ Cardinality = many, Inverse = dept ];

}

Class User.emp Extends %Persistent
{

Index deptIndex On dept;

ForeignKey FKdept(dept) References User.dept();

Property ename As %String(MAXLEN =  10 );

Property job As %String(MAXLEN =  9 );

Property mgr As %Numeric;

Property hiredate As %Date;

Property sal As %Currency;

Property comm As %Numeric;

Relationship dept As User.dept [ Cardinality = one, Inverse = emps ];

}

Или всё-таки есть варианты объявления контейнерами dept?
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892713
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я подготовил один очень простой, но наглядный пример того, что важно знать/понимать схему хранения данных класса.

Итак, дан класс с тремя строковыми свойствами.
Задача - создать хотя бы одну запись, с заполненными всеми тремя полями значениями с максимальной длиной. Например, строками, заполненными соответственно символами 'a','b','c'.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Class SqlRu.Test Extends %Persistent
{

Property a As %String(MAXLEN =  20000 );

Property b As %String(MAXLEN =  20000 );

Property c As %String(MAXLEN =  20000 );

}

Пример заполнения для SQL:
Код: plaintext
insert into sqlru.test(a,b,c) values(rpad('a', 20000 ,'a'),rpad('b', 20000 ,'b'),rpad('c', 20000 ,'c'))


kolesov
В данном случае - ничего.
Это скорее была демонстрация того, что если отношения не подходят, то можно использовать внешний ключ для SQL (OnDelete/OnUpdate).
Конечно, стоило бы взять это в комментарий.
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892787
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Ещё вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Class User.dept Extends %Persistent
{

Property dname As %String(MAXLEN =  14 );

Property loc As %String(MAXLEN =  13 );

Property emps As array of User.emp;

//или Property emps As list of User.emp;

}

Class User.emp Extends %Persistent
{

Property ename As %String(MAXLEN =  10 );

Property job As %String(MAXLEN =  9 );

Property mgr As User.emp;

Property hiredate As %Date;

Property sal As %Currency;

Property comm As %Numeric;

}
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892798
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

это вариант. А я сохраню возможность бегать SQL-запросами по связке EMP->DEPT или я лишаюсь этого?
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892822
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonservit,

это вариант. А я сохраню возможность бегать SQL-запросами по связке EMP->DEPT или я лишаюсь этого?

Лишаетесь, однако это Вам вроде бы и не нужно - сами же хотели спрятать emp`ов за интерфейсом dept`а, или я что-то пропустил?

Есть отношение "родитель-потомок" оно прячет сторону "много" более качественно. Черта с два потом концы найдешь ;)
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892846
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе было-ли еще более лучшим вариантом создать агрегацию? Что-то вроде "подразделение содержит внутри себя список сотрудников".

dept(1)emp(*)

Если можно, то как? Какой из вариантов правильнее идеологически? Какой оптимальнее с точки зрения производительности?


Как-то так:

Class User.dept Extends %Persistent
{

Relationship emps As User.emp [ Cardinality = children, Inverse = dept ];

}

Class User.emp Extends %SerialObject
{

Relationship dept As User.dept [ Cardinality = parent, Inverse = emps ];

}

Второй класс в данном случае - встраиваемый, по нему, соответственно, вообще нельзя делать запросов ;) во всяком случае, sql-запросов...
Но, в третий раз повторюсь, это будет работать криво. Гораздо "идеологически правильнее", производительнее и надежнее использовать вариант с отношением между хранимыми классами..
...
Рейтинг: 0 / 0
Я тут попробую...
    #36892891
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Сразу оговорюсь, что в примере выше предпочтительней использовать массив, а не список объектов.

В случае с массивом будет три таблицы: dept , emp и dept_emps .
Из таблицы dept_emps Вы можете обращаться к обеим таблицам через "->", например:
Код: plaintext
select dept->dname,emps->comm from dept_emps where emps->ename='test' and dept->loc='a'

Наличие ссылки на самого себя (поле mgr ) в классе User.emp уже не даёт Вам возможности использовать его как встраиваемый класс.

Чем для Вас плох вариант с one-to-many?
...
Рейтинг: 0 / 0
Я тут попробую...
    #36893314
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesovПо смыслу это означает как раз то, что свойство dept по типу - объект и хранит в себе ссылку на экземпляр оного ;)
Это только частный случай... Если класс не персистент (ну или не сводится к оному) - никакого экземпляра небудет. И ссылки соответственно тоже.
Данные будут храниться прямо в экземпляре "главного" класса.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Я тут попробую...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]