Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
Как сделать Primary Key на classname + Number в этой задаче?

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

Служебное поле x__classname я так понимаю нельзя использовать
5 сен 18, 11:39    [21665297]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2583
Можно сделать вычисляемое поле и на него навесить индекс.
5 сен 18, 14:04    [21665681]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
Я тут один момент не догоняю, который возможно делает мой вопрос бесмысленным:

если классы B и С произведены от класса A, и я делаю 'select * from C', каким образом каше находит все объекты типа C? У него же нет индекса по classname. Он, что перебирает все A и откидывает все не-С? Но это же супер как неэффективно.
5 сен 18, 14:49    [21665773]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2583
alatalo,

А план запроса не пробовал смотреть?
5 сен 18, 15:23    [21665842]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2583
Вообще создание Extent индекса для каждого подкласса должно решать проблему перебора всех объектов при поиске по подклассам.
Либо делать свое хранение в каждом подклассе.
5 сен 18, 15:57    [21665911]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
а, да, это я ступил. Конечно в Data-глобале классы идут как под-глобали.

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

Index key On (classname,Number) [ IdKey, PrimaryKey, Unique ];
5 сен 18, 16:02    [21665921]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2583
alatalo
а, да, это я ступил. Конечно в Data-глобале классы идут как под-глобали.

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

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

Напиши пример запроса, который думаешь что так оптимизируешь?
5 сен 18, 16:07    [21665938]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
не, не, речь не про оптимизицию. Все проще, у меня каждый объект идентифицируется парой classname+Number и я хочу иметь возможность сказать ##class(classC).%OpenId("classC||10"), но не знаю как сказать Cache что IdKey это classname+Number
5 сен 18, 20:48    [21666258]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2583
alatalo
не, не, речь не про оптимизицию. Все проще, у меня каждый объект идентифицируется парой classname+Number и я хочу иметь возможность сказать ##class(classC).%OpenId("classC||10"), но не знаю как сказать Cache что IdKey это classname+Number
Хм, что-то еще запутанней становится. Number уникален в пределах класса, а зачем делать индекс по классу и Number если должно быть достаточно только Number.
По индексам типа Unique можно открывать объекты без %OpenId.
так генерятся методы IndexName с приставками Open, Exist. Куда нужно передать список значений полей по которым этот индекс.
5 сен 18, 22:25    [21666321]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
Тогда для каждого производного класса нужно отдельно делать свой Number и уникальный индекс по нему. Моя же идея простая как топор - Number определяется один раз в базовом классе и IdKey определяется как classname+Number. Тогда Data глобаль будет выгдядеть как

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

classC
Number1 (...record data)
Number2 (...record data)
6 сен 18, 21:54    [21667514]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 928
alatalo, соглашусь daimor в этой теме, или krvsa в соседней теме - вы делаете что-то не то ( недоговариваете )
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 ) - если не подходит, напишите свой
12 сен 18, 16:31    [21672458]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
doublefint,

неа, так select по baseA не сделать
13 сен 18, 11:13    [21673240]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 928
alatalo, тут такое дело...

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

Возвращаясь к вашему вопросу:
1. C одинаковым интерфейсом вроде разобрались - абстрактный класс
2. С общим списком - в базовом классе можно написать ( или генерировать ) запрос объединяющим строки наследников
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 
) 

и потом
s obj = ##class(%Persistent).%Open(oid)

3. Уникальность номера между всеми экземплярами наследников проверять в момент сохранения - метод, создающий и использующий идексноподобную глобаль, вам в помощь
14 сен 18, 13:53    [21674713]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 928
4. И чтоб совсем соответствовать, запрос из п.2 объявить как view
14 сен 18, 13:56    [21674722]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
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)=...

Зачем и не лучше ли использовать хранимки отстается за скобками
16 сен 18, 22:34    [21676197]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 928
alatalo, x__classname - служебное поле, с информацией о цепочке наследования. Вы не можете указать это поле при описании индекса. Если вам нужна определенная структура глобали, используйте другие схемы хранения ( Cache SQL Storage, Custom Storage ) вместо дефолтной ( Cache Storage )
17 сен 18, 01:03    [21676250]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
doublefint,

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

>Если вам нужна определенная структура глобали...
Cамое важное здесь не структура глобали, а чтобы Каше сам знал что в первом индексе хранится classname и мог бы его использовать как extent index. Таким образом, запрос "select * from classB order by Number" может был выполнен эффективно без дополнительных индексов. Можно ли этого добиться с помощью альтернативных схем хранения?
17 сен 18, 10:42    [21676457]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 928
alatalo

>... x__classname - служебное поле, с информацией о цепочке наследования ...
>> Спасибо, Кеп :)
"Здесь мало услышать, Здесь вслушаться нужно..."
alatalo
... а чтобы Каше сам знал что в первом индексе хранится classname и мог бы ...
С помощью альтернативных схем хранения можно добиться поведения, которым не обладает схема хранения по умолчанию :)
17 сен 18, 11:58    [21676611]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
doublefint,

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

Можете привести пример такой схемы с Primary Key по classname+Number?
17 сен 18, 12:33    [21676699]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 928
alatalo
... решение всем проблемам ...
Не могу разделить ваш оптимизм, ведь их список вы не раскрываете.
alatalo
Можете привести пример такой схемы с Primary Key по classname+Number?
Именно в такой постановке достаточно и стандартной схемы. Но ведь список ваших требований постоянно пополняется... Готовы предоставить полную спецификацию и ответить на уточняющие вопросы?
17 сен 18, 13:04    [21676759]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
doublefint,

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

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

- есть один базовый класс classA, у него есть свойство Number
- все остальные классы произведены от classA, Number уникален для каждого конечного класса, таким образом пара (classname,Number) уникален для всех объектов classA
- classA должен проецироваться как таблица доступная для 'select ... from classA'
17 сен 18, 14:43    [21676953]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2583
Number это если я правильно понимаю, ID идентификатор объекта.
Зачем вам индекс по classname+Number если вы и так можете открывать объект по ##class(classname).%OpenId(Number)

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

А индекс по Classname достигается через Extent индекс, его хватит чтобы sql запросы не перебирали все объекты classA
17 сен 18, 15:42    [21677070]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 928
alatalo
... запросто ...
Неа - вы не описали поле classname.
Если предположить, что это поле с именем класса, то решение может быть таким:
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{}
17 сен 18, 18:41    [21677277]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2583
doublefint
alatalo
... запросто ...
Неа - вы не описали поле classname.
Если предположить, что это поле с именем класса, то решение может быть таким:
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. Но это будет выглядеть несколько нелепо.
17 сен 18, 21:13    [21677405]     Ответить | Цитировать Сообщить модератору
 Re: Индекс на x__classname  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 88
DAiMor
doublefint
пропущено...
Неа - вы не описали поле classname.
Если предположить, что это поле с именем класса, то решение может быть таким:
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 индексом.
18 сен 18, 08:27    [21677605]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить