Форум: "Прочее";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];
ВнизПроектирование БД, часть 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c