Как создать версии одного и того же файла в базе данных и на диске, как менеджер документов BaseCamp - PullRequest
1 голос
/ 13 октября 2011

Если вы использовали Basecamp , есть страница менеджера документов, которую вы также можете найти демо здесь.Мне понравилась возможность создания версий, когда один и тот же файл загружается дважды, [опционально пользователь указывает создание файла в качестве новой версии].Как вы думаете, файлы хранятся в DATABASE как записи и в DISK как файлы.Из моей проверки кажется, что файлы сохраняются, как показано ниже

Структура

[user_folder]
 [project_name]
  [file_name]
    [V1/V2/V3]

, например, с учетом нижеприведенного

Пример

  1. имя пользователя "mak"

  2. имя проекта "izord" и

  3. имя файла "base.html"

у него есть 2 версии здесь структура каталогов

   [mak]
     [izord]
      [base]
        [V1]
         base.html
        [V2]
          base.html

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

Вопрос

  1. Как вы думаете, как я могу организовать файлы на диске в такой ситуации
  2. Есть ли у вас заранее подготовленная, уже разработанная структура таблицы для сохранения сведений о файле?
  3. Как сортировать файлы из таблицы по алфавиту, как в демонстрационном видео.Они поддерживают своего рода другой стол?

1 Ответ

1 голос
/ 13 октября 2011

Прежде всего, я почти уверен, что они хранят файлы в S3, так что примите это во внимание.

Что касается структуры базы данных, я хотел бы иметь что-то вроде

Account:      ID
Project:      ID, AccountID
File:         ID, ProjectID, Name, ContentType, CurrentRevision
FileRevision: ID, FileID, ContentLength, AmazonS3Key, CreatedAt, CreatedBy

и затем сохраняйте каждый файл в <bucket>/<account-id>/<project-id>/<file-name> "directory" (в S3 нет реальных каталогов, но они эмулируются с косой чертой).Содержимое файла помещается в соответствующий каталог:

<bucket>/<account-id>/<project-id>/<file-name>
  v1
  v2
  ...
  v13

Загрузка новой версии файла - это просто вопрос добавления записи v<File.CurrentRevision + 1> в хранилище S3.

Также обратите внимание, что раскрытиеИдентификаторы учетных записей и проектов, возможно, не являются хорошей идеей, поэтому я бы пошел с хэшами из них: <bucket>/<md5(account-id + salt)>/<md5(project-id + salt)>/<file-name>

...