В моей базе данных есть несколько таблиц, в которых есть столбец, который является внешним ключом своего собственного первичного ключа. Это используется для express иерархии.
ie. Структура сотрудников: Персонал -> Сменный менеджер -> Менеджер магазина -> Районный менеджер
ie. Право собственности компании: Компания A принадлежит компании B, которая принадлежит компании C ...
Обычные запросы, которые будут сделаны:
"Является субъектом A в иерархии, начиная с сущности B: ie: компания B владеет прямо или косвенно компанией A. "
" Какая организация ближе всего к сущностям A и B. ie: Какой менеджер косвенно или непосредственно управляет сотрудником A и B. "
Решение, которое я собираюсь реализовать, заключается в непосредственном кодировании иерархии в первичный ключ строк.
Прежде чем перейти к решению, я бы хотел повторить свой вопрос еще раз. Существуют ли математические или вычислительные причины, по которым это не сработает. ie: В моей математической логике есть изъян c, или это быстро приведет к переполнению буфера, или в вычислительном отношении это займет экспоненциально больше времени, чем просто выполнение нескольких запросов.
Пусть "P" = основной ключ родительской сущности.
Пусть "D" = глубина родительской сущности (сколько родительских сущностей находится над родительской сущностью до достижения сущности без родителя)
Let "C "= первичный ключ дочерней сущности.
Пусть" E "= количество детей, в настоящее время имеющих этого родителя (или отсутствие родителя, если это глубина 0)
Let" [Pr ] "= Последовательный набор простых чисел
Пусть" Pr "= i-е простое число в последовательности простых чисел.
C = P * (Pr) ^ (E + 1 )
Читается, поскольку ключ для дочерней сущности равен ключу родителей, умноженному на простое число D (@D = 1: Pr = 2, @D = 5: Pr = 11) в степени 1 плюс текущее количество детей.
Таким образом, я мог бы ответить на мои 2 запроса, упомянутые выше with:
Пусть «A» будет ключом для сущности A
Пусть «B» будет ключом для сущности B.
Пусть «[Fa]» будет факторами «A» "
Пусть" fa "будет значением в" [Fa] "
Пусть" [Fb] "будет фактором" B "
Пусть" fb "будет vlue in "[Fb]"
Если A mod B = 0 и для каждого fb в [Fb] A / B mod fb! = 0, то A является частью иерархии B.
Ключ к ближайшему элементу между A и B равен:
let C = ключ ближайшего объекта
FunctionToGetNearest C (A, B)
C = 1
i = 1
pr = [Pr](i)
while True
d = 1
while A mod pr = 0 and B mod pr = 0
d = d * pr
A = A / pr
B = B / pr
if A mod pr = 0 or B mod pr = 0 then
return C
C = C * d
i = i + 1
pr = [Pr](i)
Примечание. На запрос 1 также можно ответить с помощью if (B = FunctionToGetNearest C (A, B))