powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Индекс на x__classname
25 сообщений из 41, страница 1 из 2
Индекс на x__classname
    #39698302
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как сделать Primary Key на classname + Number в этой задаче?

- есть один базовый класс Base, у него есть свойство Number
- все остальные классы произведены от базового, Number уникален для каждого конечного класса, таким образом (classname,Number) уникален для таблицы Base

Служебное поле x__classname я так понимаю нельзя использовать
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39698483
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать вычисляемое поле и на него навесить индекс.
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39698538
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут один момент не догоняю, который возможно делает мой вопрос бесмысленным:

если классы B и С произведены от класса A, и я делаю 'select * from C', каким образом каше находит все объекты типа C? У него же нет индекса по classname. Он, что перебирает все A и откидывает все не-С? Но это же супер как неэффективно.
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39698569
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alatalo,

А план запроса не пробовал смотреть?
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39698600
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще создание Extent индекса для каждого подкласса должно решать проблему перебора всех объектов при поиске по подклассам.
Либо делать свое хранение в каждом подклассе.
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39698606
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, да, это я ступил. Конечно в Data-глобале классы идут как под-глобали.

Тогда обратно к моему вопросу, уточню его: как сделать IdKey таким?

Index key On (classname,Number) [ IdKey, PrimaryKey, Unique ];
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39698612
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alataloа, да, это я ступил. Конечно в Data-глобале классы идут как под-глобали.

Тогда обратно к моему вопросу, уточню его: как сделать IdKey таким?

Index key On (classname,Number) [ IdKey, PrimaryKey, Unique ];И думаешь, этот индекс автоматически начнет использоваться? Почему?

Напиши пример запроса, который думаешь что так оптимизируешь?
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39698744
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, не, речь не про оптимизицию. Все проще, у меня каждый объект идентифицируется парой classname+Number и я хочу иметь возможность сказать ##class(classC).%OpenId("classC||10"), но не знаю как сказать Cache что IdKey это classname+Number
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39698756
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alataloне, не, речь не про оптимизицию. Все проще, у меня каждый объект идентифицируется парой classname+Number и я хочу иметь возможность сказать ##class(classC).%OpenId("classC||10"), но не знаю как сказать Cache что IdKey это classname+NumberХм, что-то еще запутанней становится. Number уникален в пределах класса, а зачем делать индекс по классу и Number если должно быть достаточно только Number.
По индексам типа Unique можно открывать объекты без %OpenId.
так генерятся методы IndexName с приставками Open, Exist. Куда нужно передать список значений полей по которым этот индекс.
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39699266
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда для каждого производного класса нужно отдельно делать свой Number и уникальный индекс по нему. Моя же идея простая как топор - Number определяется один раз в базовом классе и IdKey определяется как classname+Number. Тогда Data глобаль будет выгдядеть как

classB
Number1 (...record data)
Number2 (...record data)

classC
Number1 (...record data)
Number2 (...record data)
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39701627
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alatalo, соглашусь daimor в этой теме, или krvsa в соседней теме - вы делаете что-то не то ( недоговариваете )
Код: vbnet
1.
2.
3.
4.
5.
6.
Class alatalo.baseA Extends %Persistent [ Abstract ] {
Property number;
Index number On number [ Unique ];
}
Class alatalo.baseB Extends (%Persistent, baseA) {}
Class alatalo.baseC Extends (%Persistent, baseA) {}


У %Persistent уже есть метод %Open( oid ), где oid = $lb( id, classname ) - если не подходит, напишите свой
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39701939
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,

неа, так select по baseA не сделать
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39702650
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alatalo, тут такое дело...

Наследование это же из ООП, мол, классB ( наследник ) такой же как классA ( родитель ), но поведение другое, так?
А у нас тут ООП с хранением - хранится состояние ( значения свойств ), а не поведение.
Также следует помнить, что это СУБД, что предполагает обработку множеств записей для множества пользователей.
Объектный доступ имеет свою цену ( память, скорость ), что рано или поздно, подтолкнет вас к необходимости все чаще использовать класс-методы ( хранимые процедуры ). А им, кроме идентификаторов, мало что нужно.
И в конце этого длинного пути, вы начнете предпочитать простые схемы хранения - таблицы, которые будете обрабатывать разным набором функций ( класс-методы, хранимки ).
Конечно, все эти предпочтения зависят от ваших обстоятельств, но вы их не раскрываете.

Возвращаясь к вашему вопросу:
1. C одинаковым интерфейсом вроде разобрались - абстрактный класс
2. С общим списком - в базовом классе можно написать ( или генерировать ) запрос объединяющим строки наследников
Код: plsql
1.
2.
3.
4.
5.
Select oid, number From ( 
 Select $listbuild(id,'pkg.baseB') as oid, number From pkg.baseB 
 Union 
 Select $listbuild(id,'pkg.baseC') as oid, number From pkg.baseC 
) 


и потом
Код: vbnet
1.
s obj = ##class(%Persistent).%Open(oid)


3. Уникальность номера между всеми экземплярами наследников проверять в момент сохранения - метод, создающий и использующий идексноподобную глобаль, вам в помощь
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39702658
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4. И чтоб совсем соответствовать, запрос из п.2 объявить как view
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703230
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,

>... но вы их не раскрываете.
Именно. Вопрос этого топика - можно ли уговорить Каше использовать x__classname в Primary Key, т.е. получить такую структуру Data Global:

^data("classB",1)=...
^data("classB",2)=...
^data("classB",n)=...

^data("classС",1)=...
^data("classС",2)=...
^data("classС",n)=...

Зачем и не лучше ли использовать хранимки отстается за скобками
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703266
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alatalo, x__classname - служебное поле, с информацией о цепочке наследования. Вы не можете указать это поле при описании индекса. Если вам нужна определенная структура глобали, используйте другие схемы хранения ( Cache SQL Storage, Custom Storage ) вместо дефолтной ( Cache Storage )
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703416
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,

>x__classname - служебное поле, с информацией о цепочке наследования. Вы не можете указать это поле при описании индекса.
Спасибо, Кеп :)

>Если вам нужна определенная структура глобали...
Cамое важное здесь не структура глобали, а чтобы Каше сам знал что в первом индексе хранится classname и мог бы его использовать как extent index. Таким образом, запрос "select * from classB order by Number" может был выполнен эффективно без дополнительных индексов. Можно ли этого добиться с помощью альтернативных схем хранения?
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703483
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alatalo
>... x__classname - служебное поле, с информацией о цепочке наследования ...
>> Спасибо, Кеп :)
"Здесь мало услышать, Здесь вслушаться нужно..." alatalo... а чтобы Каше сам знал что в первом индексе хранится classname и мог бы ...
С помощью альтернативных схем хранения можно добиться поведения, которым не обладает схема хранения по умолчанию :)
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703511
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,

>С помощью альтернативных схем хранения можно добиться поведения, которым не обладает схема хранения по умолчанию :)
да ладно?! вот оно решение всем проблемам! :)

Можете привести пример такой схемы с Primary Key по classname+Number?
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703539
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alatalo ... решение всем проблемам ... Не могу разделить ваш оптимизм, ведь их список вы не раскрываете.
alatalo Можете привести пример такой схемы с Primary Key по classname+Number? Именно в такой постановке достаточно и стандартной схемы. Но ведь список ваших требований постоянно пополняется... Готовы предоставить полную спецификацию и ответить на уточняющие вопросы?
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703646
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,

>Готовы предоставить полную спецификацию
запросто:

Как сделать Primary Key на classname + Number в этой задаче?

- есть один базовый класс classA, у него есть свойство Number
- все остальные классы произведены от classA, Number уникален для каждого конечного класса, таким образом пара (classname,Number) уникален для всех объектов classA
- classA должен проецироваться как таблица доступная для 'select ... from classA'
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703705
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Number это если я правильно понимаю, ID идентификатор объекта.
Зачем вам индекс по classname+Number если вы и так можете открывать объект по ##class(classname).%OpenId(Number)

Если Number не Id а еще одно поле, то просто Unique индекс по нему и открывать через него
##class(classname).NumberIndexOpen(Number)

А индекс по Classname достигается через Extent индекс, его хватит чтобы sql запросы не перебирали все объекты classA
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703816
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alatalo ... запросто ... Неа - вы не описали поле classname.
Если предположить, что это поле с именем класса, то решение может быть таким:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Class alatalo.baseA Extends %Persistent {
  Property classname [ InitialExpression = {$classname()}];
  Property Number;
  Index master On (classname, Number) [ PrimaryKey ];
}
Class alatalo.baseB Extends baseA{}
Class alatalo.baseC Extends baseA{}
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703880
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintalatalo ... запросто ... Неа - вы не описали поле classname.
Если предположить, что это поле с именем класса, то решение может быть таким:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Class alatalo.baseA Extends %Persistent {
  Property classname [ InitialExpression = {$classname()}];
  Property Number;
  Index master On (classname, Number) [ PrimaryKey ];
}
Class alatalo.baseB Extends baseA{}
Class alatalo.baseC Extends baseA{}


Только этот индекс не поможет в SQL запросе. Только если не искать фильтровать по классу в where. Но это будет выглядеть несколько нелепо.
...
Рейтинг: 0 / 0
Индекс на x__classname
    #39703967
alatalo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMordoublefintпропущено...
Неа - вы не описали поле classname.
Если предположить, что это поле с именем класса, то решение может быть таким:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Class alatalo.baseA Extends %Persistent {
  Property classname [ InitialExpression = {$classname()}];
  Property Number;
  Index master On (classname, Number) [ PrimaryKey ];
}
Class alatalo.baseB Extends baseA{}
Class alatalo.baseC Extends baseA{}


Только этот индекс не поможет в SQL запросе. Только если не искать фильтровать по классу в where. Но это будет выглядеть несколько нелепо.

Да, именно так. Собственно весь вопрос этой темы в том, можно ли сообщить Каше, что classname (a.k.a x__classname, %%CLASSNAME) хранится в Primary Key. Таким образом, Primary Key будет одновременно и Extent индексом.
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Индекс на x__classname
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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