Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.48 MB
Время: 0.006 c
15-1239276494
Tenebrae
2009-04-09 15:28
2009.06.21
экспорт СМС


13-1124000957
cherrex
2005-08-14 10:29
2009.06.21
COM и .NET


4-1211524411
MishaLukash
2008-05-23 10:33
2009.06.21
региональные стандарты - разделитель целой и дробной части


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


2-1240482954
Franzy
2009-04-23 14:35
2009.06.21
Запускаю из среды - нет ошибки. Запускаю ехе - есть :(((





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский