Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Нужен совет - как лучше реализовать небольшую базу


Автор: suvolod 11.8.2010, 08:11
Доброе время суток. Пишу прогу-запоминалку иностранных слов (VC++ 2005). И не знаю, как лучше (правильнее) организовать словарик. Точнее, взаимодействие его с моей прогой. В словаре будет порядка тысячи слов (хотя будут словари и на 5, и на 10 тысяч слов), сам словарь хотелось-бы реализовать в виде текстового UNICODE файла - для облегчения редактирования, чтобы юзеры могли редактировать словарь в том редакторе, который им привычнее, а при необходимости использовать (импортировать) в свои собственные программы. Одним словом, основных файлов будет 2. Один - словарь, другой - файл статистики, по которому будет накапливаться кол-во правильных ответов, штрафные баллы и другая информация. 
Вопрос - как лучше реализовать взаимодействие этих файлов, в каком формате реализовать файл статистики. Без БД приходит на ум только один вариант: слова из словаря подгружаются в мою программу + открывается файл статистики. Как только выбрано очередное слово - в цикле в файле статистики ищется совпадение. Если найдено - информация об этом слове (баллы, и т.д) дописывается в соответствующую строку статистики. Если нет - создается новая запись по этому слову в файле статистики. 

Этот вариант меня смущает по нескольким причинам - на каждое слово придется использовать многократный циклический перебор по всему файлу статистики. Если замутить это на БД и делать выборку через Select, то насколько это оправдано? Ведь записей в среднем будет от 1000 до 5000... может простой перебор будет работать быстрее. И потом, надо будет программно создавать новый файл статистики (новый файл БД), прописывать его в Администрирование -> Источники данных (ODBC) и т.д. Как я понимаю, у юзера должна быть поддержка БД, а вдруг ее нет (соответствуюещго софта не установлено)... получается моя программа вообще не заработает.

P/S. Если в своих рассуждениях по базам данных где-то сморозил глупость - не пинайте сильно. Что такое реляционная БД и основные термины знаю, но опыта практического использования почти нет ... разве что пара лаб в институте, да и то на Делфи. 

Автор: baldina 11.8.2010, 09:08
Цитата

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

необязательно.
допустим, в памяти хранится множество слов с атрибутами. слова - из словаря, атрибуты - из статистики.
Т.е. вообще всю информацию можно хранить в одном файле: одна строчка - одно слово плюс статистика.
Правда, пользователь эту статистику тоже сможет видеть и редактировать.
Т.е. в памяти получается структура типа std::map<слово,атрибуты>, в файле слово представлено строкой вида
<слово> <кол-во правильных ответов> <штрафные баллы>...
Если нужно статистику хранить раздельно по каждому случаю и иметь возможность обработки, можно иметь не один набор атрибутов, а их список. Хранение такое же, в одном файле. В этом случае в памяти что-то типа
std::map<слово,std::list<атрибуты>>, в файле
<слово> {<кол-во правильных ответов> <штрафные баллы>...},{<кол-во правильных ответов> <штрафные баллы>...}...

если обработка требуется серьезная, можно и легкую БД использовать, например http://ru.wikipedia.org/wiki/SQLite.

Добавлено через 5 минут и 10 секунд
кстати, если однозначно нужно разделить словарь и статистику, а статистику очень хочется хранить в порядке поступления, можно сделать следующее: в памяти организуется по второму варианту. в файлах хранится раздельно. во время работы статистика дописывается в память, записи помечаются как новые. при выходе новые записи дописывается файл статистики.

Автор: djamshud 11.8.2010, 10:40
suvolod, не нужно перебирать все и вся. Используйте деревья или хеши. Хорошо подобранное и сбалансированное дерево подойдет лучше всего.

Автор: suvolod 11.8.2010, 11:58
Спасибо за ответы. Для себя я понял главное - что реализовать такой проект можно и без привлечения БД. Во всяком случае, предостережений на этот счет от вас не было. Статистику я действительно хотел хранить отдельно. Во первых, чтобы не засорять словарь - он будет простого и понятного формата типа 

на русском|на китайском|транскрипция

А статистика будет создаваться на каждого пользователя отдельно. А чтобы для корректировки обычным юзером она была недоступна - создам байт-файл (а не текстовой), ну и плюс к этому небольшая шифровка - проXORю, например. Уменьшить количество переборов я хотел за счет того, что файл статистики буду создавать в виде заранее отсортированного списка. Поиск по нему быстрее.. Хотя покурю информацию и про хеши с деревьями - если алгоритмы будут не очень сложными в реализации, можно попробавать и что-то из этого.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)