Как представить структуру вложенных папок и подпапок в базе данных Sqlite? - PullRequest
0 голосов
/ 07 февраля 2019

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

В моей текущей настройке они вложены в разделители следующим образом:

  • ['folder :: subfoldera']
  • ['folder :: subfolderb']
  • ['folder2 :: subfolderc']
  • ['folder2 :: subfolderd']
  • ['last :: example :: to :: представляют :: глубину']

Однако я не знаю, как бы я представлял это вложение в python, когда я читаю из базы данных, так как простые списки вложения не будут работать, потому что это не сможет сохранить имяпапка, она будет показывать только вещи, вложенные в нее.

Как мне поступить а) хранить таблицы в базе данных б) представить их структуру в Python?

1 Ответ

0 голосов
/ 07 февраля 2019

Будет лучше хранить структуру папок в одной таблице, а не создавать таблицу для каждой папки.

Например, такая таблица может иметь такую ​​структуру:

╔═══════════╦══════╦══════════════════════════════════╗
║  Column   ║ Type ║           Description            ║
╠═══════════╬══════╬══════════════════════════════════╣
║ id        ║ int  ║ Unique identifier of the folder  ║
║ parent_id ║ int  ║ id of the parent folder          ║
║ name      ║ text ║ Name of the folder               ║
║ mpath     ║ text ║ Materialized path of parent id's ║
╚═══════════╩══════╩══════════════════════════════════╝

Примечание о материализованном пути: это необязательно и может быть добавлено, чтобы ускорить выполнение запросов типа «Получить всех детей».папки 123 "без рекурсивных вызовов.

Итак, давайте представим, что у вас есть такая структура папок:

/
├── home/
│   ├── aspiring-master
│   │    └── .bashrc
│   └── guest-user
└── var/
    ├── log/
    └── lib/

Она может быть представлена ​​в виде упомянутой таблицы следующим образом:

╔════╦═══════════╦═══════════════════╦═══════════╗
║ id ║ parent_id ║       name        ║   mpath   ║
╠════╬═══════════╬═══════════════════╬═══════════╣
║  1 ║ null      ║ "/"               ║ "/"       ║
║  2 ║ 1         ║ "home"            ║ "/1/"     ║
║  3 ║ 2         ║ "aspiring-master" ║ "/1/2/"   ║
║  4 ║ 3         ║ ".bashrc"         ║ "/1/2/3/" ║
║  5 ║ 2         ║ "guest-user"      ║ "/1/2/"   ║
║  6 ║ 1         ║ "var"             ║ "/1/"     ║
║  7 ║ 6         ║ "log"             ║ "/1/6/"   ║
║  8 ║ 6         ║ "lib"             ║ "/1/6/"   ║
╚════╩═══════════╩═══════════════════╩═══════════╝

В python вы можете использовать некоторые ORM, такие как sqlAlchemy, и, в этом случае, ваша папка будет представлена ​​как класс, реализующий Model:

class Folder(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    parent_id = db.Column(db.Integer, db.ForeignKey('folder.id'),
        nullable=True)
    name = db.Column(db.String(128), unique=True, nullable=False)
    mpath = db.Column(db.String(255), unique=True, nullable=False)

Функциональность для автоматического создания значения mpath.может быть помещен в этот класс.

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