powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Упаковка для большого кол-ва маленьких таблиц
9 сообщений из 9, страница 1 из 1
Упаковка для большого кол-ва маленьких таблиц
    #32429747
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть несколько сотен dbf-файлов которые необходимо залить в базу и затем использовать как справочники. Записей в них от двух до тысячи, структура различная. В будущем будут появляться новые dbf и модифицироваться существующие. Вопрос в том, как их хранить в базе. У меня такие варианты:

1. Залить все как есть, 300 файлов - 300 таблиц. Такой вариант мне нравится меньше всего, хотя кажется наиболее рациональным для хранения и доступа к данным.

2. Конвертировать в три таблицы
Код: plaintext
1.
2.
3.
4.
  create table tab(TabId number( 4 ), Name varchar2( 32 ));                  --Список таблиц
 
  create table col(TabId number( 4 ), ColId number( 6 ), Name varchar2( 32 )); --Список полей
 
  create table Dat(ColId number( 6 ), Val varchar2( 1000 ));                --Данные

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

3. Создать штук 7 таблиц для основных типов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table tab(TabId number( 4 ), Name varchar2( 32 ));
  create table col(TabId number( 4 ), ColId number( 6 ), Name varchar2( 32 ));

  create table Dat_LText(ColId number( 6 ), Val varchar2( 1000 ));
  create table Dat_MText(ColId number( 6 ), Val varchar2( 120 ));
  create table Dat_SText(ColId number( 6 ), Val varchar2( 30 ));
  create table Dat_Date(ColId number( 6 ), Val date);
  create table Dat_Int(ColId number( 6 ), Val number( 4 ));
  create table Dat_LInt(ColId number( 6 ), Val number( 12 ));
  create table Dat_Double(ColId number( 6 ), Val number( 16 , 6 ));


Если Вы решали подобные задачи - поделитесь пожалуста соображениями.
...
Рейтинг: 0 / 0
Упаковка для большого кол-ва маленьких таблиц
    #32429776
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А данные у тя как используются потом и БД какая??
...
Рейтинг: 0 / 0
Упаковка для большого кол-ва маленьких таблиц
    #32429797
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle 9
Это справачные таблицы. Например в основной таблице поле KV - код валюты
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select kv from main_table;
KV
 -----------------------------
 
 36 
 40 
 56 

В справачной таблице соответственно записи
Код: plaintext
1.
2.
3.
4.
5.
6.
select ValId, Name from val
ValId     NAME
 -------------------------------
 
 36         Австралийский доллар
 40         Австрийский шилинг
 56         Бельгийский франк
...
Рейтинг: 0 / 0
Упаковка для большого кол-ва маленьких таблиц
    #32430402
Дамир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Справочник можно описать такой структурой:
create Table Dict( DictNo int, Key char(10), Text char(300) )
DictNo - номер справочника
Key - ключ
Text - текстовое значение для ключа
Залей дбф-ы в эту таблицу ( те, которые подходят по структуре)
Те, что не подходят - в отдельные таблицы.

PS:Можно в Dict добавить еще пару полей Attrib1, Attrib2....- тогда дбф-ов больше можно будет "подогнать" по структуре.
...
Рейтинг: 0 / 0
Упаковка для большого кол-ва маленьких таблиц
    #32431330
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то 60% этих dbf имеют уникалиную структуру. У 10% действительно структура идентичная. "Подогнать" по структуре ряд таблиц возможно, но при этом конечно получим гораздо больший объем, чем мог бы быть в действительности. Даже если все это проделать и превратить 300 таблиц в 30 - врядли получится убедить разработчиков пользоваться такой структурой хранения, так как нет четкого алгоритма поиска конкретного справочника.

-Где находится справочник такой-то ?
-Где-то в одной из этих 30 таблиц, поищите.

Да, можно создать 300 wiev, каждая из которых будет соответствовать dbf-у, но тогда это просто усложненный вариант моего способа 3.
...
Рейтинг: 0 / 0
Упаковка для большого кол-ва маленьких таблиц
    #32431470
x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x
Гость
2 zayac

А теперь попробуй напиши foreign key с рабочей таблицы на какой-либо справочник (валюту, например).

в вар 2 и 3 не получится - будешь извращаться программно
...
Рейтинг: 0 / 0
Упаковка для большого кол-ва маленьких таблиц
    #32431645
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошее замечание. Я об этом думал и пришел к выводу, что лучше наверное действительно где-то делать програмно, где-то не делать вообще. Что такое foreign key? Это индекс плюс тригер.

Тригер.
Так как рабочая таблица как правило имеет не одно поле из справочников, а несколько, то в принципе при обычной работе проблем быть не должно, но при массовых insert, update рабочей таблицы будет серьезное падение производительности. Или отключать все соответствующие тригеры, а после insert, update включать снова. Плюс создание нескольких сотен дополнительных объектов в базе скорости не прибавит.

Индекс.
Для каждого индекса будет выделен экстент, который в большинстве случаев будет заполнен лишь на несколько процентов - не рациональное использование дискового пространства. Хорошо, с этим можно мириться, но ведь эти индексы в большинстве случаев не будут использоваться! Осуществлять сканирование индекса, а потом поиск по таблице менее выгодно чем полное сканирование таблицы из пары сотен записей. В моем случае лишь несколько таблиц достигают тысячи записей.

Поправте меня, если я ошибаюсь.
...
Рейтинг: 0 / 0
Упаковка для большого кол-ва маленьких таблиц
    #32432057
Дамир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> -Где находится справочник такой-то ?
> -Где-то в одной из этих 30 таблиц, поищите.
Храни в этой же таблице "справочник справочников". Навскидку, 2 варианта
1) зарезервировать DictNo = 0 - это будет справочник справочников
insert into Dict
select 0, 1, 'справочник валют'
...
insert into Dict
select 1, 1, 'рубль'

2)
Добавляем в Dict еще одно поле RecType - тип записи
Если RecType = 1, то запись обычная (строка справочника)
Если RecType = 0, то запись хранит название справочника

Тогда: "Где находится справочник такой-то ? "
select DictNo, Text from Dict where RecType = 0

create Table Dict( DictNo int, RecType int, Key char(10), Text char(300) )
DictNo - номер справочника
RecType
Key - ключ
Text - текстовое значение для ключа
...
Рейтинг: 0 / 0
Упаковка для большого кол-ва маленьких таблиц
    #32441442
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я подобное видел, для трудноформализованных структур придумали XML, я предложу разновидность базы данных для хранения XML, адаптированую для данного случая:

имеется таблицы
справочники dictionary
элементы element
строковые атрибуты StrAttribut
числовые атрибуты NumAttribut

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
Create table [dictionary] (
	[dictionary] Bigint Identity( 1 , 1 ) NOT NULL,
	[element] Bigint NOT NULL,
	[NameDictionary] Varchar( 50 ) NULL,
Primary Key ([dictionary])
) 
go

Create table [element] (
	[element] Bigint Identity( 1 , 1 ) NOT NULL,
	[dictionary] Bigint NOT NULL,
	[parent] Bigint NOT NULL,
	[NameElement] Varchar( 50 ) NOT NULL,
Primary Key ([element])
) 
go

Create table [StrAttribut] (
	[attribut] Bigint Identity( 1 , 1 ) NOT NULL,
	[name] Char( 50 ) NULL,
	[value] Text NULL,
	[element] Bigint NOT NULL,
	[dictionary] Bigint NOT NULL,
Primary Key ([attribut])
) 
go

Create table [NumAttribut] (
	[attribut] Bigint Identity( 1 , 1 ) NOT NULL,
	[name] Varchar( 50 ) NULL,
	[value] Float NULL,
	[element] Bigint NOT NULL,
	[dictionary] Bigint NOT NULL,
Primary Key ([attribut])
) 
go

Alter table [element] add  foreign key([dictionary]) references [dictionary] ([dictionary])  on update no action on delete no action 
go
Alter table [StrAttribut] add  foreign key([dictionary]) references [dictionary] ([dictionary])  on update no action on delete no action 
go
Alter table [NumAttribut] add  foreign key([dictionary]) references [dictionary] ([dictionary])  on update no action on delete no action 
go
Alter table [dictionary] add  foreign key([element]) references [element] ([element])  on update no action on delete no action 
go
Alter table [element] add  foreign key([parent]) references [element] ([element])  on update no action on delete no action 
go
Alter table [StrAttribut] add  foreign key([element]) references [element] ([element])  on update no action on delete no action 
go
Alter table [NumAttribut] add  foreign key([element]) references [element] ([element])  on update no action on delete no action 
go

Это версия для SQL сервера

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


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