Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Помогите правильно организовать структуру и выборку.  [new]
ilw
Member

Откуда:
Сообщений: 7
Сразу предупреждаю, я полный нуб, объясняю как могу.

Например имеется абстрактное устройство, будем называть классом Device и задачи для него: Task1, Task2, Task3.
Для конкеретизации, опишу все в java кодах.
class Device{
        long id;
        String name;
        int ip;
        int filed1;
        String filed2;
        // и так далее
    }
    
    class Task1 {
        long id;
        long device_id; // id от класса Device
        int type = 1;
        int action1;
        int action2;
        int action3;
        // действия и их количество абсолютно разные во всех Тасках, то есть таски абсолютно разные.
    }

    class Task2 {
        long id;
        long device_id; // id от класса Device
        int type = 2;
        int anotherAction1;
        int anotherAction2;
        int anotherAction3;
        int anotherAction4;
        int anotherAction5;
        int anotherAction6;
        // действия и их количество абсолютно разные во всех Тасках, то есть таски абсолютно разные. 
    }

    class Task3 {
        long id;
        long device_id; // id от класса Device
        int type = 3;
        int yetAnotherAction1;
        int yetAnotherAction2;        
        // действия и их количество абсолютно разные во всех Тасках, то есть таски абсолютно разные.  
    }

Далее, для каждого девайса назначаются определенное количество тасков, как с различающийся классов, так и с одинаковых. Напр.

//псевдокод
Device device1 = new Device(.....);
// Перечень тасков для девайса 1 (Любые комбинации, любое количество)
new Task2
new Task2
new Task1
new Task3


Device device2 = new Device(.....);
// Перечень тасков для девайса 2 (Любые комбинации, любое количество)
new Task1
new Task3

Device device3 = new Device(.....);
// Перечень тасков для девайса 3 (Любые комбинации, любое количество)
new Task1
new Task3
new Task1
new Task3
new Task1
new Task3
new Task1
new Task3
new Task1
new Task3
// и так далее


Я создал таблицу Device со всеми нужными полями, а вот как все это правильно сохранить в базу данных - пока не знаю.
Предположу что
- нужно создавать еще таблицы: Task1, Task2, Task3 ?
- (при сохранении) в эти определенные таблицы заносить таски, Device.id которых соотвутсвует Task.device_id и порядок их выполнения ?
- (при загрузке) делать выборку со всех таблиц Device, Task1, Task2, Task3 - и проверять из каждого таска, равен ли Device.id = Task1.device_id AND Device.id = Task2.device_id AND Device.id = Task3.device_id ?

Во первых, правильное ли предположение, правильная ли организация структуры базы данных или ....?
Если да, как правильно делать оптимизированную выборку с нескольких таблиц, напишите sql запрос, если можно..
12 янв 18, 18:51    [21102770]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
Добрый Э - Эх
Guest
ilw,

а если завтра появятся такси 5,6,7 , а послезавтра ещё и 8,9,10- будешь ещё таблиц клепать?
А как потом планируешь выгребать данные из них?

Логичнее было бы сделать на все таски одну таблицу, в которой будут поля id-девайса, id-таска и прочие атрибуты именно таска. На экшины внутри таска сделать другую таблицу (id-таска, id-экшина, прочая атрибутика экшинов). Сами девайсы - в третьей таблице....

Тогда всё красиво ляжет на линейные запросы с (внешними) джойнами .

Модератор: Тема перенесена из форума "SQLite".
12 янв 18, 19:05    [21102800]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
ilw
Member

Откуда:
Сообщений: 7
Спасибо, надо все обмозговать.
А вы, примерчик, если не трудно можете набросать?
12 янв 18, 19:13    [21102827]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
SERG1257
Member

Откуда:
Сообщений: 2523
Ищите на этом форуме по слову "наследование"
Варианты решения для двух тасков
С одной общей таблицей (таски скорее общие, чем разные)
С двумя таблицами (таски скорее разные, чем общие) - ваш вариант
С тремя таблицами (с одним родителем) - некий гибридный вариант

Кроме того есть бесструктурные варианты
EAV - структура базы понятна только приложению
и CLOB (xml или JSON) - каждый таск хранится в виде объекта целиком

Каждый вариант имеет свои достоинства и недостатки.

ilw
А вы, примерчик, если не трудно можете набросать?
Здесь же поиск по слову EAV
12 янв 18, 19:34    [21102896]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
ilw
Member

Откуда:
Сообщений: 7
Спасибо, из этого https://m.habrahabr.ru/post/28023/ мне что-то подойдёт?
12 янв 18, 21:51    [21103342]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
SERG1257
Member

Откуда:
Сообщений: 2523
ilw
Спасибо, из этого https://m.habrahabr.ru/post/28023/ мне что-то подойдёт?
Те же яйца, вид сбоку.
Строковые параметры для объектов = CLOB (xml или JSON)
Параметры всех объектов в одной таблице = С одной общей таблицей
Каждый объект в своей таблице = С двумя таблицами
Параметры объектов в отдельной таблице = EAV
Каждый параметр объектов в отдельной таблице = С тремя таблицами

Чтобы выбрать оптимальный способ нужно знать вы будете свою базу использовать (сейчас и потом).
Достань все свойства у одного объекта (таски у дивайса) - запрос тривиальный и ВСЕ структуры его выполняют хорошо.
12 янв 18, 22:30    [21103467]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30818
2ТС: Не вздумайте хранить (числа, даты) параметры в строчных полях. Это приведет к катастрофическим тормозам.
Сделайте для всех типов (целое, флоат, строка, дата, булеан пр.) отдельные поля.
Тогда по ним можно и джоины делать и сложный поиск.
14 янв 18, 20:54    [21105983]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34110
ilw

Я создал таблицу Device со всеми нужными полями, а вот как все это правильно сохранить в базу данных - пока не знаю.


Так Hibernate же, если уж ты Java-парень...
15 янв 18, 11:58    [21107010]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34110
ilw
    
    class Task1 {
        long id;
        long device_id; // id от класса Device
        int type = 1;
        /////////////////////////////////////////// 
        int action1;
        int action2;
        int action3;
        // действия и их количество абсолютно разные во всех Тасках, то есть таски абсолютно разные.
        /////////////////////////////////////////// 
    }

    class Task2 {
        long id;
        long device_id; // id от класса Device
        int type = 2;
        /////////////////////////////////////////// 
        int anotherAction1;
        int anotherAction2;
        int anotherAction3;
        int anotherAction4;
        int anotherAction5;
        int anotherAction6;
        // действия и их количество абсолютно разные во всех Тасках, то есть таски абсолютно разные. 
        /////////////////////////////////////////// 
    }



Ну моветон же, даже в Java.
В СУБД это называется нарушение 1-ой нормальной формы...
в Java не знаю как называется, наверное, просто идиотизм.
15 янв 18, 12:00    [21107025]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
ilw
Member

Откуда:
Сообщений: 7
Я все ещё не определился окончательно, каким способом воспользоваться, сейчас сижу, трачу время изучая базы данных уже основательно.

Например из этой статьи https://m.habrahabr.ru/post/28023/, я не понял как должны выглядеть таблицы "Параметры всех объектов в одной таблице", и как они отличаются от "Параметры объектов в отдельной таблице"?

> Ну моветон же, даже в Java.
Объяснись !
15 янв 18, 12:07    [21107059]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 4463
ilw
Я все ещё не определился окончательно, каким способом воспользоваться, сейчас сижу, трачу время изучая базы данных уже основательно.

Например из этой статьи https://m.habrahabr.ru/post/28023/, я не понял как должны выглядеть таблицы "Параметры всех объектов в одной таблице", и как они отличаются от "Параметры объектов в отдельной таблице"?

> Ну моветон же, даже в Java.
Объяснись !


В том смысле, что есть как минимум массивы. :-)
15 янв 18, 14:12    [21107744]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
ilw
Member

Откуда:
Сообщений: 7
Это ты к чему конкретно процитировал, выделить необходимую часть текста не судьба?

Есть массивы и дальше что?
15 янв 18, 14:42    [21107879]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
ilw
Member

Откуда:
Сообщений: 7
Наверное один с другим считает , что это
int anotherAction2;
int anotherAction3;
однотипные даные, да я просто в спешке написал инты и экшены , чтобы подчеркнуть, что классы тасков абсолютно разные, только и всего. Сами классы тасков, находятся лишь в зачаточном состоянии и абсолютно далеки от реальных. А пример дан, лишь для показания, что ОНИ СУЩЕСТВЕННО отличаются, большего знать и не надо, для того чтобы ответить на мой вопрос.

На , читай как :
вместо
int anotherAction2;
int anotherAction2;
int anotherAction3;

float somedigit;
String path;
boolean condition;
int flags;

Давай, умник один с другим - делай нормализацию и пихай в массивы разнородные типы.
15 янв 18, 14:55    [21107941]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34110
ilw,
как бы очень странно, что ты даёшь абы какие данные и хочешь услышать совет по проектированию БД под них....

типа " у меня тут есть база данных, в ней хранятся таблицы, разные, у каждой таблицы там разные атрибуты, у них разные типы данных могут быть, а как мне это лучше все организовать , в какую структуру?"

что же тебе можно ответить на такое?
16 янв 18, 00:39    [21109241]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34110
ilw
. Сами классы тасков, находятся лишь в зачаточном состоянии и абсолютно далеки от реальных. А пример дан, лишь для показания, что ОНИ СУЩЕСТВЕННО отличаются, большего знать и не надо, .


ну храни тогда все в СУЩЕСТВЕННО разных таблицах. чо...
16 янв 18, 00:42    [21109242]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
ilw
Member

Откуда:
Сообщений: 7
MasterZiv,

Товарищ, давай не разводи демогогию тут, все объяснено нормально, просто кое-кто из умников невнимателен, либо не в том направлении думает.

А кое-кто нормально воспринял инфу:
С двумя таблицами (таски скорее разные, чем общие) - ваш вариант


MasterZiv,
[Quote]
ну храни тогда все в СУЩЕСТВЕННО разных таблицах. чо...
[Quote]
Чэрэз плэчо, давай досвиданья! Иди перечитывай мой изначальный пост ещё раз, дятел.
16 янв 18, 11:47    [21109982]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
SERG1257
Member

Откуда:
Сообщений: 2523
ilw
я не понял как должны выглядеть таблицы "Параметры всех объектов в одной таблице"
Все таски со всеми свойствами всех типов хранятся в одной таблице.
create table task_properies (id int primary key, device_id int references device,
type int,
action1 int,
anotherAction1 int,
anotherAction2 int,
yetAnotherAction1 int
yetAnotherAction2 int
somedigit float,
path String,
condition bool,
flags int
)

естественно для такой структуры будут дыры (в некоторых полях будут null)
я не знаю как SQLite их хранит, возможно с этим можно боротся
Зато такая структура самая простая и быстрая особенно для тяжелых запросов типа: дай мне список дивайсов у которых множества свойств пересекается. (Задания стартовали с разницей не более 5 минут, причем первое было успешным, а второе обломалось)
Главный минус такой структуры - она принципиально ограничена количеством столбцов поэтому, чаще всего применяют гибридный вариант (с тремя таблицами = Каждый параметр объектов в отдельной таблице) вынося в общую таблицу не все, а только некоторые свойства или свойства для индексирования.
16 янв 18, 17:05    [21111562]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30818
Главный минус такой структуры....
Главный ее минус в том, что она полностью адово-бредовая. :)
На каждый тип объекта отдельную таблицу ???????? На каждый экшн отдельное поле ??? Это ад.
16 янв 18, 18:32    [21111789]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
antand
Member

Откуда: Москва
Сообщений: 584
ilw,

По сути, из того как будут использовать данные увидел только "для каждого девайса назначаются определенное количество тасков, как с различающийся классов, так и с одинаковых"

Таблица задачи (код задачи, тип)
Таблица действий по задачам(код задачи, название действия, приоритет действия внутри задачи)
Таблица устройства (код устройства,....)
Таблица применения задач в устройствах(код записи, код устройства, код задачи, приоритет)

Еще возможно пригодится таблица параметров по задачам
Но для этого лучше две таблицы.
Одной определить какие параметры бывают у каждой задачи вообще, без привязки к устройствам.
а в другой хранить значения параметров по каждой задаче для каждого устройства.

Совет, более точно определитесь с сущностями и как Вы будете работать с этими данными. От этого зависит и реализация структуры в базе и запросы на изменения и выборку.
Вам правильно указали, без этого нормальные советы в проектировании базы Вы не получите.
16 янв 18, 22:11    [21112263]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
ViPRos
Member

Откуда:
Сообщений: 8867
ilw,

Прочти что нить про описание процессов, например, http://www.mesa.org/en/B2MML.asp
16 янв 18, 22:56    [21112359]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно организовать структуру и выборку.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 4463
SERG1257
естественно для такой структуры будут дыры (в некоторых полях будут null)
я не знаю как SQLite их хранит, возможно с этим можно боротся
Зато такая структура самая простая и быстрая особенно для тяжелых запросов типа: дай мне список дивайсов у которых множества свойств пересекается. (Задания стартовали с разницей не более 5 минут, причем первое было успешным, а второе обломалось)
Главный минус такой структуры - она принципиально ограничена количеством столбцов поэтому, чаще всего применяют гибридный вариант (с тремя таблицами = Каждый параметр объектов в отдельной таблице) вынося в общую таблицу не все, а только некоторые свойства или свойства для индексирования.


Вам не сюда, вам в NoSQL, т.к. вы не можете построить реляционную модель ваших данных.
Например MongoDB.
Храните как хотите и что хотите.
Иногда по этой свалке данных можно делать запросы :-)

Когда вы "увидите" структуру данных, тогда сможете мигрировать в СУРБД, если захотите.
NoSQL затягивает :-)
17 янв 18, 05:20    [21112527]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить