Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];

Вниз

Выложил простенькую Иерархическую БД   Найти похожие ветки 

 
Serginio   (2003-05-21 16:30) [0]

http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019

Эта простенькая иерархическая БД позволяетхранить как струтурированные данные
так и неструктурированные в одном потоке (TfileStream или любом аналоге TmemorySream). Пока без индексов и полностью не протестированная.
Суть его заключается в хранении данных в связанных страницах
одинакового размера наподобии файловой системы FAT но последовательность страниц
хранится отдельно в иерархическом массиве.
Родителем всех таблиц служит TSSCustomTable. Это виртуальный стрим взаимодействующий с
основным хранилищем (стримом) через класс TSSBD.
Хранилищем цепочек последовательных страниц является класс TTableCepochki.
Это единственный класс которыйхранит ссылки на данные
в абсолютных смещениях в основном хранилище. Запись TTableCepochki имеет следующий вид
На данный момент реализованы 4 таблицы для хранения данных
TSSTable
TSSChildTable
TTableStream
TSSTableBlob

TSSTable это обычная струтурированная таблица. Отличием ее является наличие в начале
записи Номер этой записи в таблице. Который является уникальным значением для данной записи.
Это поле на данный момент может являться ссылкой на следующую удаленную запись.
Методы данной таблицы достаточно понятны.
TSSChildTable это подчиненная таблица в начале записи которой обязательно должна быть структура
PChildRecord=^TChildRecord;
TChildRecord = record
RecordNumber:TRecordNumber;
NextRecordNumber:TRecordNumber; // сылка на следующую запись
PriorRecordNumber:TRecordNumber; // ссылка на предыдущую запись
end;
Запись родительской таблицы должна содержать поле типа
PChildLines=^TChildLines;
TChildLines = Record
FirstLines:Int64;
LastLines:Int64;
end;
TTableStream, TSSTableBlob выполняют одну задачу хранение потока данных.
TTableStream данные всегда добавляются в конец таблицы. Сначала записывается длина потока а затем данные.
Но так как данные хранятся друг за другом запрещена модификация и удаление. Данная таблица хороша тогла
когда не нужна модификация данных.
TSSTableBlob это классическая блоб таблица. Данные хранятся в связанных записях имеющих вид
PSmallBlobRecord=^TSmallBlobRecord;
TSmallBlobRecord= record
NextRecord:Int64; // Ссылка на следующую запись с данными
Data:Array[0..LenRec-sizeOf(Int64)-1] of char;
end;
Где LenRec длина записи и должна быть кратна размеру страницы.
В начале первой записи прописывается длина данных.
Этот тип таблиц хорош для модификации данныз.
Хотя скорости и не оправдали моих надежд (раз 20 медленнее при записи большими блоками данных а не по одной записи. Все таки достаточно быстро.

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


 
Serginio   (2003-05-22 12:51) [1]

Помогите ссылочками на механизмы транзакций и отката. Впринципе знаю как сделать, но чужой опыт не помешает.


 
Alexandr   (2003-05-23 07:31) [2]

а зачем это все?


 
гончий   (2003-05-23 08:41) [3]

Правильно делает, что пишет, это, кстати, очень интересная область в программировании(мне нравится)


 
Alexandr   (2003-05-23 08:56) [4]

чем бы дитя не тешилось...


 
Serginio   (2003-05-23 13:22) [5]

2(Alexandr)
А хотелось уйти от реляционных баз с их нормализацией. И посмотреть на возможную скорость. Определенного результата добился, причем в лучшую сторону.Если учесть, что потратил всего 2 недели получилось не совсем уж и плохо. Надоело работать с закрытым кодом. А применение хранение любой иерархической информации где реляционные БД не совсем пригодны, а Streama не совсем хватает,от IStorage тоже не в восторге.


 
Alexandr   (2003-05-23 13:39) [6]

ну-ну... На 10 записях быстро работает? а на мильёне?
Где ты закрытый код увидел? Firebird


 
Serginio   (2003-05-23 13:41) [7]

Запись милион записей 7 секунд чтение 1 секунда.


 
Danilka   (2003-05-23 16:13) [8]

Интересно, записал, посмотрю на выходных что это за зверь.
Только, на сайте глюк какой-то с кнопкой "скачать файл", полностью закачался только на 4-й раз, первый раз - только 100 килобайт, второй и третий раз вообще файл не залился. Никаких сообщений, никаких ошибок, спрашивает, куда файл положить и отрубается. И это при том, что у меня даже не выделенка - сам провайдер.
Лучше-бы просто ссылка на файл была.


 
Serginio   (2003-05-23 16:21) [9]

Да там не очень хорошо со скачиванием. Но исторически так сложилось, что свои разработки храню там, хотя 1С уже и не пахнет.


 
iZEN   (2003-05-23 16:35) [10]

Почему бы не обратить внимание на Borland JDataStore6?


 
Serginio   (2003-05-23 16:45) [11]

А сколько Borland JDataStore6 весит. Ява машина. Я не совсем правильно выразился насчет БД. Но это скорей не БД а хранилище аналог IStorage но работа с ней как с БД. Если прикрутить транзакции и индексы, что не очень трудно есть альтернативный способ хранения данных (не обязательно промышленных объемов хотя и это возможно). А занимает она копейки.


 
Zacho   (2003-05-23 17:06) [12]


> Serginio (23.05.03 16:45)

Вот с полноценными транзакциями - самые большие проблемы и возникнут.


 
Serginio   (2003-05-23 17:17) [13]

>Zacho © (23.05.03 17:06)
По этому то и задал этот вопрос в Serginio (22.05.03 12:51).
Мое видение транзакций. Так как я веду запись через посредника и зная смещение в файле записываемого буфера я могу считать старое значение и в отдельный файл записать смещение,размер,стараязапись. Если транзакция откатилась зная предысторию вернуть все обратно. Но это самый элементарный подход. Пока о многопользовательском режиме не думаю. Но MultiReadWriteExclusive для данных скоростей вполне подходит.


 
Zacho   (2003-05-23 17:29) [14]


> Serginio (23.05.03 17:17)

Извини, честно говоря сейчас лень вникать, но мне кажется, что ты задумываешь нечто типа версионности. Если это так, то посмотри на http://www.ibase.ru/develop.htm статьи об архитектуре InterBase и транзакциях. Еще можешь посмотреть исходники IB/FB - ссылки там же, на www.ibase.ru
И подумай, осилишь ты примерно такое или нет. Если осилишь - новый кайфный версионник может получиться :-)


 
Zacho   (2003-05-23 17:38) [15]

