Russian Qt Forum
Ноябрь 23, 2024, 12:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Структура бд  (Прочитано 15150 раз)
ammaximus
Гость
« : Июль 29, 2014, 20:10 »

Задача такая в таблице основной параметр время, этот столбец всегда есть, он используется как уникальный ид.
Во время работы приходят пачки вида (время,название параметра,значение параметра). Если время совпадает - это одна строка. Нужно все это накапливать, а впоследствии делать запросы, получая простую таблицу где первый столбец время, а остальные те которые приходили. Также должно быть можно получить заголовки этих самых названий параметров. У меня получилась реализация с использованием alter table add column, но мне кажется это что то не то. Сейчас думаю в сторону двойного ключа, где первый столбец время, второй название параметра, а далее уже значения. Тут непонятно как сделать из этого выборку, придется много раз запрашивать.
Попробовал контейнеры, получилось treemap(time,hashmap<name,value>)  + отдельный массив уникальных name.
1. Как сделать бд
2. Как сделать контейнерами
P.s. sqlite
« Последнее редактирование: Июль 29, 2014, 20:12 от ammaximus » Записан
кып
Гость
« Ответ #1 : Июль 31, 2014, 15:25 »

Не совсем понял, но посмотрите EAV модель данных.
Записан
ammaximus
Гость
« Ответ #2 : Август 01, 2014, 19:20 »

Возможно плохо объяснил, разрешите попробовать снова.

Допустим в доме есть контроллер климата. К нему может быть подключены разные термометры, барометры, и т.д. Изначально база имеет вид
Код:
Время

В определенный момент времени издается сигнал на выполнение измерений - поскольку все датчики работают асинхронно они ответят в разное время, но ответ в пределах одной минуты для меня считается одновременным, поэтому я заранее сохраняю время выдачи сигнала и подставляю его.

Мне приходит ответ в такой форме
Код:
Термометр, 36.6
, я добавляю время, получается
Код:
10:43, Термометр, 36.6
БД должна быть хранить следующее:
Код:
Время Термометр
10:43 36.6

Проблема следующая - до выдачи сигнала мне неизвестно включен ли сейчас термометр, а также вообще что включено и т.д. Пользователь имеет право в любой момент добавить новое устройство, но в бд данные должны попадать только с того момента, как устройство прислало ответ. Необходима возможность удалять строки, более того если в столбце нет ни одного значения (все null) столбец более не нужен. Запросы к таблице должны возвращать мне такую выборку:
Код:
Время Термометр Барометр
10:43 36.6 null
10:48 36.7 180

Как то не довелось работать с БД ранее, вопрос вроде должен быть простой, из разряда как правильно организовать связь таблиц и запрашивать к ним. Я пока сделал в лоб - с помощью одной таблицы и ALTER TABLE ADD COLUMN. Но мне кажется, что можно как то сделать через связанные таблицы.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 04, 2014, 07:26 »

А как тебе такой вариант:

TimeDeviceValue
10:43barometer100
10:48thermometer180
10:48barometer120
« Последнее редактирование: Август 04, 2014, 07:28 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ammaximus
Гость
« Ответ #4 : Август 04, 2014, 11:26 »

Думал об этом, а как сделать запрос к этой таблице, чтобы получить результат в той форме как я писал и не будет ли это слишком долго?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Август 04, 2014, 11:37 »

Про результат немного не понял - повтори.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ammaximus
Гость
« Ответ #6 : Август 04, 2014, 12:06 »


Запросы к таблице должны возвращать мне такую выборку:
Код:
Время Термометр Барометр
10:43 36.6 null
10:48 36.7 180
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Август 04, 2014, 12:08 »

А зачем выборка такого плана? Объясни ее суть.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Август 04, 2014, 12:16 »

Я не силён в БД, но обычный group by, разве не подойдёт?
Записан
Bepec
Гость
« Ответ #9 : Август 04, 2014, 12:17 »

Ну если со стороны быстро взглянуть - вам просто 2 таблицы нужны. Барометра и Термометра.
Код:
Таблица baro
time  Value.
Таблица termo
Time Value.

А потом делать выборку типа такой
Псевдокод!!!
Код:
Select baro.Time, baro.Value, termo.Value from baro, termo where baro.time = termp.time;
Тут не учитывается вариант что данные об одном времени отсутствуют в одной из таблиц. Но это я не помню как по условиям ставится :/
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Август 04, 2014, 12:21 »

Bepec, не канает, у него могут подключаться новые девайсы.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #11 : Август 04, 2014, 12:26 »

Не канает по причине что параметров может быть больше 2 и запрос придётся менять. Но универсализма тут мы не добьёмся на мой взгляд.
Сделать по таблице на каждый вид параметра и потом поступить как предлагает  __Heaven__ - а именно
Код:
select * from baro, termo, hermo group by time

PS ххы, а ведь и получается универсализм. Если бд позволяет получить список таблиц, запрос мы можем сформировать динамически и в результате по идее получаем нужную нам выборку из N таблиц/параметров.
Записан
ammaximus
Гость
« Ответ #12 : Август 04, 2014, 12:26 »

А зачем выборка такого плана? Объясни ее суть.
Эти данные я планирую записать в файл формата csv.
Цитировать
Я не силён в БД, но обычный group by, разве не подойдёт?
Может и так, но у меня не получилось.

Цитировать
Ну если со стороны быстро взглянуть - вам просто 2 таблицы нужны. Барометра и Термометра.

Понадобится N таблиц, т.к. девайсов может быть много. Решение с созданием таблиц ничем не лучше alter table.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #13 : Август 04, 2014, 12:31 »

Если устройства могут добавляться, то:
1) сначала базу можно опросить на уникальность устройств
2) Сделать запрос для каждого устройства, при этом в заголовке колонки можно записать его имя
3) Объединить таблицы по колонке время.

2 и 3 имею в виду, что нужно написать в одном запросе
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Август 04, 2014, 12:32 »

Получить список таблиц - костыльно.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.