Возможность кодирования иерархии в идентификатор - PullRequest
0 голосов
/ 14 апреля 2020

В моей базе данных есть несколько таблиц, в которых есть столбец, который является внешним ключом своего собственного первичного ключа. Это используется для express иерархии.

ie. Структура сотрудников: Персонал -> Сменный менеджер -> Менеджер магазина -> Районный менеджер

ie. Право собственности компании: Компания A принадлежит компании B, которая принадлежит компании C ...

Обычные запросы, которые будут сделаны:

  1. "Является субъектом A в иерархии, начиная с сущности B: ie: компания B владеет прямо или косвенно компанией A. "

  2. " Какая организация ближе всего к сущностям 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]"

  1. Если A mod B = 0 и для каждого fb в [Fb] A / B mod fb! = 0, то A является частью иерархии B.

  2. Ключ к ближайшему элементу между 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))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...