Немного добавлю.
В однопользовательском режиме транзакции не очень-то и нужны, а как потребуется многопользовательский, так и начнется... Подумай, как (и какие) у тебя будут работать уровни изоляции транзакций. И т.д. и т.п. Вобщем, это далеко не тривиальная задача. Но очень интересная :)


 
Serginio   (2003-05-23 17:47) [16]

2(Zacho ) Это как раз все понятно.Правда MultiReadWriteExclusive снимает всю сложность. Работая напрямую с файлами 1С и перелопачивая милионы записей задержка в несколько секунд не такая уж и значительная (Если учесть скорость работы 1С). А одновременные транзакции сами очень сильно тормозят. Большое спасибо за совет. А в однопользовательском режиме транзакции нужны для отката сделанных изменений.


 
Zacho   (2003-05-23 17:59) [17]

> Serginio (23.05.03 17:47)
> А в однопользовательском режиме транзакции нужны
> для отката сделанных изменений.

Нет, imho для этого транзакции (по крайней мере то, что под ними понимается в РСУБД) не нужны. Для этого достаточно механизма типа CachedUpdates, который на порядок проще.

А все-таки, если заинтересуешься, почитай о архитектуре IB. Тем более, что и исходники доступны, а тема действительно очень любопытная. Заодно можешь почитать что-нибудь о архитектуре блокировочников - MS SQL и т.п. Но на это ссылки дать не могу, не знаю.
Будет очень интересно посмотреть, как ты реализуешь транзакции.


 
Serginio   (2003-05-23 18:12) [18]

CachedUpdates хорош, тогда когда это касается только одной таблицы. Когда на основании этих данных модифицируется множество других таблиц, как раз и нужен механизм отката. Вообще множественного чтения и записи впринципе осуществима, но и очень затратна по времени. Вот здесь и нужен выбор между MultiReadWriteExclusive. Что в итоге окажется быстрее. Есть еще один подводный камень множественного чтения и записи это индексы.
Тоесть при модификации читающая сторона должна всегда помнить, что считаная страница может быть недействительна. Итд итп.
Я за MultiReadWriteExclusive практически полное решение всех проблем. А задержка при данных скоростях минимальна. Возможно прекращение длительного чтения с востановлением данных при повторном чтении.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.025 c
1-34832
TCrash
2003-05-30 08:13
2003.06.12
Без форм


14-35010
nick-from
2003-05-26 14:10
2003.06.12
Текст простой игрушки


3-34708
Weare
2003-05-22 15:56
2003.06.12
Непонятный глюк у TTable


14-34995
Vitas2
2003-05-26 13:19
2003.06.12
SQL


1-34871
АЛЕКС
2003-05-31 12:30
2003.06.12
МЕНЮ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский