Как я создаю вложенные категории в Базе данных?

Я знаю, что всегда предпочтительнее не кодировать пароль sudo в скрипте. Однако по какой-то причине, если у вас нет разрешения на изменение /etc/sudoers или смену владельца файла, Pexpect является реальной альтернативой.

Вот функция Python sudo_exec для вашей справки:

import platform, os, logging
import subprocess, pexpect

log = logging.getLogger(__name__)

def sudo_exec(cmdline, passwd):
    osname = platform.system()
    if osname == 'Linux':
        prompt = r'\[sudo\] password for %s: ' % os.environ['USER']
    elif osname == 'Darwin':
        prompt = 'Password:'
    else:
        assert False, osname

    child = pexpect.spawn(cmdline)
    idx = child.expect([prompt, pexpect.EOF], 3)
    if idx == 0: # if prompted for the sudo password
        log.debug('sudo password was asked.')
        child.sendline(passwd)
        child.expect(pexpect.EOF)
return child.before
10
задан MathOldTimer 29 May 2009 в 14:11
поделиться

6 ответов

Квассной сказал:

Вы должны использовать либо вложенные наборы, либо модели родитель-потомок.

Я использовал их для реализации обоих. Что я могу сказать:

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

Другой момент, довольно тривиальный, я должен признать, но:
Изменить иерархию вручную прямо в базе данных очень сложно (это могло произойти во время разработки). Итак, не забудьте сначала реализовать интерфейс для игры с вложенным набором (изменение родительского узла, перемещение узла ветви, удаление узла или всей ветви и т. Д.)

Вот две статьи на эту тему:

И последнее, я не пробовал, но где-то читал, что во вложенной таблице множеств может быть более одного дерева, я имею в виду несколько корней.

9
ответ дан 3 December 2019 в 15:06
поделиться

Создайте таблицу категорий со следующими полями:

  • CategoryID - Integer
  • CategoryName - String / Varchar / Whatever
  • ParentID - Integer

Ваш ParentID затем будет ссылаться на в CategoryID его родительского элемента.

Пример:

CategoryID CategoryName ParentID
---------------------------------
1          Dog          NULL
2          Cat          NULL
3          Poodle       1
4          Dachsund     1
5          Persian      2
6          Toy Poodle   3
12
ответ дан 3 December 2019 в 15:06
поделиться

Из примера в вашем вопросе похоже, что вы хотите, чтобы у данной категории было несколько родителей (например, «Видео MIT -> Программирование видео 1», а также «Видео -> Программирование видео 1»), и в этом случае простого добавления столбца ParentID будет недостаточно.

Я бы рекомендовал создать две таблицы: простую таблицу категорий со столбцами CategoryID и CategoryName и отдельную таблицу CategoryRelationships с ParentCategoryID и столбцы ChildCategoryID. Таким образом, вы можете указать столько родительско-дочерних отношений, сколько хотите для любой конкретной категории. Можно даже использовать эту модель для создания двойных отношений, когда две категории одновременно являются родительскими и дочерними друг для друга. (С головы до ног, я могу ''

5
ответ дан 3 December 2019 в 15:06
поделиться

Вы должны использовать либо вложенные наборы , либо модели родитель-потомок .

Родитель-потомок :

typeid parent name

1      0      Buyers
2      0      Sellers
3      0      Referee
4      1      Electrical
5      1      Mechanic
SELECT  *
FROM    mytable
WHERE   group IN
        (
        SELECT  typeid
        FROM    group_types
        START WITH
                typeid = 1
        CONNECT BY
                parent = PRIOR typeid
        )

выберет все покупателей в Oracle .

Вложенные наборы :

typeid lower  upper  Name
1      1      2      Buyers
2      3      3      Sellers
3      4      4      Referee
4      1      1      Electrical
5      2      2      Mechanic
SELECT  *
FROM    group_types
JOIN    mytable
ON      group BETWEEN lower AND upper
WHERE   typeid = 1

выберут всех покупателей в любой базе данных.

См. этот ответ для более подробной информации.

Вложенные sets проще запросить, но сложнее обновить и сложнее построить древовидную структуру.

4
ответ дан 3 December 2019 в 15:06
поделиться

Что вам нужно, так это базовые отношения родитель-потомок:

Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))
0
ответ дан 3 December 2019 в 15:06
поделиться

Лучший способ сохранить parent_id таблицы - это вложить его в ID например,

100000 Программирование 110000 C Язык 111000 Видео 1 Программирование 111100 C Язык 111110 Stanford Video

и т. Д., Так что все, что вам нужно, это сценарий для обработки идентификатора, чтобы первая цифра представляла категорию верхнего уровня и так далее по мере продвижения вниз по иерархии

0
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: