Если вам нужна быстрая скорость чтения, лучшим вариантом является использование таблицы закрытия. Таблица закрытия содержит строку для каждой пары предков / потомков. Итак, в вашем примере таблица закрытия будет выглядеть как
ancestor | descendant | depth
0 | 0 | 0
0 | 19 | 1
0 | 20 | 2
0 | 21 | 3
0 | 22 | 4
19 | 19 | 0
19 | 20 | 1
19 | 21 | 3
19 | 22 | 4
20 | 20 | 0
20 | 21 | 1
20 | 22 | 2
21 | 21 | 0
21 | 22 | 1
22 | 22 | 0
. После того, как у вас есть эта таблица, иерархические запросы становятся очень легкими и быстрыми. Чтобы получить всех потомков категории 20:
SELECT cat.* FROM categories_closure AS cl
INNER JOIN categories AS cat ON cat.id = cl.descendant
WHERE cl.ancestor = 20 AND cl.depth > 0
Конечно, существует большой недостаток, когда вы используете денормализованные данные, подобные этому. Вам нужно поддерживать таблицу закрытия рядом с таблицей категорий. Лучший способ, вероятно, использовать триггеры, но несколько сложно правильно отслеживать вставки / обновления / удаления для таблиц закрытия.
Редактирование: см. Вопрос Какие существуют варианты хранения иерархических данных в реляционной базе данных?
g0] для получения дополнительных опций. Существуют различные оптимальные решения для разных ситуаций.
Если вы не можете принять какую-либо вероятность того, что sun.misc.Signal
может измениться в недавнем будущем, просто реализуйте обработку сигнала самостоятельно, с помощью интерфейса JNI, на языке, который компилируется в машинный код (например, C), и импортируйте библиотеку с помощью System.load
. Используя JNI, java может использовать C, а C может использовать java. В первый раз, когда я использовал JNI, мне показалось забавным иметь возможность использовать весь Java-API из моей C-программы.
Теперь единственное, о чем вам нужно беспокоиться, это изменится ли интерфейс ОС или, что более вероятно, изменится выбор используемой ОС.
Лучше всего отказаться от сигналов, поскольку они плохо поддерживаются.
Альтернативы для IPC: