EOMY.NET
Хостинг EOMY.NET: Форум поддержки
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
RSS Feed  

Как реализовать таблицу БД с помощью записи/чтения в файл

 
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB
Как реализовать таблицу БД с помощью записи/чтения в файл
Автор Сообщение
Веденин
Красные глаза
Красные глаза


Зарегистрирован: 17.05.2007
Сообщения: 2066
Откуда: Самара
11733 Монеты

СообщениеДобавлено: Пт, 27 Мар, 2009 19:33    Заголовок сообщения: Как реализовать таблицу БД с помощью записи/чтения в файл Ответить с цитатой

Возник такой вопрос у меня есть таблица MySql вида
Код:
id N(7)
name Varchar(150)
value TEXT

причем id и name проиндексированы
требуется обепечить работу с этой таблицей (хранение данных, поиск нужного value по заданному id или name, запись новой строки в произвольное месте) используя только обычную запись/чтение php (ну или другие возможности ядра php), имеется в виду хранить данные этой таблицы в обычном файле (файлах).

Понятно, что нужно сделать файлы индексов по id и name и файл значений, вопрос только как. Предполагается, что значений в таблице будет достаточно много и требуется быстрый поиск/вставка + место на диске менее критично, но важно так что решение вида выделить на поле TEXT каждой строчки фиксированный и очень большой размер не гуд.

Понятно что в индексе поиск можно сделать бинарным типа разделил на 2 файл выбрал куда идти вверх или вниз снова разделил, интересует как организовать ссылки с индеска на произвольную строку таблицы. Laughing

1) не предлагать использовать чужые скрипты интересует решение на чистом php, то же самое про модули php, которых может не быть на произвольном хостинге Very Happy
2) не предлагать не мучатся и использовать SQL server. Laughing мне бы хотелось помучатся
3) по сути вопрос о реализации простой файловой БД, без всяких SQL и прочего.
4) файлов может быть много, но все таки не бесконечное число так как на кол-во файлов на хостингах есть разные ограничения.
_________________
Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)

Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Веденин
Красные глаза
Красные глаза


Зарегистрирован: 17.05.2007
Сообщения: 2066
Откуда: Самара
11733 Монеты

СообщениеДобавлено: Пт, 27 Мар, 2009 22:27    Заголовок сообщения: Ответить с цитатой

Поискал по инету негусто, но в общем придумал идею, делаем три файла:
1) value.db - для значений
2) id.mdx - для индекса по id
3) name.mdx - для индекса по name
В value.db пишем значения просто одно за другим, в id.mdx, name.mdx пишем значение в виде @ключ|смещение@ключ|смещение@..., для поиска делим файл индекса попалам находим первый @ после половины и смотрим на ключ, если больше идем наверх, меньше вниз, снова делим пока не получим совпадение, тогда берем смещение и получаем значение.
При добавление в таблицу value.db пишем значение просто в конец, а вот в индексах нам надо найти точное место и уже туда записать нужное смещение, удаление будет просто затирания всего блока пробелами (считаем, что пустая строка = отсутствию значения), update если в меньшую сторону меняется текст будет просто забитие остатка пробелами, в большую удаление + добавление новой записи.

Вот интересные вопросы:
1) можно как-то добавлять записи в центр текстового файла, так чтобы остальные записи смещались?
2) как можно это все делать так чтобы не возникло проблем с одновременным чтением записью/двумя пользователями?
_________________
Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)

Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
girafenok
Два пингвиненка
Два пингвина


Зарегистрирован: 17.11.2007
Сообщения: 333

11827 Монеты

СообщениеДобавлено: Пт, 27 Мар, 2009 22:54    Заголовок сообщения: Ответить с цитатой

Почему бы не посмотреть на готовое решение (не в плане использования, а в плане как там реализовано)? Например,
http://www.txtsql.com/
а также в блоговом движке pivot тоже реализовано (pivotlog.net).

Как вариант, база данных - xml файл, тогда можно и нереляционную базу данных сделать.

1. Добавить запись в центр файла автоматически со смещением не получится. Создаем новый файл, переписываем в него информацию до вставляемой записи, саму добавляемую запись, остаток исходного файла. Только зачем это делать? При наличии индексных файлов, все равно в каком месте файла находится информация.
2. http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D1%8F

В общем задачка написать свой MySQL )
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Веденин
Красные глаза
Красные глаза


Зарегистрирован: 17.05.2007
Сообщения: 2066
Откуда: Самара
11733 Монеты

СообщениеДобавлено: Пт, 27 Мар, 2009 23:31    Заголовок сообщения: Ответить с цитатой

girafenok писал(а):
Почему бы не посмотреть на готовое решение (не в плане использования, а в плане как там реализовано)? Например,
http://www.txtsql.com/
а также в блоговом движке pivot тоже реализовано (pivotlog.net).

Да, спасибо посмотрю

girafenok писал(а):

Как вариант, база данных - xml файл, тогда можно и нереляционную базу данных сделать.

Все можно, только поиск при 50 тыс записях в xml файле это не быстрое занятие.

girafenok писал(а):

Только зачем это делать? При наличии индексных файлов, все равно в каком месте файла находится информация.

