Установить для всех атрибутов документа значения вложенного запроса. - PullRequest
0 голосов
/ 21 апреля 2019

В моем ArangoDB я пытаюсь реализовать какое-то наследование. У меня есть родительский документ, который определяет все его дочерние элементы. Итак, все значения одинаковы, за исключением Inheritance-ID.

Таким образом, в данном случае родительский документ имеет значения вроде:

ID: 1
InhID: 0
Name: Doc_1

И его дети выглядят так:

ID: 1
InhID: 1
Name: Doc_1 


ID: 1
InhID: 2
Name: Doc_1 

Поскольку я меняю имя с Doc_1 на что-либо еще в родительском элементе, все его дочерние элементы также будут изменены, то же самое касается новых добавленных атрибутов.

Текущий способ - это ручная запись запроса AQL-Update для каждого атрибута, обновляющего все значения одно за другим, устанавливая его в значения родительского элемента, где идентификатор совпадает, а InhID больше нуля.

Но есть ли более эффективный способ сделать это в одном утверждении? И есть ли что-то вроде триггер-функции, как в обычных базах данных?

1 Ответ

0 голосов
/ 24 апреля 2019

Предположим, у нас есть данные в коллекции test1 с полями: ParentID, InhID, Name, Potatoe

Если я понимаю, что вы пытаетесь сделать, вы могли бы:

Обновите одновременно родителей и детей примерно так:

for t in test1
Filter t.ParentID == 1 
update t WITH { Potatoe: "baked" , Name: "Doc_2"} IN test1 

Обновите сначала родителя, а затем детей (в другое время, я полагаю):

Step1

for t in test1
Filter t.ParentID == 1 AND t.InhID == 0
update t WITH { Potatoe: "baked" , Name: "Doc_2"} IN test1

Шаг 2

let Parent = (for p in test1
    Filter p.ParentID == 1 AND p.InhID == 0
    return p)
for p1 in Parent 
    for Children in test1
    Filter Children.ParentID == p1.ParentID AND Children.InhID > p1.InhID
    update Children WITH {Potatoe: p1.Potatoe, Name: p1.Name} IN test1

С точки зрения триггеров, в Аранго такого нет. Я лично считаю, что это хорошо, потому что триггеры, как правило, вызывают больше проблем, чем они того стоят. Вместо этого я бы построил средний уровень с необходимой логикой, чтобы все внешние программы проходили через средний уровень, а не обращались к коллекциям напрямую. Вы можете построить это в слое Arango Foxx, который находится в самой БД. Здесь - документация для Foxx

Наконец, вы задумывались об изменении структуры базы данных из одной таблицы, которая содержит как данные, так и неявные отношения наследования (на основе InhID), в коллекцию и явные отношения наследования с использованием отношения ребер? В зависимости от того, что вы делаете, это может (или не может) быть полезным.

...