LINUX.ORG.RU

[php][текстовая бд] одобрите?

 


0

2

делаю сайт, - публикация статей с комментариями и форум. все свое. пришел к окончательному виду текстовой бд, но поскольку в этом не разбираюсь, прошу либо одобрить ее формат и идею, либо я перейду на 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}

★★★★★

одобрите?

Нет.

база хранится в текстовых файлах .php

Ужасно.
Поздравляю с изобретением документно-ориентированной БД.

jessey
()

база хранится в текстовых файлах .php

Ядро операционной системы хранится в исполняемых файлах .txt

одобрите?

Нет, дальше не читал - смысла нет.

mopsene ★★★
()

когда размер базы с комментариями достигнет например 2мб, то будет создана другая база 1.php, 2.php и все новые комментарии будут добавляться в нее, а также создаваться «ссылки» в статьях уже на file => 1, file => 2, и т.д.

Ох лол. ТС, в 21 веке уже есть десятки отличных СУБД, почему ты такой?

mopsene ★★★
()
Ответ на: комментарий от akinator

Не знаю языка. Это ж нужно читать документацию, - но мало ее читать, надо чтобы сделано было все правильно. Уйма времени уйдет на изучение тонкостей и «как сделать лучше». А так, вообще не важно, какую базу использовать. Просто ничего кроме плоских файлов не умею на данный момент.

Здесь я представил последний вариант, и если никто не поддержит, возьмусь за изучение sql...

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

Страшно подумать, каковы были варианты первоначальные. Посмотри для начала в сторону Sqlite, раз хочешь попроще.

jessey
()
Ответ на: комментарий от jessey

Причем тут php? Просто понабежало школьников, которые услышали, что веб это просто и решили без знаний начать программировать. В нормальных языках программирование идиоты тоже встречаются, типа:

#define true false

mopsene ★★★
()

Ну, можно, конечно поковырять сырцы dokuwiki и посмотреть, как там оно сделано, но лучше всё-таки выкинуть это всё и использовать sql.

shell-script ★★★★★
()
Ответ на: комментарий от jessey

Ненавижу php, приходится работать с ним, сегодня суббота - а у меня рабочий день, поэтому и so serious. Я ответил на твой вопрос?

mopsene ★★★
()

[php][текстовая бд]

Предлагаю вдоль

HerrWeigel ★★★★
()
Ответ на: комментарий от Spoofing

Учи sql. Он везде. Его знание тебе скорее всего потребуется в новых проектах.

akinator ★★
()
Ответ на: комментарий от jessey

А чем он проще? Тот же SQL.

Или речь о установке и поддержке? Это по-моему вообще не аргумент, системы портов/пакетов же есть и сотни манов в сети.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Всё верно, тот же SQL. Только вместо сервера базы данных один файл. Насчёт сотни манов: ты посмотри что ТС сейчас делает не смотря на сотни манов.

jessey
()
Ответ на: комментарий от mopsene

в рабочий день на работе они пишут тектовые бд на пхп вместо почитать пару строк про sql, и где только берутся работодатели готовые за такую работу платить?

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

Ты так говоришь, словно Spoofing работает пхп-кодером, в то время как на самом деле он может быть хикке, иногда подрабатывающим ночным сторожем где-нибудь в мухосранске.

anonymous
()

Плюсую за sqlite, т.к. именно для этого и существует SQL. Если знаний в SQL нет, ничего страшного. Несколько таблиц и связи между ними - самый примитив, который осилится минут за 10.

winlook38 ★★
()

Не одобрю. Ты велосипедсит, и твой велосипед не работает, если у тебя много данных. ґуґли документно-ориентированные СУБД или хотя бы бинарную сериализацию.

Deleted
()
Ответ на: комментарий от jessey

Это не только похапешники. Тут кто-то на полном серьезе предлагал делать все СУБД... только на текстовых файлах.

Deleted
()

А поиск по комментариям как реализуешь?

pi11 ★★★★★
()

А если после хотя бы пары месяцев твоего форума ты захочешь что-то изменить в структуре данных (допустим, добавить рейтинг коммента)? А если потом ты захочешь сделать топ комментов (самые рейтинговые)? Короче, изучай реляционные БД и не изобретай велосипед. Тем более, он у тебя с квадратными колёсами получился.

Wizard_ ★★★★★
()

одобрите?

Конечно! Только рекомендую в начало каждого файла вставлять свой адрес и телефон для тех, кто будет поддерживать проект в будущем.

KDE41user
()

Чем не устроили обычные носкульные базы?

[php]

Хотя, всё понятно.

aedeph_ ★★
()

Если тормозить не будет, то почему бы и нет. Для простенького сайтика сойдет.

dizza ★★★★★
()
Ответ на: комментарий от Deleted

franchukroman

Тут кто-то на полном серьезе предлагал делать все СУБД... только на текстовых файлах.

я надеюсь ты не меня подразумеваешь?

А в данном случае конечно нужно юзать СУБД какую-нить готовую.

drBatty ★★
()

Spoofing

в ext3/4 лимит на количество файлов в одной директории 32768

ага. А мужики-то не знали, и создавали миллионы файлов. Эх... Школоло...

drBatty ★★
()
Ответ на: комментарий от dizza

dizza

Если тормозить не будет

будет.

dizza

Для простенького сайтика сойдет.

на выделенном сервере за 10K в месяц? Сойдёт.

drBatty ★★
()
Ответ на: комментарий от drBatty

я надеюсь ты не меня подразумеваешь?

Не тебя.

Deleted
()

Подходит только для простейшего случая. Если надо будет к примеру делать листинг по категориям, неговоря уже о поиске по разным критериям то система усложнится настолько что со временем дойдёт до уровня DBMS (учитывая что у разработчиков хватит времени, знаний, ресурсов). Если уж будете делать так то советую энкапсулировать все обращения к самодельной DB в класс что бы потом было просто перенести всё в MySQL или PostgreSQL.

psp13
()

А от меня хороший увесистый автору плюс.
Когда реализуешь, плиз, черкни, меня кастнув или лично (контакты в профиле).

moscwich
()
Ответ на: комментарий от moscwich

moscwich

Хм. А с чего бы выделенный сервер тут?

потому-что на VDS это всё будет жутко тормозить. Даже на небольших объёмах. Даже если туда кроме админа и гуглоботов никто не пойдёт. Почему я так уверен? А я пробовал что-то подобное.

ЗЫЖ sqlite тоже наверное не очень, хотя конечно намного лучше этого велосипеда.

drBatty ★★
()
Ответ на: комментарий от moscwich

Фатальный недостаток - это тот факт, что существующие БД написаны не ТС.

jessey
()
Ответ на: комментарий от Spoofing

Не знаю языка. Это ж нужно читать документацию, - но мало ее читать, надо чтобы сделано было все правильно. Уйма времени уйдет на изучение тонкостей и «как сделать лучше».

- Да, были люди в наше время,
Не то, что нынешнее племя:
	Богатыри - не вы!
Плохая им досталась доля:
писать на пыхе за хлеб с солью
Не будь на то господня воля,
	Писали бы на Си!

Собственно говоря когда-то передо мной встала задача поучаствовать в олимпиаде по программированию, наиболее пристойная номинация на пыхе, пых я не знал в принципе, за вечер, я написал гостевуху с шаблонным движком, mvc-архитектурой и админкой, и текстовой объектной бд, параллельно узнав этот самый php.

Мне стыдно за вас, да именно за вас, наше будущее!

belous_k_a
()

база хранится в текстовых файлах .php
с содержимым «<?php die; ?>serialize данные»
получается что перезаписывается весь файл при малейшем внесении изменений.
все хранится массивами.

дальше не читал

ТС, зачем тебе этот гимор?

ты спросишь «почему гимор?»
ну как минимум... с каким откликом (по твоему) будет работать сервак при «65гб комментариев» в файлах по 2мб + «перезаписывается весь файл при малейшем внесении изменений» ?

однозначно НЕ «и вообще все будет летать»

да и «serialize данные» не самый лучший способ хранения
serialize - достаточно ресурсоёмкая байда


возьми SQLite и не парься

q11q11 ★★★★★
()

Все ругают тут ТСа, а я похвалю. Он, особенно если погоняет эту «базу» на больших объемах записей и если ему придется ее значительно расширять, на личном опыте осознает, что текстовые базы - говно, пригодны оказываются редко и будет осознанно ценить и любить продвинутые СУБД.

amomymous ★★★
()
Ответ на: комментарий от drBatty

ИМХО для хомпаги на пхп годно MySQL.

Ужснах О_о! MySQL явно уместна только для огромных проектов, чего стоит только такое количество типов данных... А юзеры? А базы, хз в каком виде и хз где находящиеся? Явно все его сложности и возможности не для простых вещей. Но уж надеюсь, ты не из тех, кто считает уместным хранить в базе что-либо кроме цифр и небольших строк?

moscwich
()

Месье знает толк в извращениях!

А по теме: твоя БД будет жутко тормознутая. Во-первых, всегда грузится и _парсится_ (вместо того, чтобы заюзать более быстрый по опредению бинарный формат) весь файл данных. Во-вторых, любая выборка из БД будет производится полными перебором строк на самом PHP, даже никаких индексов.

Во-вторых, только ты будешь знать как работать с твоим костылём. Если с этим проектом придётся работать кому-то ещё, то он будет проклинать тебя и когда-нибудь, вспомнив твоих родителей по материнской линии, всё равно перепишет на какой-нибудь нормальный движок типа SQLite или MySQL.

В общем твой подход в корне не верен, закопать, не нужно. Что ещё сказать? Не страдай фигнёй и используй тот же SQLite. Строить не сложные запросы на SQL очень и очень просто, учится за час максимум (с подключением к БД).

KivApple ★★★★★
()
Ответ на: комментарий от moscwich

moscwich

Ужснах О_о! MySQL явно уместна только для огромных проектов

1. вовсе не так всё.
2. проекты имеют свойство разрастаться. Если они кому-то нужны.

moscwich

чего стоит только такое количество типов данных..

используй VARCHAR, и не парься.

moscwich

А юзеры?

что «юзеры»? Один большой сервер решает множество проблем. Но к серверу нужно юзеров. Не нужно? Юзай одного юзера (не рута).

moscwich

А базы

аналогично.

moscwich

хз в каком виде и хз где находящиеся?

а тебе зачем это знать?

moscwich

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

ещё можно хранить даты, наборы, небольшие тексты, числа разных типов, НЁХ(называется NULL). Ты наверное имеешь ввиду картинки/фильмы/музыку? Нет, я не считаю разумным хранить их в БД (хотя вроде как последние версии MySQL что-то такое поддерживают). Вообще, самое главное в СУБД - продвинутый поиск выборки данных, ни о каких выборках в ФС речи быть не может, потому мы даже не сможем реализовать нормальную гостевуху на несколько страничек, что-бы можно было посмотреть скажем 17ю страничку за обозримое время. ТС на это затратит то ли O(N*N), то ли вообще O(N*N*N), что будет жутко тупить даже при просмотре полусотни комментов на 5и страничках. Незнание математики анально карается жестокими тормозами. Или тратой тысяч нефти на всякие кластерные решения, для какого-то сайта на 3.5 юзера в день.

drBatty ★★
()

На что только люди не пойдут, лишь бы не использовать python и sqlite3

deb
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.