Создание богатой структуры данных в традиционной реляционной базе данных, такой как MySQL, часто бывает затруднительным, и есть гораздо лучшие способы ее решения. При работе с структурой данных, основанной на путях с иерархией, мне нравится создавать плоскую файловую систему, которая использует формат сериализации данных, такой как JSON, для хранения информации о конкретном файле, каталоге или целом репозитории.
Таким образом, вы можете использовать текущие доступные инструменты, чтобы легко перемещаться и манипулировать структурой, и вы можете легко читать, редактировать и понимать структуру. XML тоже хорош для этого - он немного более подробный, чем JSON, но легко читается и хорош для обмена сообщениями и других систем на базе XML.
Быстрый пример. Если у нас есть репозиторий, в котором есть каталог и три файла. Глядя на нее спереди, она будет выглядеть так:
/repo
/folder
code.php
file.txt
image.jpg
У нас может быть папка метаданных, которая содержит наши файлы JSON, скрытые от ОС, в корне каждого каталога, которые описывают содержимое этого каталога. Вот как работают традиционные системы управления версиями, за исключением того, что вместо JSON используется пользовательский язык.
/repo
*/.folderdata*
/code
*/.folderdata*
code.php
file.txt
image.jpg
Каждая папка .folderdata может содержать собственную структуру, которую мы можем использовать для правильной организации данных папки. Каждая .folderdata папка может затем быть сжаты для экономии дискового пространства. Если мы посмотрим на папку .folderdata внутри каталога / code:
*/.folderdata*
/revisions
code.php.r1
code.php.r2
code.php.r3
folderstructure.json
filerevisions.json
Структура папок определяет структуру нашей папки, где файлы и папки относятся друг к другу и т. Д. Это может выглядеть примерно так:
{
'.': 'code',
'..': 'repo',
'code.php': {
'author_id': 11543,
'author_name': 'Jamie Rumbelow',
'file_hash': 'a26hb3vpq22'
'access': 'public'
}
}
Это позволяет нам связывать метаданные об этом файле, проверять подлинность и целостность, сохранять постоянные данные, указывать атрибуты файлов и делать гораздо больше. Затем мы можем сохранить информацию о конкретных версиях файла filerevisions.json:
{
'code.php': [
1: {
'commit': 'ah32mncnj654oidfd',
'commit_author_id': 11543,
'commit_author_name': 'Jamie Rumbelow',
'commit_message': 'Made some changes to code.php',
'additions': 2,
'subtractions': 4
},
2: {
'commit': 'ljk4klj34khn5nkk5',
'commit_author_id': 18676,
'commit_author_name': 'Jo Johnson',
'commit_message': 'Fixed Jamie's bad code!',
'additions': 2,
'subtractions': 0
},
3: {
'commit': '77sdnjhhh4ife943r',
'commit_author_id': 11543,
'commit_author_name': 'Jamie Rumbelow',
'commit_message': 'Whoah, showstopper found and fixed',
'additions': 8,
'subtractions': 5
},
]
}
Это базовый план для системы управления версиями файлов - мне нравится эта идея и как она работает, и я использовал JSON в прошлом, чтобы отлично работать с такими богатыми структурами данных, как это. Подобные данные просто не подходят для реляционной базы данных, такой как MySQL, - поскольку вы получаете больше изменений и больше файлов, база данных будет становиться все больше и больше, таким образом вы можете пошатнуть изменения в нескольких файлах, сохранить резервные копии всего, сделать убедитесь, что у вас есть постоянные данные через интерфейсы и платформы и т. д.
Надеюсь, это дало вам некоторое представление, и, надеюсь, это принесет некоторую пищу для размышлений и для сообщества!