Оптимальная архитектура БД

BERK
Дата: 07.12.2002 12:37:41
Здравствуйте!

Написал базу (в общеобразовательных целях). Таблицы: Company, Person, Good,... куча справочников. Базу нормализовал, разработал тестовые приложения, проги для заполнения справочников.

Теперь, собственно, вопрос.
Как лучше организовать доступ к базе? Есть такое решение ("подсмотренное" у других): наряду с "обычными" таблицами БД, сделать еще и "форматные", т.е. те же самые по структуре, но с приставкой "F": Company-FCompany, Person-FPerson... etc. В каждую форматную таблицу добавить поле ID_Query (идентификатор запроса). Т.о., когда клиент запускает запрос, параметры запросы он ложит в форматные таблицы, оттуда же достает результат. Результаты "его" запроса отличаются от других результатов - по разным ID_Query (при формировании запроса, каждый получает свой ID). Естественно, база при работе переносит данные из "обычных" таблиц в форматные и обратно, СП "чистит" форматную часть БД от данных "умерших" клиентов и т.п.
Через провайдеры клиент "видит" только свои данные (с нужным ID_Query).

Является ли такая структура оптимальной? Или есть другие варианты построения БД? (Чтобы можно было отличать данные разных клиентов и т.п.) Использовать ли только DCOM/MIDAS (кажется, только у них есть провайдеры)? Т.к. хочу всё это хозяйство написать на CBuilder с CORBA, какую работу будет выполнять CORBA - только интерфейс СП(реализация методов) или можно как-то еще увязать ее с провайдерами, созданием бизнес-объектов на сервере и т.п.? Может есть у кого-то ссылки на сабж? (желательно, с технологиями, упомянутыми в PS: - см. ниже)

PS: Просьба не превращать топик во флейм "CBuilder vs Delphi", "CORBA vs DCOM", etc. Примем как факт: MSSQL2000 (DBMS), CBuilder (среда), CORBA (транспортный протокол), ADO (доступ к данным на клиенте), Rational Rose (бизнес-моделирование, модель классов СП, интерфейсы IDL)

PPS: Не так давно задал вопрос на форуме: "Как отписаться от темы?". Может сейчас кто-то ответит?
sparrow
Дата: 07.12.2002 18:50:09
мало иноформации для ответа на ваш вопрос.
Cat2
Дата: 07.12.2002 20:52:10
Ох как у Вас все в кучу свалено... Не удивительно, что sparrow пожаловался на недостаток информации.

Заголовок топика и его начало - про архитектуру.
Середина - про права доступа
Окончание - про клиентов

И ни на один из этих вопросов нельзя дать ответ, что мол, вот если сделать так, то система будет оптимальна.
А что такое оптимальна? Оптимальна с точки зрения скорости работы? Безопасности? Скорости написания? Удобства апгрейда? Нет рецепта по написанию базы, оптимальной во всех отношениях. Что вовсе не означает, что для конкретной задачи нельзя написать эффективную базу. Я бы лучше пользовался таким словом.

Теперь про форматные таблицы. Перемудрен огород. Ограничение доступа для разных юзеров можно сделать проще и эффективнее. У меня такое впечатление, что виденная Вами база является унаследованной от какой-то БД последовательного доступа, не поддерживавшей разграничения прав доступа. Впрочем, это могла быть и попытка написать объектную БД.

Запросы от каждого юзера отличаются друг от друга тем, что в них всегда можно проверить user_id() и определить от кого запрос. Или host_id(), для проверки машины.

На чем писать - а на чем больше нравится.
Куда выносить бизнес процессы - а фиг его знает. Тут действительно нужно знать конкретную задачу.
Тимур
Дата: 09.12.2002 09:18:42
А зачем эти F-таблицы?!!!
Дергай х.п-ры и будь счастлив.
Тимур
Дата: 09.12.2002 09:32:04
1-й вариант (Использование View)

create table FilterClassCreationLayer (
SPID int not null default (@@SPID),
BaseClass varchar(16) not null,
constraint PK_FilterClassCreationLayer primary key clustered(SPID, BaseClass)
)
go

create view FilterClassCreation
with SCHEMABINDING
as
select BaseClass
from dbo.FilterClassCreationLayer with (nolock)
where SPID = @@SPID
go

2-й вариант - использование временных таблиц
BERK
Дата: 09.12.2002 09:46:22
ОК. Действительно, сумбурно как-то получилось.

Итак, по-порядку:

1) Как построить базу, чтобы можно было выполнять запросы/ХП/смотреть вьюшки, и: результат запроса одного клиента отличался от рез-ов другого? 2Тимур: F-таблицы для того и нужны, чтобы данные копировались из "обычных" таблиц в F-таблицы, причем записи в F-таблицах под разным ID_Query. Дальше провайдер на СП возвращает данные типа: SELECT * FROM F_TABLE1 WHERE ID_Query=заданному клиентом (и клиент видит только свои данные).

2) как строить СП: просто куча провайдеров, возвращающих данные (см. п.1) или к-л другим образом (бизнес-объекты?). Методы СП просто дублируют вызов ХП/селекты из БД или делать те же бизнес-объекты со встроенной обработкой бизнес-правил ИС?

3) Критерий оптимальности: быстрота написания, легкость сопровождения/изменения (т.е. БД-только SQL-запросы, ХП и т.п. - никакой бизнес-логики!!!; СП-транспорт, обработка бизнес-правил; Клиенты-интерфейс доступа к данным, опять же никакой логики и SQL-запросов, все на вызовах ХП, методов AppServer-а)

4) используемые компоненты для сервера и клиента.
Cat2
Дата: 09.12.2002 10:29:18
По пункту 1.

Создаем таблицы

objects (userID int ,ObjectID int , ObjectName)
Detail (ObjectID int, param1, param2, param3 )

Предположим, в таблице хранятся данные по разным объектам. Каждый юзер может работать только с одним из них.

Запрос

select * from Detail join objects
on Detail.ObjectID=Objects.ObjectID
where userID=user_id()

вернет данные только по назначенному для него объекту
tygra
Дата: 09.12.2002 12:37:23
Чего-то, толи лыжи не едут, толи .... :))

Зачем вообще вот это 1) Как построить базу, чтобы можно было выполнять запросы/ХП/смотреть вьюшки, и: результат запроса одного клиента отличался от рез-ов другого? 2Тимур: F-таблицы для того и нужны, чтобы данные копировались из "обычных" таблиц в F-таблицы, причем записи в F-таблицах под разным ID_Query. Дальше провайдер на СП возвращает данные типа: SELECT * FROM F_TABLE1 WHERE ID_Query=заданному клиентом (и клиент видит только свои данные).

Объяснения не нахожу.

Откуда доступ к БД вообще производится? Из инета, по локалке, или как еще?

3) Критерий оптимальности: быстрота написания, легкость сопровождения/изменения (т.е. БД-только SQL-запросы, ХП и т.п. - никакой бизнес-логики!!!; СП-транспорт, обработка бизнес-правил; Клиенты-интерфейс доступа к данным, опять же никакой логики и SQL-запросов, все на вызовах ХП, методов AppServer-а)

Исходя из этих критериев, средний слой вообще следует исключить - дублирует сервер.


Да и не понятно, ЧЕГО ДЕЛАЕШЬ то вообще???????
BERK
Дата: 09.12.2002 13:53:07
> Объяснения не нахожу.
> Откуда доступ к БД вообще производится? Из инета, по локалке, или как еще?
Доступ по лок.сети. Объясню подробнее. Клиент на форме выбирает: показать все компании по критерию: дата регистрации после 01.01.2002. Дергает ХП - HandleQuery(12) (12-й запрос выбирает компании с заданным критерием). СП передает запрос базе и та копирует найденные компании из обычных таблиц в форматные с проставлением нужного значения ID_Query (уникально - генерируется клиентом). Дальше, с помощью провайдеров СП, клиент "видит" записи в форматных таблицах со "своим" значением ID_Query. Т.о. в своих ClientDataSet-ах клиент всегда получает данные только "своих" запросов.

Является ли такая схема оптимальной? Или есть к-л другие варианты отображения результатов запросов клиентам? Очень хотелось бы, чтобы решение было прозрачным (т.е. без излишних напрягов в коде, типа создания временных таблиц для каждого запроса, пул клиентов/запросов и т.п., т.е. аналогично провайдерам DCOM-а, но под CORBA).

> Исходя из этих критериев, средний слой вообще следует исключить - дублирует сервер.
Как раз сервер бы очень хотелось бы иметь - для хранения в одном месте бизнес-правил (БП). Если видов клиентов несколько, то искать потом и синхронизировать БП на каждом из них (например, что дата регистрации компании не может быть больше текущей даты) - не самое умное решение.

> Да и не понятно, ЧЕГО ДЕЛАЕШЬ то вообще???????
В общеобразовательных целях, т.е. для повышения квалификации делаю БД, сервер приложений и клиента к нему.
Квалификация, она всегда пригодится ;-)
tygra
Дата: 09.12.2002 14:29:46
Ну, по-порядку....
Доступ по лок.сети. Объясню подробнее. Клиент на форме выбирает: показать все компании по критерию: дата регистрации после 01.01.2002. Дергает ХП - HandleQuery(12) (12-й запрос выбирает компании с заданным критерием). СП передает запрос базе и та копирует найденные компании из обычных таблиц в форматные с проставлением нужного значения ID_Query (уникально - генерируется клиентом). Дальше, с помощью провайдеров СП, клиент "видит" записи в форматных таблицах со "своим" значением ID_Query. Т.о. в своих ClientDataSet-ах клиент всегда получает данные только "своих" запросов

Объясни тогда, зачем такая маразматическая схема? Чем плохо дернуть процедуру и показать результат?

Является ли такая схема оптимальной? Или есть к-л другие варианты отображения результатов запросов клиентам? Очень хотелось бы, чтобы решение было прозрачным (т.е. без излишних напрягов в коде, типа создания временных таблиц для каждого запроса, пул клиентов/запросов и т.п., т.е. аналогично провайдерам DCOM-а, но под CORBA).

Схема страшно неоптимальная и непонятно зачем придуманная
Почему обычный вывод из ХП - нестандартный для тебя.

Как раз сервер бы очень хотелось бы иметь - для хранения в одном месте бизнес-правил (БП). Если видов клиентов несколько, то искать потом и синхронизировать БП на каждом из них (например, что дата регистрации компании не может быть больше текущей даты) - не самое умное решение.

Ты прочитай еще раз то, что я написал:
Исходя из этих критериев, средний слой вообще следует исключить - дублирует сервер

Я как раз и написал, что сервер следует оставить а выкинуть средний слой - объясни, зачем он тебе?

В общеобразовательных целях, т.е. для повышения квалификации делаю БД, сервер приложений и клиента к нему.
Квалификация, она всегда пригодится


Нда, ну и квалификацию приобретешь с такой архитектурой