Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как поддерживать рекурсивный инвариант в базе данных MySQL?
У меня есть дерево, закодированное в базе данных MySQL как ребра:
CREATE TABLE items (
num INT,
tot INT,
PRIMARY KEY (num)
);
CREATE TABLE tree (
orig INT,
term INT
FOREIGN KEY (orig,term) REFERENCES items (num,num)
)
Для каждого листа в дереве, items.tot устанавливается кем-то. Для внутренних узлов items.tot должен быть суммой его дочерних элементов. Повторное выполнение следующего запроса приведет к желаемому результату.
UPDATE items SET tot = (
SELECT SUM(b.tot) FROM
tree JOIN items AS b
ON tree.term = b.num
WHERE tree.orig=items.num)
WHERE EXISTS
(SELECT * FROM tree WHERE orig=items.num)
(обратите внимание, что это на самом деле не работает, но это к делу не относится)
Предположим, что база данных существует и инвариант уже удовлетворен.
Вопрос в том:
Каков наиболее практичный способ обновления DB при сохранении этого требования? Обновления могут перемещать узлы вокруг или изменять значение
totна конечных узлах. Можно предположить, что листовые узлы останутся листовыми узлами, внутренние узлы останутся внутренними узлами, и все это останется как правильное дерево.
Некоторые мысли у меня были:
- Полное аннулирование, после любого обновления, пересчитать все (ум... Нет)
- Установите триггер в таблице элементы для обновления родительского элемента любой обновляемой строки
- Это было бы рекурсивно (обновления запускают обновления, запускают обновления,...)
- Не работает, MySQL не может обновить таблицу, которая запустила триггер
- Установите триггер для планирования обновления родительского элемента любой обновляемой строки
- Это было бы итеративно (получить элемент из расписания, обработка его планирует больше элементов)
- Что же это такое? Доверяйте клиентскому коду, чтобы получить его правильно?
- Преимущество заключается в том, что если обновления упорядочены правильно, то меньше сумм должно быть вычислено. Но этот порядок сам по себе является осложнением.
Идеальное решение было бы обобщить на другие "aggregating invariants"
FWIW я знаю, что это "немного за бортом", но я делаю это для удовольствия (Fun: verb, находя невозможное, делая это. :-)
Я не уверен, что правильно понял ваш вопрос, но это может сработать с моим подходом к деревьям в SQL .
Связанный пост описал метод хранения дерева в базе данных-PostgreSQL в этом случае - но метод достаточно ясен, поэтому его можно легко принять для любой базы данных.
С помощью этого метода вы можете легко обновить все узлы, зависящие от модифицированного узла K , примерно с N простыми запросами SELECTs, где N -расстояние K от корневого узла.
Я надеюсь, что ваше дерево не очень глубоко :).
Удачи Вам!
Проблема, с которой вы столкнулись, ясна, рекурсия в SQL. Вам нужно получить родителя родителя... листа и обновляет его общее (либо вычитая старое и добавляя новое, либо пересчитывая). Вам нужен какой-то идентификатор, чтобы увидеть структуру дерева и захватить все дочерние узлы и список родителей/путь к листу для обновления.
Этот метод добавляет постоянное пространство (2 столбца в таблицу-но вам нужна только одна таблица, иначе вы можете сделать соединение позже). Некоторое время назад я играл со структурой, которая использовала иерархический формат, используя столбцы 'left' и 'right' (очевидно, не те имена), вычисленные путем обхода предварительного заказа и обхода после заказа, соответственно-не волнуйтесь, их не нужно пересчитывать каждый раз.
Я позволю вам взглянуть на страницу, использующую этот метод в mysql вместо продолжения этого обсуждения, если вам не нравится этот метод в качестве ответа. Но если вам это нравится, опубликуйте / отредактируйте, и я возьму некоторое время и уточню.