powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Схема БД для соединения коммутаторов
20 сообщений из 20, страница 1 из 1
Схема БД для соединения коммутаторов
    #34749053
Hey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется сеть из коммутаторов, каждый коммутатор может быть соединен с любым числом других коммутаторов, но с каждым из них только один раз. Соединения осуществляются через порты, например, есть коммутаторы №1, №2 и №3, на порту №245 первого коммутатора присоединен порт №45 коммутатора №2, и на порту №67 первого-же коммутатора сидит коммутатор №3 через порт №59. Второй коммутатор может быть аналогично соединен с третим и т.д.

Требуется описать эти соединения, пользователи по идентификатору коммутатора должны получить список связанных с ним коммутаторов и номера портов их обоих.

В принципе у меня есть мысли как это сделать, но хотелось-бы услышать мнение других
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34749378
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком случае, чтобы нам всем не повторяться, может, стоит заранее изложить мысли, уже имеющиеся у вас?..
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34749627
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант...

Таблица 1 "Комутаторы"
- Код
и какие-то характеристики

Таблица 2 "Порты"
- Код
и какие-то характеристики

Таблица 3 "Соединения"
- Код
- Код порта
- Код комутатора

----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34749849
Mainframe_старый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
порт может принадлежать только одному коммутатору, поэтому при описании портов - связь с коммутатором. и третья табилца - просто соединение кодов портов - порт левый - порт правый.
П.С. по своему опыту - там, где речь идет об описании коммутаторов и соединений, наверняка пойдет речь в скором времени и о соединении с серверами-компьютерами и телефоными развязками, поэтому можно таблицы обобщить для более общего случая соединения копмьютеров с коммутаторами и т.п.
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34751381
Hey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, а зачем нужна таблица с портами ? Каких-то особых свойств порт коммутатора не имеет, просто известно, что такой-то тип коммутатора имеет например 28 портов.

Mainframe_старый
и третья табилца - просто соединение кодов портов - порт левый - порт правый.

тут один момент: соединение порт№56 - порт№99 то-же самое, что и порт№99 - порт№56. Первичным ключом такое не поймать.

Я мыслил это примерно так-же, но без таблицы с портами, есть таблица Соединения(КоммутаторЛевый int, НомерПортаЛевКоммутатора smallint,
КоммутаторПравый int, НомерПортаПравКоммутатора smallint), которая завязана на таблицу со списком имеющихся коммутаторов. Что-бы обойти указанный хитрый момент, хотел добавить check, что код левого коммутатора должен быть меньше кода правого. Просто такой вариант казался несколько подозрительным

Кстати действительно, вместо коммутатора может быть прицеплен какой-нибудь компьютер пользователя
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34751416
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelВ таком случае, чтобы нам всем не повторяться...

это курсовик... какие там мысли :)

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

о теории графов :)

каздый порт может быть соединент только с другим портом - концентратор это только условная группа портов

порт = нода (узел)
соединение = арка (дуга)
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34751890
Hey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BULK INSERT Ennor TiegaelВ таком случае, чтобы нам всем не повторяться...

это курсовик... какие там мысли :)

классическая задачка, давнененько не всплывала
не курсовик. А какое классическое решение ?
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34753719
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hey BULK INSERT Ennor TiegaelВ таком случае, чтобы нам всем не повторяться...
это курсовик... какие там мысли :)
классическая задачка, давнененько не всплывала
не курсовик. А какое классическое решение ?

обычно рекурсия, но зависит от рода графа...

read more about
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34754026
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Граф-то граф, но весьма специальный. Если
>порт = нода (узел)
то нет путей длинней 1, к одному порту - один провод. Как я понимаю, сабж - задание ограничение для таблицы
Код: plaintext
Соединения(КоммутаторЛевый int, НомерПортаЛевКоммутатора smallint, КоммутаторПравый int, НомерПортаПравКоммутатора smallint)
гарантирующее, что порт (Коммутатор+НомерПортаКоммутатора) появиться только один раз: либо слева либо справа. Т.е UNIQUE должен применяться к представлению, что сильно зависит от применяемой СУБД.
Например в Oracle (10g, про 11 не смотрел) можно использовать материализованные представления на предопределенных таблицах с ограничениями.
"Бухгалтерская" альтернатива
Код: plaintext
СтороныСоединений(ИДСоединения, Сторона, Коммутатор int, НомерПортаКоммутатора smallint)
таже требует ограничения "Сторон ровно две", с аналогичным исходом - сильно зависит от применяемой СУБД.
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34754127
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRКак я понимаю, сабж - задание ограничение для таблицы


да.
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34754131
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heyхм, а зачем нужна таблица с портами ? Каких-то особых свойств порт коммутатора не имеет, просто известно, что такой-то тип коммутатора имеет например 28 портов.

Mainframe_старый
и третья табилца - просто соединение кодов портов - порт левый - порт правый.

тут один момент: соединение порт№56 - порт№99 то-же самое, что и порт№99 - порт№56. Первичным ключом такое не поймать.

Я мыслил это примерно так-же, но без таблицы с портами, есть таблица Соединения(КоммутаторЛевый int, НомерПортаЛевКоммутатора smallint,
КоммутаторПравый int, НомерПортаПравКоммутатора smallint), которая завязана на таблицу со списком имеющихся коммутаторов. Что-бы обойти указанный хитрый момент, хотел добавить check, что код левого коммутатора должен быть меньше кода правого. Просто такой вариант казался несколько подозрительным

Кстати действительно, вместо коммутатора может быть прицеплен какой-нибудь компьютер пользователяКроме этого должно еще присутствовать ограничения по типу порта.
Запихнуть Ethernet в ATM порт - такие действия должны запрещаться.
Кроме этого - у некоторых портов должна быть таблица совместимости что в них можно пихать, что нельзя.

Гигабит, 100мбит, 10мбит - это все Ethernet и оно может быть воткнуто в Ethrnet порт.

Кроме этого у некоторых устройств есть один порт с разными выходами (Ethernet, AUI).
Два разных провода в эти два разъема подключить не получится.
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34755048
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для структуры:
Код: plaintext
Соединения(КоммутаторЛевый int, НомерПортаЛевКоммутатора smallint, КоммутаторПравый int, НомерПортаПравКоммутатора smallint)
объявляем логическое ограничение - Port1 <= Port2. В случае, если на вход прилетают инвертированные данные, срабатывает триггер примерно следующего вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create trigger trg_portsvalidate on dbo.portmapping for insert, update
as

update pm set device1 = i.device2, device2 = i.device1,
	port1 = i.port2, port2 = i.port1
from dbo.portmapping pm
	inner join inserted i on i.id = pm.id
where pm.port1 > pm.port2;

if @@error !=  0 
	raiserror('Duplicate ports found!',  16 ,  1 );

return;
При наличии минимального error handling данное ограничение будет работать на практ. любой нормальной СУБД.
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34755341
Hey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR
"Бухгалтерская" альтернатива

СтороныСоединений(ИДСоединения, Сторона, Коммутатор int, НомерПортаКоммутатора smallint)

таже требует ограничения "Сторон ровно две", с аналогичным исходом - сильно зависит от применяемой СУБД.

т.е. придется контролировать наличие 2 записей, описывающих соединение ? Вроде как еще проблемнее ...
Используется MSSQL

Ennor Tiegael
if @@error != 0
raiserror('Duplicate ports found!', 16, 1);

а зачем тут raiserror ? Ведь при наличии unique ограничения и так выпадет соответствующая ошибка ?

Bely
Кроме этого должно еще присутствовать ограничения по типу порта

ну в первоначальной постановке типы портов неразличались, хотя вообще этот вопрос стоит им задать
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34755446
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hey Ennor Tiegael
if @@error != 0
raiserror('Duplicate ports found!', 16, 1);

а зачем тут raiserror ? Ведь при наличии unique ограничения и так выпадет соответствующая ошибка ?Да, наверное все-таки лишний. Лучше всего использовать try...catch в коде, который делает изначальный инсерт, но это если у вас как минимум MSSQL 2005.
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34755910
Hey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael hey Ennor Tiegael
if @@error != 0
raiserror('Duplicate ports found!', 16, 1);

а зачем тут raiserror ? Ведь при наличии unique ограничения и так выпадет соответствующая ошибка ?Да, наверное все-таки лишний. Лучше всего использовать try...catch в коде, который делает изначальный инсерт, но это если у вас как минимум MSSQL 2005 .
дык клиент все равно будет обрабатывать исключение, и не важно, какой там mssql
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34755999
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hey Ennor TiegaelДа, наверное все-таки лишний. Лучше всего использовать try...catch в коде, который делает изначальный инсерт, но это если у вас как минимум MSSQL 2005 .
дык клиент все равно будет обрабатывать исключение, и не важно, какой там mssql
Клиент может обрабатывать что угодно, но по умолчанию сиквел не откатывает транзакцию, в которой произошла ошибка - чтобы он это делал, нужно включать XACT_ABORT. Если он не включен, то транзакция закоммитится, и никого не волнует, что часть инструкций в ней не прошла.

Если же все обернуть в try...catch, но эксепшен вообще не долетит до клиента - вместо этого он будет постфактум поставлен в известность о том, что в транзакции произошла ошибка и та была откачена.
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34756294
Hey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне-бы не хотелось отклоняться от темы топика, но я не понимаю, причем тут XACT_ABORT и try/catch.

По вашей схеме, вместо проверки check, на таблице висит триггер, который в случае перепутанных аргументов, вместо поднятия ошибки просто меняет местами параметры insert'a и затем производит вставку (кстати, имхо вместо after здесь больше-бы подошел instead of триггер).
В случае нарушения ограничения unique, исключение все равно должно быть отправлено клиенту, зачем-же его предварительно ловить в sql-коде сервера ?
Да и вообще, если обращения клиентов к БД будут происходить только посредством вызовов ХП (как я собственно и стараюсь всегда делать), а не непосредственного генерирования sql-кода, то эту проверку все-таки лучше именно там и производить, а на таблице оставить просто check
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34756481
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heyПо вашей схеме, вместо проверки check, на таблице висит триггерМда, позор. Забыл про table-level constraints (в общем-то, неудивительно, т.к. ни разу в жизни не пользовался):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table dbo.tbltest (
	P1 int not null,
	P2 int not null,
	constraint tbltest_pk primary key (p1, p2),
	constraint tbltest_pm check (P1 <= P2)
);
go
insert into tbltest
select  1 ,  2 ;
go
insert into tbltest
select  4 , 1 ;
go
select * from dbo.tbltest;
go
drop table dbo.tbltest;
go
Остальное, действительно, дело вкуса.
...
Рейтинг: 0 / 0
Схема БД для соединения коммутаторов
    #34757269
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hey Bely
Кроме этого должно еще присутствовать ограничения по типу порта
ну в первоначальной постановке типы портов неразличались, хотя вообще этот вопрос стоит им задатьЕще я бы к портам и устройствам добавил их состояние: В работе, отключено, на профилактике, не работает итп.
Таким образом можно метить не работающие порты и кабели с обрывом, чтобы с ними никто не пытался ничего скоммутировать.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Схема БД для соединения коммутаторов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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