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

Вниз

Формат хранения данных в БД   Найти похожие ветки 

 
Григорьев Антон ©   (2004-07-19 16:55) [0]

Такая ситуация: есть несколько десятков некоторых параметров, которые пользователь может менять. Необходимо вести архив изменений: когда и какие параметры были изменены. В качестве БД используется ClientDataSet и локальный файл. Каждый параметр характеризуется уникальным номером. За один сеанс пользователь может изменить любое количество параметров. Нужно, чтобы одна запись в базе данных соответствовала одному сеансу, т.е. содержала информацию обо всех переметрах, изменённых пользователем за сеанс. Но таким образом, чтобы как можно легче было искать изменения конкретного параметра. Пока придумал следующее: в базу записывается строка вида "<N>=<V>{,<N>=<V>}", где <N> - номер параметра, <V> - его значение, фигурные скобки - многократное повтороение при необходимости. Тогда, зная номер параметра, с помощью LIKE можно найти все записи, в которых параметр изменялся, а дальше, с помощью парсинга, узнать его значение. А есть ли другой способ хранить подобную информацию в БД, чтобы её и искать потом можно было?


 
bushmen ©   (2004-07-19 17:01) [1]

> А есть ли другой способ хранить подобную информацию в БД, чтобы её и искать потом можно было?

Берешь СУБД. Создаешь 2 таблицы. В одну кидаешь базу, в другую изменения. Связь по уникальному номеру "Один ко Многим". Можно организовать и в файлах, но вряд ли это будет быстрее, чем SQL


 
HSolo ©   (2004-07-19 17:07) [2]

Например, так:

Таблица 1 - справочник параметров:
ID записи
Наименование
... что там еще

Таблица 2 - сеансы:
ID записи
Пользователь
... что там еще (начало/конец сеанса...)

Таблица 3 - протокол изменений параметров:
ID сеанса
ID параметра
Значение параметра (можно и старое, и новое)


 
Digitman ©   (2004-07-19 17:12) [3]


> Григорьев Антон


храни данные об изменениях в блоб-поле таблицы
за формат хранения данных в этом поле можно взять, например, XML - многие XML-парсеры при загрузке данных хэшируют имена узлов, поэтому поиск узла по имени может существенно сократить время доступа к нему


 
Григорьев Антон ©   (2004-07-19 17:20) [4]


> Digitman ©   (19.07.04 17:12) [3]


Про BLOB"ы думал, но не хватает знаний, как при SQL-запросе осуществить фильрацию по значениям, зписанным в BLOB"е. Такое вообще возможно?


 
bushmen ©   (2004-07-19 17:23) [5]

> как при SQL-запросе осуществить фильрацию по значениям,
> зписанным в BLOB"е

А зачем их в Блобе хранить? Так не помещаются?


 
Григорьев Антон ©   (2004-07-19 17:30) [6]


> bushmen ©   (19.07.04 17:23) [5]
>
> А зачем их в Блобе хранить? Так не помещаются?


Digitman [3] посоветовал. Вот я и решил уточнить.

А две таблицы, конечно, можно сделать, но никаких СУБД по ТЗ использовать мне нельзя. Поэтому я и использую ClientDataSet и внешние файлы. Можно, конечно, имитировать связи между таблицами в программе, но это будет уже не то, что в нормальной реляционной СУБД.


 
Anatoly Podgoretsky ©   (2004-07-19 17:41) [7]

Не стоит писать кучу <N>=<V>{ лучше на каждую пару отдельная запись, вот тогда сможешб делать LIKE по всей базе


 
Anatoly Podgoretsky ©   (2004-07-19 17:43) [8]

Как будешь хранить в файле дело твое, а в таблицу отдельными строками, эта пара и другие параметры, с нормализацией можешь сам решить делать ли и в каком объеме


 
bushmen ©   (2004-07-19 17:43) [9]

> но никаких СУБД по ТЗ использовать мне нельзя

Скажи мне, пожалуйста, а что, разве БД Access не удовлетворяет критерию файла? :) Имеется всего один файл с расширением mdb. Или есть еще какие-то ограничения? Напиши


 
Григорьев Антон ©   (2004-07-19 17:44) [10]


> Anatoly Podgoretsky ©   (19.07.04 17:41) [7]
> Не стоит писать кучу <N>=<V>{ лучше на каждую пару отдельная
> запись, вот тогда сможешб делать LIKE по всей базе


Тогда ни строки не нужны, ни LIKE - можно сделать поле "номер параметра" и "новое значение". Но тогда параметры, изменённые во время одной сессии, окажутся разбросанными по разным записям, чего не хотелось бы.


 
Anatoly Podgoretsky ©   (2004-07-19 17:51) [11]

Григорьев Антон ©   (19.07.04 17:44) [10]
Ну да поле параметр, только не знаю зачем тебе LIKE явно лишнее
Получишь набор по сессии/клиенту/параметру или по любым характерисиками. С моей точки зрения хранить все параметры в одном поле неправильно и неудобно для обработки.


 
bushmen ©   (2004-07-19 17:57) [12]

> окажутся разбросанными по разным записям, чего не хотелось бы.

Почему? Выборку по номеру сессии и номеру параметра.


 
Anatoly Podgoretsky ©   (2004-07-19 19:58) [13]

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


 
Digitman ©   (2004-07-20 08:19) [14]


> Григорьев Антон


действительно. если тебе в дальнейшем потребуются быстрые выборки из этой таблицы, то разумней всего сделать таблицу с такой структурой :

1. ID (счетчик) - первичный ключ
2. ClientID (dword) - вторичный ключ, ид-р клиента
3. SessionId (dword) - вторичный ключ, ид-р клиентской сессии
4. ParamId (dword) - вторичный ключ, ид-р параметра
5. NewParamValue (blob или varchar[] octets) - новое значение параметра (можно хранить значения параметров произв.типа)

Индексы
1. ID - уникальный
2. ClientID
3. SessionId
4. ParamId
5. ClientID, SessionId, ParamId - комбинированный, уникальный



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

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

Наверх




Память: 0.48 MB
Время: 0.047 c
3-1090486803
ZedeS
2004-07-22 13:00
2004.08.15
Номер строки в DBGrid


3-1090487874
Dmitriy O.
2004-07-22 13:17
2004.08.15
Как узнать прошла транзакция ?


3-1090493501
Phoenix
2004-07-22 14:51
2004.08.15
ClientDataSet и контекстный поиск


1-1091181272
Sancho
2004-07-30 13:54
2004.08.15
Хэндл, динамически загружаемый пакет


1-1091438240
Stager
2004-08-02 13:17
2004.08.15
Переход на Delphi7





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский