делаю сайт, - публикация статей с комментариями и форум. все свое. пришел к окончательному виду текстовой бд, но поскольку в этом не разбираюсь, прошу либо одобрить ее формат и идею, либо я перейду на sql. :(
база хранится в текстовых файлах .php с содержимым «<?php die; ?>serialize данные», т.е. получается что перезаписывается весь файл при малейшем внесении изменений. все хранится массивами.
две функции для работы с базой:
function array_get_contents($file) {
return unserialize(substr(file_get_contents($file), 13));
}
function array_put_contents($file, $data) {
return file_put_contents($file, '<?php die; ?>'.serialize($data), LOCK_EX);
}
теперь к сайту. статья и два комментария к ней выглядят как /files/journal/0.php (где 0 это ID записи):
array(
array(
'is_article',
'title' => 'название статьи',
'contents' => 'содержание статьи'
),
array(
'is_note',
'file' => 0,
'note' => 0
),
array(
'is_note',
'file' => 0,
'note' => 1
)
)
чтобы снизить нагрузку на файл статьи, его итоговый размер, комментарии храняться отдельно от статьи. в самой статье есть только ссылки на эти комментарии. is_note в массиве означает, что это комментарий, file ссылается на файл, в котором этот комментарий хранится, и note ссылается на порядкой номер комментария из файла.
теперь база с комментариями, которая хранится отдельно. сейчас есть всего два комментария и они умещаются в одном файле /files/notes/0.php, а когда размер базы с комментариями достигнет например 2мб, то будет создана другая база 1.php, 2.php и все новые комментарии будут добавляться в нее, а также создаваться «ссылки» в статьях уже на file => 1, file => 2, и т.д.
array(
array(
'contents' => 'первый комментарий, в массике как array[0]'
),
array(
'contents' => 'второй комментарий, в массиве как array[1]'
)
)
при таком подходе, что база разделена и из разных мест ссылается друг на друга, она позволяет иметь огромный размер.
например, один комментарий весит 4096 байт, и чтобы комментарии достигли уже нашего лимита 2мб на один файл, это нужно (2 * 1024 * 1024) / 4096 = 512 комментариев. в ext3/4 лимит на количество файлов в одной директории 32768 (не помню где и как точно, возьмем грубо 32к). (2мб один файл * лимит 32768 файлов) = 65гб комментариев, может быть на сайте, а всего это 16,777,216 (читайте: 16 миллионов комментариев) - хватит на десяток лет для любого популярного ресурса типа лора, не так ли?
и тоже самое будет относиться к форуму на сайте. создается тред (файл с данными о теме), а в нем хранятся лишь «ссылки» на сообщения, которые также хранятся отдельно, в другом месте.
плюсы такого велосипеда, что все логично, в отдельных массивах, статьи, комментарии - в разных местах. расширяемо, т.е. добавляем массив с какой-нибудь 'is_vote', и считаем что это уже опрос. в отличии от flat-file, где структура будет не такая красивая. :) и еще раз, что при описанном подходе размер базы может быть очень велик, хватит ее на долгое время, а учитывая непопулярность ресурса - на всю жизнь.
минусы все теже - работаем с файловой системой. а еще один-два лишних цикла, т.к. перебрать уже нужно массив в массиве. но думаю для пхп это не критично, плюс приделать к этому уже статичный кэш, и вообще все будет летать.
${SUBJ}