Главная страница
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.017 c
11-1203125531
Dodfr
2008-02-16 04:32
2009.06.21
WMI and ActiveKOL


15-1239988307
_VirEx_
2009-04-17 21:11
2009.06.21
Беспроводная зарядка


2-1240933165
@!!ex
2009-04-28 19:39
2009.06.21
ShortString в С++


15-1239913802
Юрий
2009-04-17 00:30
2009.06.21
С днем рождения ! 17 апреля 2009 пятница


2-1240905683
Sowyer
2009-04-28 12:01
2009.06.21
Вопрос по Edit