powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужна критика к спроектированной структуре БД
20 сообщений из 20, страница 1 из 1
Нужна критика к спроектированной структуре БД
    #33850377
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пояснения к рисунку.
1. Кабельная линия состоит из сегментов и соединяющих их муфт.
2. N принадлежит множеству натуральных чисел.
Задача.
Нужно хранить информацию о структуре КЛ в БД
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33850381
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рисунок:
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33850388
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предполагаемое решение. Пояснения:
CL - кабельная линия
CLOrder - порядок сегментов в КЛ
CLS - сегмент кабельной линии
Muff - муфта
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33850391
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мне подсказывает, что это не идеальный вариант... Покритикуйте конструктивно, пожалуйста.
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33850413
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что вы хотите в результате получить?...
Какими запросами вы эти таблицы нагружать будите?
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33850415
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это газопровод в Европу мимо Украины?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33850731
Фотография !!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я начал бы с такой структуры
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33850962
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123это газопровод в Европу мимо Украины?

газ качают по трубам, по кабелям качают электричество

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

зы

а что - из одной муфты два кабеля не бывает? как ветвятся электросети?
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33850971
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BULK INSERT
а что - из одной муфты два кабеля не бывает?

простите - сработал стереотип - имелось в виду "больше двух кабелей"
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33851101
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanА что вы хотите в результате получить?...
Какими запросами вы эти таблицы нагружать будите?
1. Сохранять КЛ со всей ее структурой в БД
2. Загружать КЛ из БД.
:)
3. Ну и всякая статистика, типа, кол-во муфт на кабелях по типам и др...
Собвственно, если уточнить мой изначальный вопрос, то он прозвучит следующим образом: позволяет ли предложенная мной схема БД хранить структуру КЛ, не упустил ли что-нибудь важное?
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33851115
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodron
Собвственно, если уточнить мой изначальный вопрос, то он прозвучит следующим образом: позволяет ли предложенная мной схема БД хранить структуру КЛ, не упустил ли что-нибудь важное?
И еще: оптимальный ли это вариант, или есть более подходящие методы? Например, метод предложенный !!!. Чем он хуже/лучше?
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33852111
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без требований вариантов можно нафантазировать много.
Начните с простого:

ЭлементЛинии
------------
ЭлементИД
ЭлементТип
ОтносительныйНомер
КабельнаяЛинияИД
<Общие атрибуты обоих типов>
<Атрибуты тип Муфта>
<Атрибуты тип Сегмент>

и сформулируйте требования в виде 'чем это плохо для этой задачи?'

например -
1)часто вставляются куски линии из многих элементов - сложно поддерживать ОтносительныйНомер.
2)нужно обеспечить контроль порядка типов:
- линия начинается и кончается муфтой,
( 2 !!! Если это так, то ссылки инвертируются)
- ...
n)Состав линии в данный момент может изменять много/только одна сессия.
Если только одна то это многое упрощает.
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33856435
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR
2)нужно обеспечить контроль порядка типов:
- линия начинается и кончается муфтой,
( 2 !!! Если это так, то ссылки инвертируются)

Да, сегмент начинается и кончается муфтой, поэтому внешние ключи на муфты (idMuffS и idMuffF) я рассположил в таблице CLS.
В варианте предложенном "!!!" для таблицы "Муфта" для первой и последней муфты поля Код сегмента левого и Код сегмента правого должны быть NULL, что уже не есть гут.
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33856657
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodronКод сегмента левого и Код сегмента правого должны быть NULL, что уже не есть гут.
И чем же это не есть гуд?

goodronНужно хранить информацию о структуре КЛ в БД
Структура хранения завязывается еще и на операции с этими данными; хранить "абстрактно" - не лучшая идея. А вообще - есть одна хорошая программистская сказка.

Жила-была на свете некая железнодорожная компания, и был у нее президент. И однажды сказал президент своим подчиненным: "А зачем нам в каждом вагоне каждого пассажирского поезда туалеты? Давайте оставим туалеты только в половине вагонов, а на оставшихся сэкономим". Быстро сказка сказывается, недолго и дело делается; тут отпилили, там привинтили, сделали новые вагоны, стали считать экономию, и тут посыпались жалобы: оказалось, что комплектуя составы, некоторые посылают в путь даже и вовсе без туалетов. Осерчал президент, и дал категорическое распоряжение: рассчитывать, учитывать, и в каждом поезде чтобы половина вагонов была с туалетами. Подчиненные - делать нечего - стали считать туалеты. Но не прекратились жалобы - теперь выяснилось, что все вагоны с туалетами могут оказаться в одном конце поезда, и пассажиры из другого конца состава носятся туда-сюда по коридору, на ходу выстраиваясь в очередь. Огорчился президент, и велел: цеплять вагоны так, чтобы вагон с туалетом шел за вагоном без туалета и наоборот. Сцепщики на стациях сплюнули в сердцах, высказали все что думают по поводу нового геморроя, и - делать нечего - пошли работать. И только, казалось, все стало налаживаться - новая беда: оказалось, что как ни цепляй вагоды по очереди, а если пассажир не знает, где ближайших туалет, то в худшем случае ему придется пройти три вагона, прежде чем он найдет нужное. Эту проблему решили, казалось, легко - внутри вагонов нарисовали красивые стрелочки, показывающие направление к ближайшему туалету, но и тут вышла незадача - оказалось, что в вагонах без туалета стрелки в половине случаев указывают не на ближайший туалет, а ровно даже наоборот, и пассажиры от такого сервиса просто звереют. Совсем пригорюнился президент и сказал, уже ни на что не надеясь - нарисуйте, что ли, снаружи на вагонах стрелочки в правильном направлении, и пусть вагоны сцепляют так, чтобы все стрелочки смотрели в одну сторону - но тут сцепщики сказали, что они уже сыты по горло и если им придется еще и стрелочки выравнивать, они потребуют повышения зарплаты, а то и устроят забастовку. И, казалось, совсем уже пришел железнодорожной компании ценный зверь с голубым мехом, когда один молодой сотрудник вдруг сказал: "А что если мы разобьем все вагоны на пары, сцепим каждую пару так, чтобы туалет оказался посередине, и никогда больше не будем эти пары расцеплять?".

Мораль: о структуре объектов, удобной для последующего манипулирования.
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33857925
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
goodronНужно хранить информацию о структуре КЛ в БД
Структура хранения завязывается еще и на операции с этими данными; хранить "абстрактно" - не лучшая идея. А вообще - есть одна хорошая программистская сказка.

Спасибо, сказка действительно интересная! :)
Итак, варианты использования КЛ:
1. Создать КЛ. При создании КЛ автоматически создается один сегмент с начальной и конечной муфтой
2. Добавить сегмент в конец. Автоматически добавляется муфта. Добавленная муфта становится конечной. Стартовой муфтой для добавленного сегмента автоматически становится муфта, предыдущего сегмента.
3. Добавить сегмент в указанное место (между двумя сегментами). С сегментом добавляется муфта (стартовая), а муфта последующего становится автоматически для добавленного сегмента конечной.
4. Удалить указанный сегмент. Автоматически удаляется одна из муфт.
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33858564
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и вполне можно действовать строго по сказке.

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
SQL> create table C$Line ( line_id integer not null primary key ) ;

Table created

SQL> create table C$Muff ( muff_id integer not null primary key,
   2     line_id integer not null references C$Line ( line_id ),
   3     ordering integer default  0  not null,
   4     unique ( line_id, ordering )) ;

Table created

SQL> create table C$Seg ( muff_id integer not null primary key
   2     references C$Muff ( muff_id )) ;

Table created

SQL> create sequence C$Line_seq ;

Sequence created

SQL> create sequence C$Muff_seq ;

Sequence created

SQL> create sequence C$Seg_seq ;

Sequence created

SQL> create or replace view c$line_v as
   2     select line_id, muff_id_before, seg_id, muff_id_after
   3       from (select m.line_id, m.muff_id muff_id_before, s.muff_id seg_id,
   4         lead ( m.muff_id ) over ( partition by m.line_id order by ordering ) muff_id_after,
   5         ordering
   6       from C$Muff m, C$Seg s
   7       where m.muff_id = s.muff_id (+))
   8     where seg_id is not null
   9     order by line_id, ordering ;

View created

SQL> create or replace function C$CreateLine return integer is
   2     v_line_id integer ;
   3     v_muff_id integer ;
   4   begin
   5     insert into C$Line ( line_id )
   6       values ( C$Line_seq.nextval )
   7       returning line_id into v_line_id ;
   8     insert into C$Muff ( line_id, muff_id )
   9       values ( v_line_id, C$Muff_seq.nextval )
  10       returning muff_id into v_muff_id ;
  11     insert into C$Seg ( muff_id )
  12       values ( v_muff_id ) ;
  13     insert into C$Muff ( line_id, muff_id, ordering )
  14       values ( v_line_id, C$Muff_seq.nextval,  10  ) ;
  15     return v_line_id ;
  16   end ;
  17   /

Function created

SQL> create or replace function C$AddLastSeg ( p_line_id integer ) return integer is
   2     max_muff_ordering number ;
   3     v_muff_id integer ;
   4   begin
   5     select max ( ordering ) into max_muff_ordering
   6       from C$Muff where line_id = p_line_id ;
   7     insert into C$Seg ( muff_id )
   8       select muff_id from C$Muff
   9       where line_id = p_line_id and ordering = max_muff_ordering ;
  10     insert into C$Muff ( muff_id, line_id, ordering )
  11       values ( C$Muff_seq.nextval, p_line_id, max_muff_ordering +  10  )
  12       returning muff_id into v_muff_id ;
  13     return v_muff_id ;
  14   end ;
  15   /

Function created

SQL> create or replace function C$AddSeg ( p_muff_id_after integer ) return integer is
   2     prev_ordering number ;
   3     next_ordering number ;
   4     v_line_id integer ;
   5     v_muff_id integer ;
   6   begin
   7     select line_id, ordering into v_line_id, prev_ordering
   8       from C$Muff where muff_id = p_muff_id_after ;
   9     select min ( ordering ) into next_ordering
  10       from C$Muff where line_id = v_line_id and ordering > prev_ordering ;
  11     insert into C$Muff ( muff_id, line_id, ordering )
  12       values ( C$Muff_seq.nextval, v_line_id, ( prev_ordering + next_ordering ) /  2  )
  13       returning muff_id into v_muff_id ;
  14     insert into C$Seg ( muff_id )
  15       values ( v_muff_id ) ;
  16     return v_muff_id ;
  17   end ;
  18   /

Function created

SQL> create or replace procedure C$DelSeg ( p_muff_id integer ) is
   2   begin
   3     delete from C$Seg where muff_id = p_muff_id ;
   4     delete from C$Muff where muff_id = p_muff_id ;
   5   end ;
   6   /

Procedure created

SQL> declare
   2     line_id_1 integer ;
   3     line_id_2 integer ;
   4     muff_id_10 integer ;
   5     muff_id_11 integer ;
   6     muff_id_12 integer ;
   7     muff_id_13 integer ;
   8   begin
   9     line_id_1 := C$CreateLine ;
  10     line_id_2 := C$CreateLine ;
  11     muff_id_10 := C$AddLastSeg ( line_id_1 ) ;
  12     muff_id_11 := C$AddLastSeg ( line_id_1 ) ;
  13     muff_id_12 := C$AddLastSeg ( line_id_1 ) ;
  14     muff_id_13 := C$AddSeg ( muff_id_11 ) ;
  15     C$DelSeg ( muff_id_11 ) ;
  16   end ;
  17   /

PL/SQL procedure successfully completed

SQL> select * from C$Line_V ;

   LINE_ID  MUFF_ID_BEFORE     SEG_ID   MUFF_ID_AFTER
---------- --------------- ---------- ---------------
          1                 1            1                 2 
          1                 2            2                 5 
          1                 5            5                 8 
          1                 8            8                 7 
          2                 3            3                 4 

SQL> 
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33864689
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНу и вполне можно действовать строго по сказке.

Лихо!
Со всем разобрался, кроме вьюхи, ибо не знаю, что есть lead, over & partition by.
Схема получается совсем простой:
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33864696
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33865445
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goodronСхема получается совсем простой:
Простота здесь обладает одним важным достоинством: контроль целостности максимально прост. Достаточно контролировать условие "все муфты, кроме последней, имеют привязанный сегмент", что делается одним простым запросом, в то время как в более накрученных - и следовательно более избыточных по данным схемах - потребовались бы проверки на отсутствие циклов, развилок и разрывов.
...
Рейтинг: 0 / 0
Нужна критика к спроектированной структуре БД
    #33866185
goodron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Softwarer, большое спасибо!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужна критика к спроектированной структуре БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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