Форум: "Начинающим";
Текущий архив: 2012.03.11;
Скачать: [xml.tar.bz2];
Внизорганизация работы с таблицами Найти похожие ветки
← →
_qwerty_ (2011-11-30 18:36) [0]Есть 2 таблицы:
Таблица: Groups
поля таблицы: Id - идентификатор товарной группы, Name - название группы;
данные таблицы:
16191 Шины
16192 Диски
16193 Колпаки
-------------------------------------------------------------------------
Таблица: Group_[Id], где Id - идентификатор товарной группы из таблицы Groups (например, Group_16191)
поля таблицы: GoodId - идентификатор товара, принадлежащего данной товарной группе, [поля, который пользователь создает самостоятельно, например: field1, field2, field3]
данные таблицы:
1 "Значение поля 1" "Значение поля 2" "Значение поля 3"
2 "Значение поля 1" "Значение поля 2" "Значение поля 3"
3 "Значение поля 1" "Значение поля 2" "Значение поля 3"
логика: когда в таблицу groups добавляется новая запись (товарная группа), автоматически создается таблица в имени которой присутствует идентификатор добавленной записи (group_16191, group_16192, group_16193, ...). дальше для этой таблицы пользователь в приложении может создать несколько полей.
задача: в ком-сервер добавить метод, который бы для указанной товарной группы, возвращал бы значение заданного поля для указанного товара;
примерный алгоритм:
function GetFieldValue(AGroupId, AGoodId: Integer; const AFieldName: string): Variant;
begin
// Проверяю, чтобы в таблице Groups существовала запись с Id = AGroupId
Assert(FGroupsTable.FindKey([GroupId]));
// Создаю и открываю таблицу
GroupXTable := TDBISAMTable.Create;
GroupXTable.DatabaseName := FDatabaseName;
GroupXTable.SessionName := FSessionName;
GroupXTable.TableName := Format("group_%d", [AGroupId]);
GroupXTable.Open;
// Проверяю, чтобы в ней существовал товар с GoodId = AGoodId.
Assert(GroupXTable.FindKey[AGoodId]));
// возвращаю результат
Result := GroupXTable.FieldByName(AFieldName).Value;
end;
нужно написать быстрый алгоритм, как лучше всего организовать работу с таблицами? будет ли правильно не создавать каждый раз при вызове GetFieldValue таблицу GroupXTable, а создавать единожды и сохранять открытой в списке (TList), при каждом вызове GetFieldValue проверять, если таблица с таким имененем есть в списке обращаться к ней, иначе создавать и добавлять в список.
← →
Ega23 © (2011-11-30 19:57) [1]Будет правильным пересмотреть структуру базы.
← →
Сергей М. © (2011-11-30 20:17) [2]
> поля, который пользователь создает самостоятельно
Программиста, допустившего такое - сразу на костер.
← →
KilkennyCat © (2011-11-30 20:31) [3]
> Сергей М. © (30.11.11 20:17) [2]
За что? это же офигительно! Тут может стока каки получится, что вздрогнут все и вся.
> _qwerty_
в базу только записи добавляются. эти поля - свойства товара, что-ли?
ну дык сделай таблицу свойств, и добавляй туда записи.
← →
_Юрий (2011-11-30 21:08) [4]
> будет ли правильно не создавать каждый раз при вызове GetFieldValue
> таблицу GroupXTable, а создавать единожды и сохранять открытой
> в списке (TList), при каждом вызове GetFieldValue проверять,
> если таблица с таким имененем есть в списке обращаться
> к ней, иначе создавать и добавлять в список.
Почему бы и нет. Только размер списка следует ограничить, чтобы он не рос бесконечно. Например, все время держать его сортированным по времени последнего обращения, при добавлении новых элементов при переходе за какое то количество удалять тот, который дольше всех не использовался.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.03.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c