powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше организовать универсальный справочник?
11 сообщений из 11, страница 1 из 1
Как лучше организовать универсальный справочник?
    #32248239
Yu13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа разработчики, прошу подкинуть какие-нибудь мысли, советы, ценные идеи по поводу реализации универсального справочника, он-же таблица, объединяющая сущности разных типов.

Пример - объекты страхования. Застрахованы могут быть любые объекты: люди, автомобили, суда, здания..., для каждого из которых существуют свои таблицы. Но требуется структура, объединяющая их.

Наверняка многие сталкивались с подобной задачей, и уже существует много ее решений хороших и разных. Мне не хочется изобретать велосипед, поэтому решил посоветоваться.

У меня имеются 2 варианта решения, Вы, наверняка уже видите их достоинства и недостатки:

1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE Spr (
	ID	bigint IDENTITY NOT NULL ,
	Name	varchar( 255 ) NOT NULL ,	 --кр. название объекта
 
	Rem	varchar( 255 ) NULL ,	 --примеч.
 
	ID_Type	bigint NOT NULL ,		 --тип объекта
 
	ID_Kontr	bigint NULL ,		 --ссылка на первую сущность
 
	ID_Komp	bigint NULL ,		 --ссылка на вторую сущность
 
	ID_Car	bigint NULL ,
	ID_Dog	bigint NULL , ...
и т.д. по количеству сущностей, объединяемых справочником
в каждой строке только одно из этих полей имеет не NULL-овое значение
	)


2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE Spr (
	ID	bigint IDENTITY NOT NULL ,
	Name	varchar( 255 ) NOT NULL ,	 --кр. название объекта
 
	Rem	varchar( 255 ) NULL ,	 --примеч.
 
	Table	varchar( 255 ) NOT NULL ,	 --назв. таблицы в которой хранится объект
 
	ID_Tab	bigint NOT NULL ,		 --ID этого объекта в этой таблице
 
	)


Буду благодорен за любые конструктивные советы и предложения. Заранее спасибо.
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32248323
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE Spr (
	ID	bigint IDENTITY NOT NULL ,
	Name	varchar( 255 ) NOT NULL ,	 --кр. название объекта
 
	Rem	varchar( 255 ) NULL ,	 --примеч.
 
             TypeID    int NOT NULL;
	)


Это базовая таблица для всех объектов. ID - ключ

Остальные поля храни в других таблицах-аттрибутах, со связью 1->1 в сторону основной.

Как потом со всем этим работать:
http://rdbms.narod.ru/article/ordb/index.html
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32249817
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Универсального не бывает, но приближенный к нему - можно. Справочник должен не только содержать все наименования и значения, но и быть удобным для использования как в других задачах проекта, так и при написании клиентской части, которая будет заниматься вводом информации. Ниже приводится приблизительная, упрощенная система и способы работы с ней. Все нижеприведенное расчитано на СУБД Oracle

Создаем три таблицы. Trees - дерево справочника. Используя его можно вывести справочник в упорядоченном виде, при этом одно наименование может находиться в разных ветвях дерева не меняя свой идентификатор (это пояснение для тех, кто захочет расположить наименование в дереве :). В таблице Names находятся все наши значения, как для дерева, так и для параметров. Таблица Params - вспомогательная, предназначена для хранения каких либо поясняющих значений, кратких наименований и прочей вспомогательной лабуды.

Create table Trees
(Tree_ID number
Owner_ID number
Name_ID number)

Create table Names
(Name_ID number
Name_Val <char type>)

Create table Params
(Owner_ID number
Par_Name_ID number
Name_ID number)

Все идентификаторы - сквозные, для присваивания идентификатора используется одна секвенция. Теперь как всю эту бесхозяйственность показать.

select T.Owner_ID, T.Tree_ID, T.Name_ID,
(select N.Name_Val from Names N
where N.Name_ID=T.Name_ID) "Name",
Level
from Trees T
start with T.Owner_ID is Null
connect by prior T.Tree_ID=T.Owner_ID


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

Ввод нового наименования осуществляется через хранимую процедуру (точнее функцию, возвращающую идентификатор).

CREATE OR REPLACE
function InsertName(
in_NewName in string) return integer
AS
ret_ID integer;
begin
select Name_ID into ret_ID
from Names
where Name_Val=in_NewName;
return ret_ID;
exception
when No_Data_Found then
select <Seq>.NextVal into ret_ID from Dual;
insert into Names values (ret_ID, in_NewName);
return ret_ID;
when Others then
<Ваши действия>
end;


Таким образом при вводе не надо искать какое либо наименование (или параметр), он будет выбираться автоматически, если существует конечно. Для быстрого поиска лучше сделать bitmap index.

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

Удачи.
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32249958
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗАЧЕМ???
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32250115
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
funikovyuri

ЗАЧЕМ???

Хороший вопрос :)

1. При наличии большого количества справочных таблиц с малым количеством строк будут быстрее отрабатываться запросы, если нам нужно использовать сразу несколько справочных таблиц, поскольку уменьшается количество считываемых блоков.
2. Уменьшается количество ХП для управления справочниками.
3. Для нового справочника не надо делать новую таблицу, ХП, клиентскую часть и т.п. (в том случае, если справочник укладывается в данную концепцию). Достаточно создать еще одну ветвь.
4. Удобный поиск по контексту наименования, поскольку искать надо не по десятку таблиц, а (всего лишь!!!) по одной, хотя и большой.

Можно еще предложить много вкусностей. Пока я слышал немного аргументов против такого справочника. Может кто выскажет?
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32250179
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. При наличии большого количества справочных таблиц с малым количеством строк будут быстрее отрабатываться запросы, если нам нужно использовать сразу несколько справочных таблиц, поскольку уменьшается количество считываемых блоков.
Я как раз прогнозирую обратной - универсальность обычно дается не просто так

2. Уменьшается количество ХП для управления справочниками.
Если получились одинаковые SP - то это один и тотже справочник

и т.д.
На самом деле это проблема не справочника. Я бы для начала уточнил формулировку вопроса - что надо - а) Стандартный набор атрибутов/сущностей/решений для написания тапичного справочника?

б) как реализовать повторное использование кода справочника(или любого другого)
Обычно это наследование + generic programming + ...
Наследование в БД - процесс исследованный
generic programming - в БД нет - это задача для CASE но лично я как это сделать пока представляю слабо
Т.е. что бы я хотел видеть в CASE - возможность использования одной модели как шаблона для другой при этом с поддержанием обратной связи :)
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32250404
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
funikovyuri

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

Какие данные используете для прогноза? Я упоминал - это СУБД Oracle. Справочник не претендует (в приведенном виде) на универсальность, но поможет объединить все однотипные данные, что в основном и требуется автору вопроса.

2. Уменьшается количество ХП для управления справочниками.
Если получились одинаковые SP - то это один и тотже справочник

Они не одинаковые. Там одна ХП на весь справочник. Конечно свои ХП для удаления и обновления.

б) как реализовать повторное использование кода справочника(или любого другого)

Не понял вопроса - какого кода? SP? DDL? И зачем его использовать?

Обычно это наследование + generic programming + ...
Наследование в БД - процесс исследованный
generic programming - в БД нет - это задача для CASE но лично я как это сделать пока представляю слабо
Т.е. что бы я хотел видеть в CASE - возможность использования одной модели как шаблона для другой при этом с поддержанием обратной связи :)

Сразу чувствуется ООП. А нафига? Все решается простыми методами, без лишних наворотов. Один раз создаются таблицы, процедуры, функции и работает без изменений. С ООП лучше заниматься написанием игр и прочей лабуды, а к базам нужно подходить со стороны SQL. Да и мыслить надо не категориями программирования а, скорее, абстрактно, как художник :)
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32250460
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Jinn:
Не понял вопроса - какого кода? SP? DDL? И зачем его использовать? - и его тоже! Основная цель большинства современных методологий программирования обеспечить повторное использование кода!

Сразу чувствуется ООП. А нафига? Все решается простыми методами, без лишних наворотов.
К сожаление данные методы хорошо накатаны только у кроликов.

С ООП лучше заниматься написанием игр и прочей лабуды, а к базам нужно подходить со стороны SQL. Да и мыслить надо не категориями программирования а, скорее, абстрактно, как художник :)
По крайней мере очень безответсвенное высказывание
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32250954
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа. А вы считаете, что описанная в топике таблица - справочник? По моему НЕТ. Это просто данные, которые ссылаются и на которые ссылаются другие данные. От поставленой задачи зависит и их организация. Может быть плоская таблица(ы), могут быть деревья, может еще чего.
В моем понимании, справочник это крайне редко изменяемая/пополняемая таблица с набором каких то констант. Валюты, единицы измерения и т.п.

А найти "универсальный" способ организации данных - тут попахивает "универсальной" базой данных - утопия ИМХО, как "универсальный" размер ботинок.
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32251215
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 funikovyuri

Не понял вопроса - какого кода? SP? DDL? И зачем его использовать? - и его тоже! Основная цель большинства современных методологий программирования обеспечить повторное использование кода!

Вопрос понятен. Что мешает использовать приведенный мною справочник в системах ERP, CRM, etc.? Что это, как не переносимость кода?

Сразу чувствуется ООП. А нафига? Все решается простыми методами, без лишних наворотов.
К сожаление данные методы хорошо накатаны только у кроликов.

Под кроликами ты понимаешь тех, кто проектирует базы данных?

С ООП лучше заниматься написанием игр и прочей лабуды, а к базам нужно подходить со стороны SQL. Да и мыслить надо не категориями программирования а, скорее, абстрактно, как художник :)
По крайней мере очень безответсвенное высказывание

Опять, двадцать пять :( Яснее можно изъясняться?

Если ты имеешь в виду подход "как художник" , то могу пояснить: проектировщик должен сразу видеть как будет работать его система, в каком направлении будет развитие. То бишь видеть картину целиком :)

А если про ООП, то могу предложить показать справочник, написанный полностью на ООП. Чтобы он мог предоставлять до 1000000 наименований.

Теоретический трындеж хорош, но заказчики требуют практических результатов :)

2 Серега

Господа. А вы считаете, что описанная в топике таблица -
справочник?

Нет :) По этой причине и предложил свой вариант решения.

А найти "универсальный" способ организации данных - тут попахивает "универсальной" базой данных - утопия ИМХО, как "универсальный" размер ботинок.

Золотые слова. Универсального и идеального в природе не существует. Моя схема может применяться во многих (но не во всех!!!) случаях и ее использование дело каждого индивидуума :)
...
Рейтинг: 0 / 0
Как лучше организовать универсальный справочник?
    #32252395
Alex_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А найти "универсальный" способ организации данных - тут попахивает "универсальной" базой данных - утопия ИМХО, как "универсальный" размер ботинок.

это точно и особенно в страховых системах (как я понял именно о такой и идет речь)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше организовать универсальный справочник?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]