Как представлять вложенную папку & структуру вложенных папок в базе данных Sqlite?

Вопрос задан: 8 месяцев назад Последняя активность: 8 месяцев назад
up -1 down

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

Моя текущая настройка имеет их вложенные с разделителями, как так:

  • [ 'Папка :: subfoldera']
  • [ 'Папка :: subfolderb']
  • [ 'Folder2 :: subfolderc']
  • [ 'Folder2 :: subfolderd']
  • [ 'Последний :: пример :: к :: представляет :: глубину']

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

Как я должен идти о а) хранение таблиц в базе данных б), представляющей структуру их в Python?

1 ответ

up 0 down accepted

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

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

╔═══════════╦══════╦══════════════════════════════════╗
║  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, и в этом случае ваша папка будет представлена ​​в качестве класса, реализации модели:

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 значения также могут быть размещены в этом классе.