|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Пробую создать классы на основе глобалов. Пока структура была простая, все получалось. А теперь чуть сложнее и выходит ошибка Код: plaintext
^book(17,"at",2)="Петров С.А." ^book(17,"at",3)="Сидоров Ю.Н." ^book(17,"av")=0 ^book(17,"nm")="Черный человек" ^book(17,"yr")=1995 ^book(18,"at",1)="Иванова Т.Ю." ^book(18,"at",2)="Ладыгина И.А." ^book(18,"av")=1 ^book(18,"nm")="Энциклопедия кошек" ^book(18,"yr")=2009Класс книг:Class Lena.Book Extends %Persistent [ StorageStrategy = BookStorage ] { Relationship ID As Lena.Authors [ Cardinality = children, Inverse = BkId ]; Index BookId On ID [ IdKey, PrimaryKey, Unique ]; Property Name As %String; Property Year As %String; Property Num As %Integer; }Класс авторов:Class Lena.Authors Extends %Persistent [ StorageStrategy = AuthorStg ] { Relationship BkId As Lena.Book [ Cardinality = parent, Inverse = ID ]; Property Name As %String; Property Cnt As %Integer; Index AuthorId On (BookId, Cnt) [ IdKey, PrimaryKey, Unique ]; }Способ хранения авторов:<Storage name="AuthorStg"> <SequenceNumber>4</SequenceNumber> <SQLMap name="AuthorMap"> <ConditionalWithHostVars></ConditionalWithHostVars> <Data name="Name"/> <Global>^book(BkId,"at")</Global> <PopulationType>full</PopulationType> <Subscript name="1"> <Expression>{Lena.Books.Id}</Expression> </Subscript> <Subscript name="2"> <Expression>{Cnt}</Expression> </Subscript> <Type>data</Type> </SQLMap> <Type>%CacheSQLStorage</Type> </Storage>Помогите разобраться, что я не так делаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 14:41 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Шваров Евгений, по ней и пыталась сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 15:56 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Переделала способ хранения, больше похоже на то, что в примере, но все равно на цикл ругается.<Storage name="AuthorStg"> <SequenceNumber>4</SequenceNumber> <SQLMap name="AuthorMap"> <ConditionalWithHostVars></ConditionalWithHostVars> <Data name="Name"/> <Global>^book</Global> <PopulationType>full</PopulationType> <Subscript name="1"> <Expression>{Lena.Books.Id}</Expression> </Subscript> <Subscript name="2"> <Expression>"at"</Expression> </Subscript> <Subscript name="3"> <Expression>{Cnt}</Expression> </Subscript> <Type>data</Type> </SQLMap> <Type>%CacheSQLStorage</Type> </Storage> ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 16:05 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Midnight_girl, Эта ошибка не из-за Storage. Какое отношение между Book и Authors? Одной книге соответствует много авторов и каждому автору соответствует одна книга? Странно, что в классе Book, свойство ID — коллекция авторов, является IdKey. Может быть, вам нужно создать отдельное свойство для списка авторов?:Relationship Authors As Lena.Authors [ Cardinality = children, Inverse = BkId ]; Index BookId On ID [ IdKey, PrimaryKey, Unique ]; ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 16:21 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Спасибо. Александр КобловКакое отношение между Book и Authors? Одной книге соответствует много авторов и каждому автору соответствует одна книга? Да, один ко многим отношение. Странно, что в классе Book, свойство ID — коллекция авторов, является IdKey. Может быть, вам нужно создать отдельное свойство для списка авторов?:Relationship Authors As Lena.Authors [ Cardinality = children, Inverse = BkId ]; Index BookId On ID [ IdKey, PrimaryKey, Unique ];Ага. Появилась куча других ошибок. )) После исправления кучи осталось: Код: plaintext 1.
Что-то совсем непонятно, что тут имеется в виду. Классы при этом скомпилировались, но при попытке запроса ругаются, что возникла ошибка при компиляции класса Lena.Book. Может быть, я неправильно поняла смысл отношений... Автор задается ID книги,"at",номером автора. Мне казалось, что отношение должно ссылаться на ID книги. Типа foreign key. А тут оно сослалось вообще на что-то несуществующее. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 16:49 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Midnight_girl , РешениеLena.BookClass Lena.Book Extends %Persistent [ StorageStrategy = BookStg ] { Relationship Authors As Lena.Authors [ Cardinality = children, Inverse = Book ]; Property Name As %String; Property Year As %String; Property Num As %Integer; <Storage name="BookStg"> <ExtentSize>100000</ExtentSize> <SequenceNumber>5</SequenceNumber> <SQLMap name="data"> <Data name="Name"> <Node>"nm"</Node> </Data> <Data name="Num"> <Node>"av"</Node> </Data> <Data name="Year"> <Node>"yr"</Node> </Data> <Global>^book</Global> <Subscript name="1"> <Expression>{ID}</Expression> </Subscript> <Type>data</Type> </SQLMap> <StreamLocation>^Lena.BookS</StreamLocation> <Type>%CacheSQLStorage</Type> </Storage> } { Relationship Book As Lena.Book [ Cardinality = parent, Inverse = Authors ]; Property Name As %String; Property Cnt As %Integer; Index AuthorId On (Book, Cnt) [ IdKey ]; <Storage name="AuthorStg"> <ExtentSize>100000</ExtentSize> <SequenceNumber>5</SequenceNumber> <SQLMap name="data"> <Data name="Name"/> <Global>^book</Global> <Subscript name="1"> <Expression>{Book.ID}</Expression> </Subscript> <Subscript name="2"> <Expression>"at"</Expression> </Subscript> <Subscript name="3"> <Expression>{Cnt}</Expression> </Subscript> <Type>data</Type> </SQLMap> <StreamLocation>^Lena.AuthorsS</StreamLocation> <Type>%CacheSQLStorage</Type> </Storage> } Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
2 Rows(s) Affected statement prepare time: 0.1370s, elapsed execute time: 0.0423s. --------------------------------------------------------------------------- USER>>select * from Lena.Authors 2. select * from Lena.Authors BookIDCntName1717||11Иванов А.П.1717||22Петров С.А.1717||33Сидоров Ю.Н.1818||11Иванова Т.Ю.1818||22Ладыгина И.А. 5 Rows(s) Affected statement prepare time: 0.1219s, elapsed execute time: 0.0004s. --------------------------------------------------------------------------- Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 16:49 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
servit, Спасибо большое. Буду разбираться, что не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 16:55 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Midnight_girl, надеюсь, что более опытные товарищи ещё расскажут вам о том, что реализовывать отношение 1:M в виде "parent-child" в Cache' не следует никогда . Хуже будет, если этому научит жизнь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 18:24 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Alexey Maslov, Прям таки никогда? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 18:43 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Блок А.Н., про то, почему "нельзя", написано много, в том числе на этом форуме. Вот хороший пример от иностранных коллег . В двух словах: медленный поиск по "child"ам, если "parent"ы хорошо "набиты данными". Если кому-то нужен более подробный пересказ, пишите )) Будет интересно, если Вы напишете, когда "можно", и какие преимущества достигаются при этом перед "one-many". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 19:21 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Alexey Maslov, Например, parent - класс-пустышка, а child-история его изменений. Причем наиболее частым запросом будет "получить состояние объекта на ..." Преимущество - близкое хранение данных одного родителя. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 21:07 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
А вот схему как в стартовом посте я бы точно не рекомендовал. Раздувает глобал неимоверно. Класс на него лепить есть смысл только если данные уже есть и программы с ними работают. И для того, чтобы программы переписать на объекты\sql, а потом изменить структуру. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 06:18 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Блок А.Н. Класс леплю только для того, чтобы поучиться лепить классы. -)) Alexey Maslov А как правильно делать связь 1:M? Или это на уровне глобала надо было другую структуру делать? Заводить отдельный глобал ^authors(Id,BookId)="name"? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 08:16 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Делаю класс выдачи книг. Связь много к многим. Опять на что-то непонятное мне ругается. Код: plaintext
Глобал, класс, хранение:Структура глобала:^lib(№читателя,№книги,датаВыдачи)=срок_$c(31)_датаВозврата ^lib(7,10,63314)="14"_$c(31)_"63389" ^lib(8,10,63389)="14"_$c(31)_"0" ^lib(9,12,63350)="30"_$c(31)_"0" ^lib(10,16,63389)="14"_$c(31)_"0" ^lib(10,19,63383)="16"_$c(31)_"0" { Property Rid As %String; ForeignKey Rdr(Rid) References Lena.Reader(Prkey); Property Bid As %String; ForeignKey Bk(Bid) References Lena.Book(BkInd); Property Dgive As %Date; Property limit As %Integer; Property Dtake As %String; }Хранение:<Storage name="Default"> <Data name="LibDefaultData"> <Value name="1"> <Value>%%CLASSNAME</Value> </Value> <Value name="2"> <Value>Rid</Value> </Value> <Value name="3"> <Value>Bid</Value> </Value> </Data> <DataLocation>^Lena.LibD</DataLocation> <DefaultData>LibDefaultData</DefaultData> <ExtentSize>100000</ExtentSize> <IdLocation>^Lena.LibD</IdLocation> <IndexLocation>^Lena.LibI</IndexLocation> <StreamLocation>^Lena.LibS</StreamLocation> <Type>%Library.CacheStorage</Type> </Storage> <Storage name="LibStrg"> <ExtentSize>100000</ExtentSize> <SequenceNumber>8</SequenceNumber> <SQLMap name="LibMap"> <Data name="Dtake"> <Delimiter>$c(31)</Delimiter> <Piece>2</Piece> </Data> <Data name="limit"> <Delimiter>$c(31)</Delimiter> <Piece>1</Piece> </Data> <Global>^lib</Global> <Subscript name="1"> <Expression>Reader.SSN</Expression> </Subscript> <Subscript name="2"> <Expression>Book.ID</Expression> </Subscript> <Subscript name="3"> <Expression>{Dgive}</Expression> </Subscript> <Type>data</Type> </SQLMap> <StreamLocation>^Lena.LibS</StreamLocation> <Type>%CacheSQLStorage</Type> </Storage>Все вроде бы аналогично авторам делаю:Property Cnt As %Integer; Index AuthorId On (Book, Cnt) [ IdKey ]; <Subscript name="3"> <Expression>{Cnt}</Expression> </Subscript>А тут:Property Dgive As %Date; <Subscript name="3"> <Expression>{Dgive}</Expression> </Subscript>Разница, что здесь индекс не завожу. Если завожу индекс вот так:Index LibId On (Rid, Bid, Dgive) [ IdKey ];Ругается: Код: plaintext
Если определяю RowId<RowIdSpec name="1"> <Field>Rid</Field> </RowIdSpec> <RowIdSpec name="2"> <Field>Bid</Field> </RowIdSpec> <RowIdSpec name="3"> <Field>Dgive</Field> </RowIdSpec>То вот такой ужас Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 09:47 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Alexey Maslov , "Никогда не говори никогда." "Всё хорошо в меру." Пошерстите системные хранимые классы и Вы найдёте множество примеров с использованием отношения parent-children:
... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 10:52 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Midnight_girl , Совет: Один файл проекта (*.PRJ) со всеми классами (*.CLS) и данными (*.GBL) лучше длинной простыни с разрозненным неполным, а потому нерабочим, кодом. К тому же это сильно увеличивает как скорость ответа, так и шансы на само его наличие. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 10:53 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
servit, я, конечно, идиот, но нашла только как экспортировать проект в xml через студию и как экспортировать глобалы в формате *.gof через портал. Это оно или не то? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 12:03 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Спасибо, получилось :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 12:52 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Midnight_girlА как правильно делать связь 1:M?One-many, [ как правило ], удобнее по многим причинам. Главная из них, пожалуй, в том, что при проектировании БД существует тенденция в превращении связей 1:M в M:N (возможно, вы читали об этом у классиков). Если изначально была допущена ошибка, разбить связь One-many на две One-many будет относительно несложно; с Parent-Child перелопачивать придётся намного больше. Midnight_girlИли это на уровне глобала надо было другую структуру делать? Заводить отдельный глобал ^authors(Id,BookId)="name"?У вас ведь тоже M:N :) поэтому лучше сразу, например, так: ^author(aid)=adata ^book(bid)=bdata ^ablink(aid,bid)="" Эта модель всё равно сильно упрощённая, т.к. не отслеживаются различные издания той же книги, переводы на другие языки и пр. Ну и как совершенно справедливо заметил А.Н.Блок, заниматься отображением глобалов в хранимые классы в новых проектах смысла нет, делайте сразу на классах. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 13:05 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Midnight_girl , Замените в Lena.Lib<Subscript name="1"> <Expression>Reader.SSN</Expression> </Subscript> <Subscript name="2"> <Expression>Book.ID</Expression> </Subscript> <Subscript name="3"> <Expression>Dgive</Expression> </Subscript>на<Subscript name="1"> <Expression>{Rid}</Expression> </Subscript> <Subscript name="2"> <Expression>{Bid}</Expression> </Subscript> <Subscript name="3"> <Expression>{Dgive}</Expression> </Subscript>Там же удалите лишнюю схему хранения Default. Ещё можете добавить SqlRowIdPrivate в Lena.Book. PS: Index BkInd On ID [ IdKey, PrimaryKey, Unique ]; //Unique здесь излишен . ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 14:48 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
servit Спасибо огромное! Заработало! =)) Alexey Maslov меня на новой работе пока заставляют работать в терминале (учусь), просто наткнулась на статью на хабре про работу с глобалами через sql и решила попробовать. Раньше же oracle dba была -)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 15:24 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Midnight_girl... меня на новой работе пока заставляют работать в терминале...Жёстко, но может и правильно, ибо "все великие дела творятся в командной строке". Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 16:43 |
|
Из глобалов в sql
|
|||
---|---|---|---|
#18+
Здесь: чем отличается Один-ко-Многим и Родитель-Потомок... http://lusindane.at.tut.by/files/object09.html До сих пор в Cache, как и в других системах хранения и обработки данных, связи между типами сущностей не поддерживаются. Связи моделируются с помощью свойств, что принцпиально неверно. Впрочем, то же самое делают и разработчики, использующие реляционные СХОД, в своих многочисленных "фреймворках"))... В последнем, который я видел, используется даже понятие "навигируемое свойство")) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2014, 16:38 |
|
|
start [/forum/topic.php?fid=39&msg=38703323&tid=1556520]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 268ms |
total: | 406ms |
0 / 0 |