|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
Как сделать Primary Key на classname + Number в этой задаче? - есть один базовый класс Base, у него есть свойство Number - все остальные классы произведены от базового, Number уникален для каждого конечного класса, таким образом (classname,Number) уникален для таблицы Base Служебное поле x__classname я так понимаю нельзя использовать ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 11:39 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
Можно сделать вычисляемое поле и на него навесить индекс. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 14:04 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
Я тут один момент не догоняю, который возможно делает мой вопрос бесмысленным: если классы B и С произведены от класса A, и я делаю 'select * from C', каким образом каше находит все объекты типа C? У него же нет индекса по classname. Он, что перебирает все A и откидывает все не-С? Но это же супер как неэффективно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 14:49 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo, А план запроса не пробовал смотреть? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 15:23 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
Вообще создание Extent индекса для каждого подкласса должно решать проблему перебора всех объектов при поиске по подклассам. Либо делать свое хранение в каждом подклассе. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 15:57 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
а, да, это я ступил. Конечно в Data-глобале классы идут как под-глобали. Тогда обратно к моему вопросу, уточню его: как сделать IdKey таким? Index key On (classname,Number) [ IdKey, PrimaryKey, Unique ]; ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 16:02 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alataloа, да, это я ступил. Конечно в Data-глобале классы идут как под-глобали. Тогда обратно к моему вопросу, уточню его: как сделать IdKey таким? Index key On (classname,Number) [ IdKey, PrimaryKey, Unique ];И думаешь, этот индекс автоматически начнет использоваться? Почему? Напиши пример запроса, который думаешь что так оптимизируешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 16:07 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
не, не, речь не про оптимизицию. Все проще, у меня каждый объект идентифицируется парой classname+Number и я хочу иметь возможность сказать ##class(classC).%OpenId("classC||10"), но не знаю как сказать Cache что IdKey это classname+Number ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 20:48 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alataloне, не, речь не про оптимизицию. Все проще, у меня каждый объект идентифицируется парой classname+Number и я хочу иметь возможность сказать ##class(classC).%OpenId("classC||10"), но не знаю как сказать Cache что IdKey это classname+NumberХм, что-то еще запутанней становится. Number уникален в пределах класса, а зачем делать индекс по классу и Number если должно быть достаточно только Number. По индексам типа Unique можно открывать объекты без %OpenId. так генерятся методы IndexName с приставками Open, Exist. Куда нужно передать список значений полей по которым этот индекс. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 22:25 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
Тогда для каждого производного класса нужно отдельно делать свой Number и уникальный индекс по нему. Моя же идея простая как топор - Number определяется один раз в базовом классе и IdKey определяется как classname+Number. Тогда Data глобаль будет выгдядеть как classB Number1 (...record data) Number2 (...record data) classC Number1 (...record data) Number2 (...record data) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2018, 21:54 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo, соглашусь daimor в этой теме, или krvsa в соседней теме - вы делаете что-то не то ( недоговариваете ) Код: vbnet 1. 2. 3. 4. 5. 6.
У %Persistent уже есть метод %Open( oid ), где oid = $lb( id, classname ) - если не подходит, напишите свой ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2018, 16:31 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, неа, так select по baseA не сделать ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2018, 11:13 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo, тут такое дело... Наследование это же из ООП, мол, классB ( наследник ) такой же как классA ( родитель ), но поведение другое, так? А у нас тут ООП с хранением - хранится состояние ( значения свойств ), а не поведение. Также следует помнить, что это СУБД, что предполагает обработку множеств записей для множества пользователей. Объектный доступ имеет свою цену ( память, скорость ), что рано или поздно, подтолкнет вас к необходимости все чаще использовать класс-методы ( хранимые процедуры ). А им, кроме идентификаторов, мало что нужно. И в конце этого длинного пути, вы начнете предпочитать простые схемы хранения - таблицы, которые будете обрабатывать разным набором функций ( класс-методы, хранимки ). Конечно, все эти предпочтения зависят от ваших обстоятельств, но вы их не раскрываете. Возвращаясь к вашему вопросу: 1. C одинаковым интерфейсом вроде разобрались - абстрактный класс 2. С общим списком - в базовом классе можно написать ( или генерировать ) запрос объединяющим строки наследников Код: plsql 1. 2. 3. 4. 5.
и потом Код: vbnet 1.
3. Уникальность номера между всеми экземплярами наследников проверять в момент сохранения - метод, создающий и использующий идексноподобную глобаль, вам в помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2018, 13:53 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
4. И чтоб совсем соответствовать, запрос из п.2 объявить как view ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2018, 13:56 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
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.09.2018, 22:34 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo, x__classname - служебное поле, с информацией о цепочке наследования. Вы не можете указать это поле при описании индекса. Если вам нужна определенная структура глобали, используйте другие схемы хранения ( Cache SQL Storage, Custom Storage ) вместо дефолтной ( Cache Storage ) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 01:03 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >x__classname - служебное поле, с информацией о цепочке наследования. Вы не можете указать это поле при описании индекса. Спасибо, Кеп :) >Если вам нужна определенная структура глобали... Cамое важное здесь не структура глобали, а чтобы Каше сам знал что в первом индексе хранится classname и мог бы его использовать как extent index. Таким образом, запрос "select * from classB order by Number" может был выполнен эффективно без дополнительных индексов. Можно ли этого добиться с помощью альтернативных схем хранения? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 10:42 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo >... x__classname - служебное поле, с информацией о цепочке наследования ... >> Спасибо, Кеп :) "Здесь мало услышать, Здесь вслушаться нужно..." alatalo... а чтобы Каше сам знал что в первом индексе хранится classname и мог бы ... С помощью альтернативных схем хранения можно добиться поведения, которым не обладает схема хранения по умолчанию :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 11:58 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >С помощью альтернативных схем хранения можно добиться поведения, которым не обладает схема хранения по умолчанию :) да ладно?! вот оно решение всем проблемам! :) Можете привести пример такой схемы с Primary Key по classname+Number? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 12:33 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo ... решение всем проблемам ... Не могу разделить ваш оптимизм, ведь их список вы не раскрываете. alatalo Можете привести пример такой схемы с Primary Key по classname+Number? Именно в такой постановке достаточно и стандартной схемы. Но ведь список ваших требований постоянно пополняется... Готовы предоставить полную спецификацию и ответить на уточняющие вопросы? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 13:04 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >Готовы предоставить полную спецификацию запросто: Как сделать Primary Key на classname + Number в этой задаче? - есть один базовый класс classA, у него есть свойство Number - все остальные классы произведены от classA, Number уникален для каждого конечного класса, таким образом пара (classname,Number) уникален для всех объектов classA - classA должен проецироваться как таблица доступная для 'select ... from classA' ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 14:43 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
Number это если я правильно понимаю, ID идентификатор объекта. Зачем вам индекс по classname+Number если вы и так можете открывать объект по ##class(classname).%OpenId(Number) Если Number не Id а еще одно поле, то просто Unique индекс по нему и открывать через него ##class(classname).NumberIndexOpen(Number) А индекс по Classname достигается через Extent индекс, его хватит чтобы sql запросы не перебирали все объекты classA ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 15:42 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo ... запросто ... Неа - вы не описали поле classname. Если предположить, что это поле с именем класса, то решение может быть таким: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 18:41 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefintalatalo ... запросто ... Неа - вы не описали поле classname. Если предположить, что это поле с именем класса, то решение может быть таким: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Только этот индекс не поможет в SQL запросе. Только если не искать фильтровать по классу в where. Но это будет выглядеть несколько нелепо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2018, 21:13 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
DAiMordoublefintпропущено... Неа - вы не описали поле classname. Если предположить, что это поле с именем класса, то решение может быть таким: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Только этот индекс не поможет в SQL запросе. Только если не искать фильтровать по классу в where. Но это будет выглядеть несколько нелепо. Да, именно так. Собственно весь вопрос этой темы в том, можно ли сообщить Каше, что classname (a.k.a x__classname, %%CLASSNAME) хранится в Primary Key. Таким образом, Primary Key будет одновременно и Extent индексом. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 08:27 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
DAiMor, Number уникален только в пределах одного конечного класса. Объект типа Tiger идентифицируется Number-ом, но если какой-то другой объект, Event Log например, ссылается на базовый класс Animal, то одного Number уже не достаточно. >А индекс по Classname достигается через Extent индекс, его хватит чтобы sql запросы не перебирали все объекты classA Да, но Extent индекс нужно будет завести для каждого конечного класса. В чем нет необходимости, если Classname будет содержаться в Primary Key ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 09:03 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
DAiMor ... Только этот индекс не поможет в SQL запросе ... Так аlatalo и не просил этого, в его спецификации таких требований нет alatalo ... что classname (a.k.a x__classname, %%CLASSNAME) ... Третий раз повторяю, обратите наконец внимание: classname '= x__classname !!! classname - имя текущего класса , например "alatalo.baseB" x__classname - ЦЕПОЧКА НАСЛЕДОВАНИЯ , например "~alatalo.baseA~alatalo.baseB~", служебное поле Cache, используется в системном методе %IsA ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:20 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alataloДа, именно так. Собственно весь вопрос этой темы в том, можно ли сообщить Каше, что classname (a.k.a x__classname, %%CLASSNAME) хранится в Primary Key. Таким образом, Primary Key будет одновременно и Extent индексом.Такое не получится сделать, да и смысл так делать пока все равно не ясен. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:04 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >Третий раз повторяю... Честно сказать, вы могли бы и в превый раз этого не говорить. Мы не собираемся писать то, что я здесь называю classname, в Primary Index сами. Речь в этой теме про то, каким образом (и возможно ли это в принципе), сообщить Каше, что та "ЦЕПОЧКА НАСЛЕДОВАНИЯ", которую он подефолту пишет здесь: Storage Default { <Value name="1"> <Value>%%CLASSNAME</Value> ... находится в первом сабскрипте Primary Index. Если это возможно, то 'select * from classB' может обойтись без перебора всей таблицы даже без Extent индекса ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:11 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
DAiMor, > да и смысл так делать пока все равно не ясен смотри, у тебя 120 производных класса, зачем заводить 120 Extent индексов, если их роль может выполнить Primary Key? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:18 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo ... могли бы и в превый раз этого не говорить... 4. Цепочка наследования - служебное поле. Т.е предназначено и используется производителем СУБД в его собственных целях ( ..%IsA ), невидимое для большиства подсистем. Его нельзя указать в качестве свойства при определении индекса. :) alatalo %%CLASSNAME ...находится в первом сабскрипте ... Нет, %%CLASSNAME находится в первой позиции $lb(). Хранение по умолчанию ( Cache Storage ) хранит данные в формате ^package.classD(ID)=$lb(%%CLASNAME, props...). Соответственно, реализация вашей идеи приведет к полному сканированию глобали. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 22:21 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >...Его нельзя указать в качестве свойства при определении индекса очень возможно что нельзя, но я не вижу принципиальных препятсвий почему "служебное поле предназначенное и используемое производителем СУБД в его собственных целях ( ..%IsA ), невидимое для большиства подсистем" может использоваться при определении хранения (%%CLASSNAME), но не может использоваться в индексе: его значение не меняется и известно на момент первой записи в базу. >Нет, %%CLASSNAME находится в первой позиции $lb(). вы меня неправильно поняли: он там находится по умолчанию, но я хочу его в первый сабскрипт индекса >Соответственно, реализация вашей идеи приведет к полному сканированию глобали в каком сценарии? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2018, 10:54 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo но я не вижу принципиальных препятствий Навскидку - совместимость и универсальность. alatalo но я хочу его в первый сабскрипт индекса Если вам нужно другое поведение, то вы или заказываете его у производителя , или реализуете самостоятельно с помощью предоставленных производителем возможностей - собственные поля, индексы или альтернативные схемы хранения alataloв каком сценарии? В сценарии со схемой хранения, когда цепочка наследования ( 5. которая не эквивалентна имени класса ) находится в первом ключе или в первой позиции глобали ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2018, 16:25 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >Навскидку - совместимость и универсальность. очень вероятно, что какие-нибудь фундаментальные проблемы с этим действительное есть, но точно не с совместимостью и универсальностью, поскольку возможность писать classname еще и в индекс помимо его обычного места ни на что из перечисленного не влияет. Ровно тоже, что и с возможностью хранить в индексе копии обычных полей. >Если вам нужно другое поведение, то вы или заказываете его у производителя, или реализуете самостоятельно с помощью предоставленных производителем возможностей да ну?! еще один совершенно бесценный совет :) >В сценарии со схемой хранения, когда цепочка наследования ( 5. которая не эквивалентна имени класса ) находится в первом ключе или в первой позиции глобали в каком сценарии (поиск объекта, чтение его полей etc) копия classname в индексе приведет к какому-либо дополнительному "сканированию глобали"? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2018, 18:32 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo возможность писать classname еще и в индекс помимо его обычного места, ни на что из перечисленного не влияет 6. classname не тоже самое, что и %%CLASSNAME Предполагаемую глубину наследования вы не оговаривали. Можете дать свою оценку размера строки ( цепочки наследования ), которую надо поместить как в индекс, так и в данные? alatalo да ну?! Не благодарите. Наносить добро, причинять пользу :) Так какой путь выбираете - самостоятельно или в WRC?alatalo в каком сценарии копия classname в индексе приведет к какому-либо дополнительному "сканированию глобали"?7. %%CLASSNAME сборная строка с именами классов, т.е промежуточная информация, которую еще нужно обработать. Поэтому в любом, в котором будет необходимость использовать такой индекс ( за исключением, пожалуй, запроса "найди все id, с такой же цепочкой наследования" ) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2018, 02:18 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >classname не тоже самое, что и %%CLASSNAME в этой теме classname=%%CLASSNAME=цепочка наследования >Можете дать свою оценку размера строки ( цепочки наследования ), которую надо поместить как в индекс, так и в данные? нет здесь никакой проблемы: если помещается в $lb(%%CLASSNAME, ...) то поместится и в индекс >Так какой путь выбираете - самостоятельно или в WRC? вне темы > запроса "найди все id, с такой же цепочкой наследования" это единственный вид запроса, который меня интересует. Но даже если нужно искать инстансы промежуточного класса, этот индекс можно использоваться не менее эффективно ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2018, 08:04 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo ... в этой теме classname=%%CLASSNAME=цепочка наследования ... давайте тогда называть его classeslist, что бы все таки отличать.alatalo нет здесь никакой проблемы: если помещается в $lb(%%CLASSNAME, ...) то поместится и в индекс Уверены? alatalo Но даже если нужно искать инстансы промежуточного класса, этот индекс можно использоваться не менее эффективно Приведете пример кода для function( classeslist, classname ){}? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2018, 09:25 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >давайте тогда называть его classeslist, что бы все таки отличать в этой теме я назыаю его classname >Уверены? Если вы можете записать ^a=$lb(classname, ...), то в чем проблема записать ^b=classname? >Приведете пример кода для function( classeslist, classname ){}? classnamePrev=classname-1 ; условно, формируем предыдущее значение classname перебираем индекс ордером начиная с classnamePrev пока строка начинается с classname ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2018, 10:02 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo ... в чем проблема записать ^b=classname? ... alatalo ... но я хочу его в первый сабскрипт индекса ... ??? Приведите, пожалуйста, пример того, как вашему мнению, должна выглядеть индексная глобаль? alatalo перебираем индекс ордером начиная с classnamePrev пока строка начинается с classname alatalo ... Но даже если нужно искать инстансы промежуточного класса ... не менее эффективно ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2018, 10:57 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
doublefint, >Приведите, пожалуйста, пример того, как вашему мнению, должна выглядеть индексная глобаль? как уже многократно повторялось: ^data(classname,number)=data ; $lb(classname,...) >?? да, первым ордером попадаем сразу на первый промежуточный класс. Последущие перебираем до тех пор, пока classname начинается с искомой строки. Минимальные издержки, даже не учитывая, что в реальной системе очень ограниченное число классов ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 15:18 |
|
Индекс на x__classname
|
|||
---|---|---|---|
#18+
alatalo, classname еще и в индекс Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 16:53 |
|
|
start [/forum/topic.php?all=1&fid=39&tid=1556239]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 284ms |
total: | 430ms |
0 / 0 |