Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.21;
Скачать: CL | DM;

Вниз

Проектирование БД, часть 2   Найти похожие ветки 

 
DynaBlaster   (2009-04-15 16:08) [0]

Уже задавал вопрос здесь: http://delphimaster.net/view/15-1239290520/

Сейчас требуется сформулировать более конкретно...

Допустим, имеем устройства, работающие по протоколу UDP/IP и устройства, работающие по COM-порту. Информацию о данных устройствах нужно хранить в базе данных. Информацию об открытых интерфейсах тоже.

По результатам прошлой ветки решение вроде бы приблизительно такое:

Открытые порты:

table PortList (
 ID,
 TypePort,
 Name,
 Desc
)

table COMPorts (
 PL_ID,
 PortName,
 PortSpeed
)

table UDPPorts (
 PL_ID,
 LocalPort
)

То есть, список открытых портов (а их бывает 2 вида) разнесен на 3 таблицы, как и советовали.

Проблемы: неудобно выбирать информацию об определенном порте по ID. Сначала нужно лезть в таблицу PortList, узнавать TypePort - в зависимости от этого лезть или в таблицу COMPorts, или в таблицу UDPPorts для определения свойств. Два независимых запроса и средствами SQL одним запросом никак не выберешь?

Устройства:

еще 3 таблицы добавляется (список устройств, COM-устройства, UDP-устройства):

table DeviceList (
 ID,
 PORT_ID,
 Name,
 Desc
)

table UDPDevices (
 DL_ID,
 RemoteHost,
 RemotePort
)

И тогда совсем неудобно... Например, чтобы узнать через какой порт локальный (com или udp) идет общение с устройством с неким DEV_ID, надо:

1) запрос в DeviceList, чтобы узнать PORT_ID - идентификатор локального порта открытого

2) запрос в PortList чтобы по PORT_ID узнать какого типа устройство, чтобы обратиться в таблицу COMPorts или UDPPorts

3) запрос в COMPorts или UDPPorts для определения свойств локального порта.

Получается аж три запроса последовательных, которые нельзя объединить средствами SQL :(

Есть мысли по оптимизации?


 
clickmaker ©   (2009-04-15 16:24) [1]

> Получается аж три запроса последовательных, которые нельзя
> объединить средствами SQL

можно
select port_id,
(case when COMPorts.PL_ID is null then "UDP" else "COM" end) as PortType
from DeviceList
left join COMPorts on DeviceList.port_id = COMPorts.PL_ID
left join UDPPorts on DeviceList.port_id = UDPPorts.PL_ID
where DeviceList.Name = "COM1"

если связка по ID, конечно


 
Sergey13 ©   (2009-04-15 16:31) [2]

> [0] DynaBlaster   (15.04.09 16:08)
> Получается аж три запроса последовательных, которые нельзя объединить средствами SQL

Ну и что? Три простых иногда лучше одного объединенного.

В предыдушем топике был не один вариант. Прикинь что получится если сделать по другому.


 
test ©   (2009-04-15 16:35) [3]

Мартин Грубер "Понимание SQL" страниц где то 300


 
Real ©   (2009-04-15 17:24) [4]

Вот вам пример одного запроса:

select *
from
  PortList, COMPorts, UDPPorts
where  
  COMPorts.PL_ID=PortList.ID and
  UDPPorts.PL_ID=PortList.ID and
  PortList.ID=<искомый ID>

Это общий вид, подкорректируйте после select имена тех полей, что нужны для выборки. Там же можно задать и алиасы для полей с помощью AS


 
имя   (2009-04-16 01:20) [5]

Удалено модератором


 
имя   (2009-04-16 01:23) [6]

Удалено модератором


 
Кщд   (2009-04-16 14:51) [7]

>Real ©   (15.04.09 17:24) [4]
этот запрос всегда будет возвращать пустой resultset


 
test ©   (2009-04-16 16:01) [8]

Кщд   (16.04.09 14:51) [7]
Связь таблиц по ключам будет давать пустой результирующий набор? Что то новенькое!


 
tesseract ©   (2009-04-16 16:08) [9]


> Связь таблиц по ключам будет давать пустой результирующий
> набор?


Там поля отбора не указаны, запросто пустой вернёт.


 
test ©   (2009-04-16 16:11) [10]

tesseract ©   (16.04.09 16:08) [9]
От БД зависит может и все поля, всех таблиц выгрузить.


 
test ©   (2009-04-16 16:13) [11]

tesseract ©   (16.04.09 16:08) [9]
Хотя конечно у clickmaker ©   (15.04.09 16:24) [1] более правильная организация запроса, тут он может вернуть занчение если это значение есть во всех таблицах, но не обязательно пустой ResultSet.



Страницы: 1 вся ветка

Текущий архив: 2009.06.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
15-1239459353
Nic
2009-04-11 18:15
2009.06.21
Распараллелить интернет


15-1240040122
@!!ex
2009-04-18 11:35
2009.06.21
Ищу материнку с Intel®AMT


15-1239276494
Tenebrae
2009-04-09 15:28
2009.06.21
экспорт СМС


15-1239538451
Kerk
2009-04-12 16:14
2009.06.21
.Net Compact Framework


15-1239690431
начинающий
2009-04-14 10:27
2009.06.21
Лечение вирусов на NTFS-разделах