Это понятно, а как реализовать индексные файлы? У меня другой идеи кроме того чтобы индексы хранились по порядку пока нет.

girafenok писал(а):

2. http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D1%8F

Спасибо, что такое транзакция и какие виды транзакций бывают я знаю, вопрос был исключительно для данной задачи, PHP же не умеет делать транзакции на запись и чтение текстовых файлов, правильно?

girafenok писал(а):

В общем задачка написать свой MySQL )

Да, нет никакого SQL не надо в принципе, нужен минимальный набор функций (найти, прочитать, обновить, добавить) + набор полей в таблицах известен заранее.
_________________
Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)

Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Веденин
Красные глаза
Красные глаза


Зарегистрирован: 17.05.2007
Сообщения: 2066
Откуда: Самара
11733 Монеты

СообщениеДобавлено: Пт, 27 Мар, 2009 23:48    Заголовок сообщения: Ответить с цитатой

Веденин писал(а):
girafenok писал(а):
Почему бы не посмотреть на готовое решение (не в плане использования, а в плане как там реализовано)? Например,
http://www.txtsql.com/
а также в блоговом движке pivot тоже реализовано (pivotlog.net).

Да, спасибо посмотрю


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


Веденин писал(а):

girafenok писал(а):

2. http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D1%8F

Спасибо, что такое транзакция и какие виды транзакций бывают я знаю, вопрос был исключительно для данной задачи, PHP же не умеет делать транзакции на запись и чтение текстовых файлов, правильно?

В общем нашел функцию flock, которая блокирует файл от изменений на время редактирования Very Happy
_________________
Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)

Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
girafenok
Два пингвиненка
Два пингвина


Зарегистрирован: 17.11.2007
Сообщения: 333

11827 Монеты

СообщениеДобавлено: Сб, 28 Мар, 2009 00:05    Заголовок сообщения: Ответить с цитатой

Чем принципиально отличается поиск в xml файле от поиска в простом текстовом? Накладные расходы больше, согласен, вопрос насколько они будут больше по сравнению с простым текстовым файлом? При этом насколько будет удобней работать с xml по сравнению с текстом?

Теперь что из себя представляет индекс?
Вариант первый. Число с auto increment. В этом случае принципиально не может быть индекс, меньший, чем предыдущий. Значит индекс для новой записи всегда нужно добавлять в конец индексного файла.
Вариант второй, текстовой поле или число. В этом случае действительно придется добавлять запись в середину файла, т.е. фактически переписывать файл заново как я писал ранее.
Тут надо идти смотреть как реализованы индексы в какой-нибудь БД.

Ни минуты не сомневался, в Ваших знаниях ). Естественно php транзакции не умеет делать, т.е. транзакции надо реализовывать самому. В самом простом случае - это организация очереди (массива, списка) на запись и блокировка всего текстового файла при осуществлении записи.

P.S. Если интерес не чисто теоретический, а практический, чтобы избавиться от громоздкой MySQL, занимающей много места в ОЗУ, тогда стоит обратить внимание на SQLite (библиотека), которая собственно и предоставляет средства работы с текстовым фалом как базой данных.

Update.

Гугление по данному вопросу выявило, что индекс является B-деревом или его разновидностью, что однако не упрощает проблему, так как при любом добавлении в середину текстового файла, его приходится переписывать целиком.
В общем задачка сводится к тому, чтобы написать заново MySQL или Oracle ).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Веденин
Красные глаза
Красные глаза


Зарегистрирован: 17.05.2007
Сообщения: 2066
Откуда: Самара
11733 Монеты

СообщениеДобавлено: Сб, 28 Мар, 2009 06:27    Заголовок сообщения: Ответить с цитатой

girafenok писал(а):
В общем задачка сводится к тому, чтобы написать заново MySQL или Oracle ).

Улыбнуло Laughing , посколько я долго работал с Oracle, то представляю что-такое его переписать, намного проще переписать Windows в полном объеме Laughing Нет такой задачи нет. Laughing

girafenok писал(а):
Чем принципиально отличается поиск в xml файле от поиска в простом текстовом? Накладные расходы больше, согласен, вопрос насколько они будут больше по сравнению с простым текстовым файлом?

Очень сильно больше, во первых xml сильно избыточен размер файла xml по сравнению с файлом БД будет больше в десятки раз. Но даже не это главная проблема, а в том в xml нельзя построить индекс, соответвенно поиск будет чисто перебором и парсингом всего xml, что для не очень большого ко-ва записей будет работать ну очеень медленно.

girafenok писал(а):
Гугление по данному вопросу выявило, что индекс является B-деревом или его разновидностью, что однако не упрощает проблему, так как при любом добавлении в середину текстового файла, его приходится переписывать целиком.

Как вариант решения сделать индекс не одним файлом, а N-ным кол-вом файлов, тогда переписывать придется намного меньше.
_________________
Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)

Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB Часовой пояс: GMT
Страница 1 из 1

 


EOMY TOP 100 Rambler's Top100   Рейтинг@Mail.ru    



Powered by phpBB © 2001, 2005 phpBB Group


Рейтинг SIMPLETOP.NET